Skip to content

Commit 7b47254

Browse files
committed
chore: introduce docker release pipeline
The whole flow is reimplemented using native arm64/amd64 runners. Signed-off-by: Roman Gershman <[email protected]>
1 parent 2436094 commit 7b47254

File tree

5 files changed

+190
-330
lines changed

5 files changed

+190
-330
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Test Docker Image
2+
description: "Run regression tests"
3+
4+
inputs:
5+
image_id:
6+
required: true
7+
type: string
8+
name:
9+
required: true
10+
type: string
11+
12+
runs:
13+
using: "composite"
14+
steps:
15+
- name: Test Image
16+
shell: bash
17+
run: |
18+
echo "Testing ${{ inputs.name }} image"
19+
docker pull ${{inputs.image_id}}
20+
docker image inspect ${{inputs.image_id}}
21+
22+
# docker run with port-forwarding
23+
docker run --name test -d -p 6379:6379 ${{inputs.image_id}}
24+
until [ "`docker inspect -f {{.State.Health.Status}} test`"=="healthy" ]; do
25+
sleep 0.1;
26+
done;

.github/workflows/docker-release.yml

Lines changed: 0 additions & 124 deletions
This file was deleted.

.github/workflows/docker-release2.yml

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
name: Docker Release-v2
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
TAG_NAME:
7+
description: 'Tag name that the major tag will point to'
8+
required: true
9+
PRERELEASE:
10+
description: 'Whether this is a prerelease'
11+
type: boolean
12+
required: true
13+
14+
release:
15+
types: [published]
16+
pull_request:
17+
branches: [main]
18+
19+
concurrency:
20+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
21+
cancel-in-progress: true
22+
23+
env:
24+
# TAG_NAME: ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }}
25+
TAG_NAME: v1.27.1
26+
IS_PRERELEASE: ${{ github.event.release.prerelease || github.event.inputs.PRERELEASE }}
27+
IMAGE: ghcr.io/dragonflydb/dragonfly
28+
29+
jobs:
30+
build_and_tag:
31+
name: Build and Push ${{matrix.flavor}} ${{ matrix.os.arch }} image
32+
strategy:
33+
matrix:
34+
flavor: [ubuntu]
35+
os:
36+
- image: ubuntu-24.04
37+
arch: amd64
38+
- image: ubuntu-24.04-arm
39+
arch: arm64
40+
41+
runs-on: ${{ matrix.os.image }}
42+
permissions:
43+
contents: read
44+
packages: write
45+
id-token: write
46+
47+
steps:
48+
- name: checkout
49+
uses: actions/checkout@v4
50+
with:
51+
fetch-depth: 0
52+
submodules: true
53+
- name: Set up Docker Buildx
54+
uses: docker/setup-buildx-action@v3
55+
- name: Login to GitHub Container Registry
56+
uses: docker/login-action@v3
57+
with:
58+
registry: ghcr.io
59+
username: ${{ github.repository_owner }}
60+
password: ${{ secrets.GITHUB_TOKEN }}
61+
62+
- name: Fetch release asset
63+
uses: dsaltares/[email protected]
64+
with:
65+
version: "tags/${{ env.TAG_NAME }}"
66+
regex: true
67+
file: "dragonfly-.*\\.tar\\.gz"
68+
target: 'releases/'
69+
token: ${{ secrets.GITHUB_TOKEN }}
70+
71+
- name: Extract artifacts
72+
run: |
73+
echo "Event prerelease ${{ github.event.release.prerelease }}"
74+
echo "Input prerelease ${{ github.event.inputs.PRERELEASE }}"
75+
ls -l
76+
ls -l releases
77+
for f in releases/*.tar.gz; do tar xvfz $f -C releases; done
78+
rm releases/*.tar.gz
79+
80+
- name: Docker meta
81+
id: metadata
82+
uses: docker/metadata-action@v5
83+
with:
84+
images: |
85+
${{ env.IMAGE }}
86+
flavor: |
87+
latest=false
88+
prefix=${{ matrix.flavor}}-
89+
suffix=-${{ matrix.os.arch }}
90+
tags: |
91+
type=semver,pattern={{version}},enable=true,value=${{ env.TAG_NAME }}
92+
type=semver,pattern={{raw}},enable=true,value=${{ env.TAG_NAME }}
93+
type=ref,event=pr
94+
labels: |
95+
org.opencontainers.image.vendor=DragonflyDB LTD
96+
org.opencontainers.image.title=Dragonfly Production Image
97+
org.opencontainers.image.description=The fastest in-memory store
98+
99+
- name: Build image
100+
id: build
101+
uses: docker/build-push-action@v6
102+
with:
103+
context: .
104+
push: true
105+
provenance: false # Prevent pushing a docker manifest
106+
tags: |
107+
${{ steps.metadata.outputs.tags }}
108+
labels: ${{ steps.metadata.outputs.labels }}
109+
file: tools/packaging/Dockerfile.${{ matrix.flavor }}-prod
110+
cache-from: type=gha,scope=prod-${{ matrix.flavor }}
111+
cache-to: type=gha,scope=prod-${{ matrix.flavor }},mode=max
112+
load: true # Load the build images into the local docker.
113+
114+
- name: Test Image
115+
uses: ./.github/actions/test-docker
116+
timeout-minutes: 1
117+
with:
118+
image_id: ${{ env.IMAGE }}@${{ steps.build.outputs.digest }}
119+
name: ${{ matrix.flavor }}-${{ matrix.os.arch }}
120+
121+
- id: output-sha
122+
run: |
123+
echo "sha_${{ matrix.os.arch }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT
124+
outputs:
125+
sha_amd: ${{ steps.output-sha.outputs.sha_amd64 }}
126+
sha_arm: ${{ steps.output-sha.outputs.sha_arm64 }}
127+
128+
merge_manifest:
129+
needs: [build_and_tag]
130+
runs-on: ubuntu-latest
131+
strategy:
132+
matrix:
133+
flavor: [ubuntu]
134+
steps:
135+
- name: Login to GitHub Container Registry
136+
uses: docker/login-action@v3
137+
with:
138+
registry: ghcr.io
139+
username: ${{ github.repository_owner }}
140+
password: ${{ secrets.GITHUB_TOKEN }}
141+
142+
- name: Merge and Push
143+
run: |
144+
sha_amd=${{ env.IMAGE }}@${{ needs.build_and_tag.outputs.sha_amd }}
145+
sha_arm=${{ env.IMAGE }}@${{ needs.build_and_tag.outputs.sha_arm }}
146+
echo "shas: $sha_amd $sha_arm"
147+
148+
if [[ "${{ env.IS_PRERELEASE }}" == 'true' ]]; then
149+
# Create and push the manifest like dragonfly:alpha-ubuntu
150+
tag="${{ env.IMAGE }}:alpha-${{ matrix.flavor }}"
151+
docker manifest create ${tag} --amend ${sha_amd} --amend ${sha_arm}
152+
docker manifest push ${tag}
153+
elif [[ "${{matrix.flavor}}" == 'ubuntu' ]]; then
154+
tag="${{ env.IMAGE }}:latest"
155+
# Create and push the manifest like dragonfly:latest
156+
docker manifest create ${tag} --amend ${sha_amd} --amend ${sha_arm}
157+
docker manifest push ${tag}
158+
fi
159+
160+
# Create and push the manifest like dragonfly:v1.26.4
161+
tag=${{ env.IMAGE }}:${{ env.TAG_NAME }}
162+
docker manifest create ${tag} --amend ${sha_amd} --amend ${sha_arm}
163+
docker manifest push ${tag}

0 commit comments

Comments
 (0)