name: "Docker Build and Test" description: "Reusable action to build and test Docker images for Cal.com" inputs: platform: description: "Target platform (linux/amd64 or arm64)" required: true platform-suffix: description: "Suffix to add to image tags (e.g., -arm)" required: false default: "" dockerhub-username: description: "Docker Hub username" required: true dockerhub-token: description: "Docker Hub token" required: true github-token: description: "GitHub token for GHCR" required: true postgres-user: description: "PostgreSQL user" required: true postgres-password: description: "PostgreSQL password" required: true postgres-db: description: "PostgreSQL database name" required: true database-host: description: "Database host" required: true push-image: description: "Whether to push the built image" required: false default: "false" use-as-latest: description: "Publish as latest" required: false default: "false" runs: using: "composite" steps: - name: Log in to the Docker Hub registry uses: docker/login-action@v3 with: username: ${{ inputs.dockerhub-username }} password: ${{ inputs.dockerhub-token }} logout: true - name: Log in to the Github Container registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ inputs.github-token }} - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: | docker.io/calendso/calendso docker.io/calcom/cal.com ghcr.io/calcom/cal.com flavor: | latest=${{ !github.event.release.prerelease && inputs.use-as-latest == 'true' }} suffix=${{ inputs.platform-suffix }} - name: Copy env shell: bash run: | grep -o '^[^#]*' .env.example > .env cat .env >> $GITHUB_ENV echo "DATABASE_HOST=localhost:5432" >> $GITHUB_ENV eval $(sed -e '/^#/d' -e 's/^/export /' -e 's/$/;/' .env) ; - name: Start database shell: bash run: | docker compose up -d database - name: Show database logs and container status shell: bash run: | echo "--- Container Status ---" docker compose ps database echo "--- Container Logs ---" docker compose logs database - name: Set up Docker Buildx uses: useblacksmith/setup-docker-builder@v1 with: driver-opts: | network=container:database buildkitd-flags: | --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host - name: Build image id: docker_build uses: useblacksmith/build-push-action@v2 with: context: ./ file: ./Dockerfile load: true push: false platforms: ${{ inputs.platform }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 NEXT_PUBLIC_API_V2_URL=http://localhost:5555/api/v2 NEXT_PUBLIC_LICENSE_CONSENT=agree DATABASE_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@${{ inputs.database-host }}/${{ inputs.postgres-db }} DATABASE_DIRECT_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@${{ inputs.database-host }}/${{ inputs.postgres-db }} - name: Test runtime shell: bash run: | tags="${{ steps.meta.outputs.tags }}" IFS=',' read -ra ADDR <<< "$tags" tag=${ADDR[0]} docker run --rm --network stack \ -p 3000:3000 \ -e DATABASE_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@database/${{ inputs.postgres-db }} \ -e DATABASE_DIRECT_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@database/${{ inputs.postgres-db }} \ -e NEXTAUTH_SECRET=${{ env.NEXTAUTH_SECRET }} \ -e CALENDSO_ENCRYPTION_KEY=${{ env.CALENDSO_ENCRYPTION_KEY }} \ $tag & server_pid=$! echo "Waiting for the server to start..." sleep 120 echo http://localhost:3000/auth/login for i in {1..60}; do echo "Checking server health ($i/60)..." response=$(curl -o /dev/null -s -w "%{http_code}" http://localhost:3000/auth/login) echo "HTTP Status Code: $response" if [[ "$response" == "200" ]] || [[ "$response" == "307" ]]; then echo "Server is healthy" kill $server_pid exit 0 fi sleep 1 done echo "Server health check failed" kill $server_pid exit 1 env: NEXTAUTH_SECRET: "EI4qqDpcfdvf4A+0aQEEx8JjHxHSy4uWiZw/F32K+pA=" CALENDSO_ENCRYPTION_KEY: "0zfLtY99wjeLnsM7qsa8xsT+Q0oSgnOL" - name: Push image id: docker_push uses: useblacksmith/build-push-action@v2 if: ${{ inputs.push-image == 'true' && !github.event.release.prerelease }} with: context: ./ file: ./Dockerfile push: true platforms: ${{ inputs.platform }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 NEXT_PUBLIC_API_V2_URL=http://localhost:5555/api/v2 NEXT_PUBLIC_LICENSE_CONSENT=agree DATABASE_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@${{ inputs.database-host }}/${{ inputs.postgres-db }} DATABASE_DIRECT_URL=postgresql://${{ inputs.postgres-user }}:${{ inputs.postgres-password }}@${{ inputs.database-host }}/${{ inputs.postgres-db }} - name: Image digest shell: bash run: echo ${{ steps.docker_build.outputs.digest }} - name: Cleanup shell: bash if: always() run: | docker compose down