Build and Push Docker Images #16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Push Docker Images | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Image version tag (e.g., 0.1.0)' | |
| required: true | |
| default: '0.1.0' | |
| push_latest: | |
| description: 'Also tag amd64 standard image as latest' | |
| required: false | |
| type: boolean | |
| default: true | |
| env: | |
| DOCKERHUB_IMAGE: dotstartech/mqbase | |
| GHCR_IMAGE: ghcr.io/dotstartech/mqbase | |
| jobs: | |
| build-and-push: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up QEMU for multi-arch builds | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Minify app.js for production | |
| run: | | |
| npm install -g terser | |
| ORIGINAL_SIZE=$(wc -c < admin/app.js) | |
| terser admin/app.js --compress --mangle -o admin/app.js | |
| MINIFIED_SIZE=$(wc -c < admin/app.js) | |
| REDUCTION=$((100 - (MINIFIED_SIZE * 100 / ORIGINAL_SIZE))) | |
| echo "app.js: ${ORIGINAL_SIZE} bytes -> ${MINIFIED_SIZE} bytes (${REDUCTION}% reduction)" | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: docker.io | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Log in to GitHub Container Registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| # ========================================================================= | |
| # Standard image - AMD64 | |
| # ========================================================================= | |
| - name: Build and push standard AMD64 image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./docker/Dockerfile | |
| platforms: linux/amd64 | |
| push: true | |
| tags: | | |
| ${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-amd64 | |
| ${{ env.GHCR_IMAGE }}:${{ inputs.version }}-amd64 | |
| ${{ inputs.push_latest && format('{0}:latest', env.DOCKERHUB_IMAGE) || '' }} | |
| ${{ inputs.push_latest && format('{0}:latest', env.GHCR_IMAGE) || '' }} | |
| build-args: | | |
| UID=1000 | |
| GID=1000 | |
| cache-from: type=gha,scope=standard-amd64 | |
| cache-to: type=gha,mode=max,scope=standard-amd64 | |
| # ========================================================================= | |
| # Standard image - ARM64 | |
| # ========================================================================= | |
| - name: Build and push standard ARM64 image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./docker/Dockerfile | |
| platforms: linux/arm64 | |
| push: true | |
| tags: | | |
| ${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-arm64 | |
| ${{ env.GHCR_IMAGE }}:${{ inputs.version }}-arm64 | |
| build-args: | | |
| UID=1000 | |
| GID=1000 | |
| cache-from: type=gha,scope=standard-arm64 | |
| cache-to: type=gha,mode=max,scope=standard-arm64 | |
| # ========================================================================= | |
| # Distroless image - AMD64 | |
| # ========================================================================= | |
| - name: Build and push distroless AMD64 image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./docker/Dockerfile.distroless | |
| platforms: linux/amd64 | |
| push: true | |
| tags: | | |
| ${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-amd64-distroless | |
| ${{ env.GHCR_IMAGE }}:${{ inputs.version }}-amd64-distroless | |
| cache-from: type=gha,scope=distroless-amd64 | |
| cache-to: type=gha,mode=max,scope=distroless-amd64 | |
| # ========================================================================= | |
| # Distroless image - ARM64 | |
| # ========================================================================= | |
| - name: Build and push distroless ARM64 image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./docker/Dockerfile.distroless | |
| platforms: linux/arm64 | |
| push: true | |
| tags: | | |
| ${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-arm64-distroless | |
| ${{ env.GHCR_IMAGE }}:${{ inputs.version }}-arm64-distroless | |
| cache-from: type=gha,scope=distroless-arm64 | |
| cache-to: type=gha,mode=max,scope=distroless-arm64 | |
| - name: Summary | |
| run: | | |
| echo "## Images pushed successfully! :rocket:" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Standard Images (debian:trixie-slim)" >> $GITHUB_STEP_SUMMARY | |
| echo "| Architecture | Docker Hub | GitHub Container Registry |" >> $GITHUB_STEP_SUMMARY | |
| echo "|--------------|------------|---------------------------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| AMD64 | \`${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-amd64\` | \`${{ env.GHCR_IMAGE }}:${{ inputs.version }}-amd64\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "| ARM64 | \`${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-arm64\` | \`${{ env.GHCR_IMAGE }}:${{ inputs.version }}-arm64\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Distroless Images (gcr.io/distroless/base-debian13)" >> $GITHUB_STEP_SUMMARY | |
| echo "| Architecture | Docker Hub | GitHub Container Registry |" >> $GITHUB_STEP_SUMMARY | |
| echo "|--------------|------------|---------------------------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| AMD64 | \`${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-amd64-distroless\` | \`${{ env.GHCR_IMAGE }}:${{ inputs.version }}-amd64-distroless\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "| ARM64 | \`${{ env.DOCKERHUB_IMAGE }}:${{ inputs.version }}-arm64-distroless\` | \`${{ env.GHCR_IMAGE }}:${{ inputs.version }}-arm64-distroless\` |" >> $GITHUB_STEP_SUMMARY | |
| if [ "${{ inputs.push_latest }}" = "true" ]; then | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Latest Tag" >> $GITHUB_STEP_SUMMARY | |
| echo "- \`${{ env.DOCKERHUB_IMAGE }}:latest\` → AMD64 standard image" >> $GITHUB_STEP_SUMMARY | |
| echo "- \`${{ env.GHCR_IMAGE }}:latest\` → AMD64 standard image" >> $GITHUB_STEP_SUMMARY | |
| fi |