187 lines
6.0 KiB
YAML
187 lines
6.0 KiB
YAML
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
|