Repository navigation
150 lines (128 loc) · 5.09 KB
/
Copy pathrelease.yml
File metadata and controls
150 lines (128 loc) · 5.09 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
name: Release and Build
on:
push:
tags:
- 'v*.*.*' # 触发条件:推送形如 v0.8.0, v1.0.0 的标签
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
create-release:
name: Create GitHub Release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史,用于生成变更日志
- name: Get version from tag
id: get_version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
- name: Generate Release Notes
id: release_notes
run: |
VERSION=${{ steps.get_version.outputs.VERSION }}
# 从 CHANGELOG.md 提取中文版本说明
if [ -f "CHANGELOG.md" ]; then
# 提取当前版本的中文内容
CHANGELOG_CN=$(sed -n "/## \[$VERSION\]/,/## \[/p" CHANGELOG.md | sed '$d' | tail -n +2)
else
CHANGELOG_CN=""
fi
# 获取上一个标签
PREV_TAG=$(git describe --abbrev=0 --tags $(git rev-list --tags --skip=1 --max-count=1) 2>/dev/null || echo "")
# 生成英文变更日志(从 git commit)
if [ -z "$PREV_TAG" ]; then
CHANGELOG_EN=$(git log --pretty=format:"- %s (%h)" --no-merges)
else
CHANGELOG_EN=$(git log ${PREV_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
fi
# 生成 Release Notes(中文优先,英文在后)
if [ -n "$CHANGELOG_CN" ]; then
echo "## 📝 更新说明 / Release Notes" > release_notes.md
echo "" >> release_notes.md
echo "$CHANGELOG_CN" >> release_notes.md
echo "" >> release_notes.md
echo "---" >> release_notes.md
echo "" >> release_notes.md
else
echo "## 📝 Release Notes" > release_notes.md
echo "" >> release_notes.md
fi
echo "## 🚀 What's Changed (Auto-generated)" >> release_notes.md
echo "" >> release_notes.md
echo "$CHANGELOG_EN" >> release_notes.md
echo "" >> release_notes.md
echo "## 📦 Docker Image" >> release_notes.md
echo "" >> release_notes.md
echo '```bash' >> release_notes.md
echo "docker pull ghcr.io/${{ github.repository }}:$VERSION" >> release_notes.md
echo "# 或使用 latest 标签" >> release_notes.md
echo "docker pull ghcr.io/${{ github.repository }}:latest" >> release_notes.md
echo '```' >> release_notes.md
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: Release v${{ steps.get_version.outputs.VERSION }}
body_path: release_notes.md
draft: false
prerelease: ${{ contains(steps.get_version.outputs.VERSION, 'alpha') || contains(steps.get_version.outputs.VERSION, 'beta') || contains(steps.get_version.outputs.VERSION, 'rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-and-push-docker:
name: Build and Push Docker Image
runs-on: ubuntu-latest
needs: create-release
permissions:
contents: read
packages: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Get version from tag
id: get_version
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
# 判断是否为次版本号 x.y.0(打 stable 标签)
if echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.0$'; then
echo "IS_STABLE=true" >> $GITHUB_OUTPUT
else
echo "IS_STABLE=false" >> $GITHUB_OUTPUT
fi
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value=latest,enable=${{ !contains(steps.get_version.outputs.VERSION, '-') }}
type=raw,value=stable,enable=${{ steps.get_version.outputs.IS_STABLE == 'true' && !contains(steps.get_version.outputs.VERSION, '-') }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64
- name: Image digest
run: |
echo "Docker image pushed successfully!"
echo "Tags: ${{ steps.meta.outputs.tags }}"