Skip to content

Build and Push Docker Images #16

Build and Push Docker Images

Build and Push Docker Images #16

Workflow file for this run

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