# This is a basic workflow to help you get started with Actions name: Build and push image to DockerHub # Controls when the workflow will run on: push: branches: - 'main' tags: - 'v*' # update on run of Update Calendso nightly submodule update workflow_run: workflows: ["Update Calendso"] branches: [main] types: - completed # Allow running workflow manually from the Actions tab workflow_dispatch: # Uncomment below to allow specific version workflow run # inputs: # version: # description: 'Version to build' # required: true # Leaving in example for releases. Initially we simply push to 'latest' # on: # release: # types: [ created ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: # Free about 4.5 GB, elminating our disk space issues tool-cache: true # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it, uncomment below # - name: Checkout code at specified version # uses: actions/checkout@v2 # with: # ref: ${{ github.event.inputs.version }} - name: checkout uses: actions/checkout@v4 - name: Git submodule update run: | git submodule update --init - name: Log in to the Docker Hub registry uses: docker/login-action@v3 with: # Username used to log against the Docker registry username: ${{ secrets.DOCKER_HUB_USERNAME }} # Password or personal access token used to log against the Docker registry password: ${{ secrets.DOCKER_HUB_TOKEN }} # Log out from the Docker registry at the end of a job logout: true # optional, default is true - name: Log in to the Github Container registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.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 # Add flavor latest only on full releases, not on pre-releases flavor: | latest=${{ !github.event.release.prerelease }} - name: Copy env 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) ; # Temporarily disable ARM build due to runner performance issues # - name: Set up QEMU # uses: docker/setup-qemu-action@v2 - name: Start database run: | docker compose up -d database - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: driver-opts: | network=container:database buildkitd-flags: | --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host # config-inline: | # [worker.oci] # max-parallelism = 1 - name: Build image id: docker_build uses: docker/build-push-action@v5 with: context: ./ file: ./Dockerfile load: true # Load the image into the Docker daemon push: false # Do not push the image at this stage platforms: linux/amd64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | NEXT_PUBLIC_WEBAPP_URL=${{ env.NEXT_PUBLIC_WEBAPP_URL }} NEXT_PUBLIC_API_V2_URL=${{ env.NEXT_PUBLIC_API_V2_URL }} NEXT_PUBLIC_LICENSE_CONSENT=${{ env.NEXT_PUBLIC_LICENSE_CONSENT }} NEXT_PUBLIC_TELEMETRY_KEY=${{ env.NEXT_PUBLIC_TELEMETRY_KEY }} DATABASE_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@${{ env.DATABASE_HOST }}/${{ env.POSTGRES_DB }} DATABASE_DIRECT_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@${{ env.DATABASE_HOST }}/${{ env.POSTGRES_DB }} - name: Test runtime run: | tags="${{ steps.meta.outputs.tags }}" IFS=',' read -ra ADDR <<< "$tags" # Convert string to array using ',' as delimiter tag=${ADDR[0]} # Get the first tag docker run --rm --network stack \ -p 3000:3000 \ -e DATABASE_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@database/${{ env.POSTGRES_DB }} \ -e DATABASE_DIRECT_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@database/${{ env.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 ${{ env.NEXT_PUBLIC_WEBAPP_URL }}/auth/login for i in {1..60}; do echo "Checking server health ($i/60)..." response=$(curl -o /dev/null -s -w "%{http_code}" ${{ env.NEXT_PUBLIC_WEBAPP_URL }}/auth/login) echo "HTTP Status Code: $response" if [[ "$response" == "200" ]] || [[ "$response" == "307" ]]; then echo "Server is healthy" # Now, shutdown the server 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: docker/build-push-action@v5 with: context: ./ file: ./Dockerfile push: true platforms: linux/amd64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | NEXT_PUBLIC_WEBAPP_URL=${{ env.NEXT_PUBLIC_WEBAPP_URL }} NEXT_PUBLIC_API_V2_URL=${{ env.NEXT_PUBLIC_API_V2_URL }} NEXT_PUBLIC_LICENSE_CONSENT=${{ env.NEXT_PUBLIC_LICENSE_CONSENT }} NEXT_PUBLIC_TELEMETRY_KEY=${{ env.NEXT_PUBLIC_TELEMETRY_KEY }} DATABASE_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@${{ env.DATABASE_HOST }}/${{ env.POSTGRES_DB }} DATABASE_DIRECT_URL=postgresql://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@${{ env.DATABASE_HOST }}/${{ env.POSTGRES_DB }} if: ${{ !github.event.release.prerelease }} - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} - name: Cleanup run: | docker compose down