name: Build and Push Image on: workflow_call: inputs: mode: description: "Build mode: 'prod' or 'pr'" required: true type: string image_repo: description: "Docker image repository (e.g., user/app)" required: false default: "lukastrkan/cc-app-demo" type: string context: description: "Docker build context path" required: false default: "7project/backend" type: string pr_number: description: "PR number (required when mode=pr)" required: false type: string secrets: DOCKER_USER: required: true DOCKER_PASSWORD: required: true outputs: digest: description: "Built image digest" value: ${{ jobs.build.outputs.digest }} image_repo: description: "Image repository used" value: ${{ jobs.build.outputs.image_repo }} jobs: build: runs-on: ubuntu-latest outputs: digest: ${{ steps.set.outputs.digest }} image_repo: ${{ steps.set.outputs.image_repo }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Compute image repo and tags id: meta env: MODE: ${{ inputs.mode }} IMAGE_REPO: ${{ inputs.image_repo }} PR: ${{ inputs.pr_number }} run: | set -euo pipefail if [ -z "${IMAGE_REPO:-}" ]; then IMAGE_REPO="lukastrkan/cc-app-demo"; fi echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_ENV SHA_SHORT="${GITHUB_SHA::12}" case "$MODE" in prod) TAG1="prod-$SHA_SHORT" TAG2="latest" ;; pr) if [ -z "${PR:-}" ]; then echo "pr_number input is required for mode=pr"; exit 1; fi TAG1="pr-$PR" TAG2="pr-$PR-$SHA_SHORT" ;; *) echo "Unknown mode '$MODE' (expected 'prod' or 'pr')"; exit 1; ;; esac echo "TAG1=$TAG1" >> $GITHUB_ENV echo "TAG2=$TAG2" >> $GITHUB_ENV - name: Build and push image id: build uses: docker/build-push-action@v5 with: context: ${{ inputs.context }} push: true tags: | ${{ env.IMAGE_REPO }}:${{ env.TAG1 }} ${{ env.IMAGE_REPO }}:${{ env.TAG2 }} platforms: linux/amd64 - name: Set outputs id: set env: IMAGE_REPO: ${{ env.IMAGE_REPO }} run: | echo "digest=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT echo "image_repo=$IMAGE_REPO" >> $GITHUB_OUTPUT