-
Notifications
You must be signed in to change notification settings - Fork 217
129 lines (123 loc) · 4.39 KB
/
Copy pathdocker.yml
File metadata and controls
129 lines (123 loc) · 4.39 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
name: build-and-push
# 构建多架构镜像并推到 GHCR。公开镜像,阿里云集群直接 pull。
# 触发:push 到 dev/main 或打 v*.*.* tag,也可以手动 workflow_dispatch。
on:
push:
branches: [dev, main]
tags: ["v*.*.*"]
workflow_dispatch:
inputs:
tag:
description: 覆盖镜像 tag(可选)
required: false
permissions:
contents: read
packages: write
env:
IMAGE: ghcr.io/${{ github.repository_owner }}/fastclaw
jobs:
# --- Shared: derive version metadata ---
meta:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.meta.outputs.version }}
sha7: ${{ steps.meta.outputs.sha7 }}
date: ${{ steps.meta.outputs.date }}
tags: ${{ steps.tags.outputs.tags }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Derive version
id: meta
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ github.event.inputs.tag }}" ]; then
echo "version=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
else
echo "version=$(git describe --tags --always --dirty)" >> $GITHUB_OUTPUT
fi
echo "sha7=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> $GITHUB_OUTPUT
- name: Compute tags
id: tags
run: |
TAGS="${{ env.IMAGE }}:${{ steps.meta.outputs.version }},${{ env.IMAGE }}:${{ steps.meta.outputs.sha7 }}"
case "${{ github.ref }}" in
refs/heads/dev) TAGS="$TAGS,${{ env.IMAGE }}:dev" ;;
refs/heads/main) TAGS="$TAGS,${{ env.IMAGE }}:latest" ;;
esac
echo "tags=$TAGS" >> $GITHUB_OUTPUT
# --- Per-arch builds run in parallel ---
build:
needs: meta
runs-on: ubuntu-latest
strategy:
matrix:
platform: [linux/amd64, linux/arm64]
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Platform slug
id: slug
run: echo "slug=$(echo '${{ matrix.platform }}' | tr '/' '-')" >> $GITHUB_OUTPUT
- name: Build and push (single arch)
id: build
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
platforms: ${{ matrix.platform }}
push: false
outputs: type=image,"name=${{ env.IMAGE }}",push-by-digest=true,name-canonical=true,push=true
build-args: |
VERSION=${{ needs.meta.outputs.version }}
COMMIT=${{ needs.meta.outputs.sha7 }}
DATE=${{ needs.meta.outputs.date }}
cache-from: type=gha,scope=${{ steps.slug.outputs.slug }}
cache-to: type=gha,scope=${{ steps.slug.outputs.slug }},mode=max
- name: Export digest
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- uses: actions/upload-artifact@v4
with:
name: digest-${{ steps.slug.outputs.slug }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
# --- Merge per-arch digests into one multi-arch manifest ---
merge:
needs: [meta, build]
runs-on: ubuntu-latest
steps:
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digest-*
merge-multiple: true
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
TAGS="${{ needs.meta.outputs.tags }}"
TAG_ARGS=""
IFS=',' read -ra TAG_ARRAY <<< "$TAGS"
for t in "${TAG_ARRAY[@]}"; do
TAG_ARGS="$TAG_ARGS -t $t"
done
docker buildx imagetools create $TAG_ARGS \
$(printf '${{ env.IMAGE }}@sha256:%s ' *)