-
Notifications
You must be signed in to change notification settings - Fork 0
152 lines (138 loc) · 6.45 KB
/
Copy pathdocker-build.yml
File metadata and controls
152 lines (138 loc) · 6.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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