新增两个工作流,push 和 tag 均触发镜像构建并推送至 Gitea 内置镜像仓库: ci.yml(push 触发): - 监听 main / master / develop 分支 - 镜像标签::latest(main/master)、:develop、:sha-<短提交号> - 利用 buildcache tag 缓存镜像层加速后续构建 release.yml(tag 触发): - 监听 v* 格式的 tag(如 v1.0.0) - semver 自动展开:v1.2.3 → :1.2.3 + :1.2 + :1 + :latest - 预发布 tag(含 -)不覆盖 :latest - 自动生成两次 tag 之间的变更日志并写入 Step Summary 共同特性: - 通过 tr 将仓库路径转小写,规避 HTY1024 大写问题 - 最终镜像名:git.hty1024.com/hty1024/ai-app-database Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# CI 工作流 — Push 触发:构建镜像并推送到 Gitea 镜像仓库
|
||||
#
|
||||
# 触发条件:push 到 main / master / develop 分支
|
||||
# 镜像标签:
|
||||
# main/master → :latest + :sha-<短提交号>
|
||||
# develop → :develop + :sha-<短提交号>
|
||||
#
|
||||
# 前置配置(Gitea → 仓库 → 设置 → Secrets):
|
||||
# GITEA_TOKEN — 具有 package:write 权限的 Gitea Access Token
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
name: CI — Docker Build & Push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- develop
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- '.gitignore'
|
||||
- '.env*.example'
|
||||
|
||||
env:
|
||||
REGISTRY: git.hty1024.com
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
name: Build & Push Image
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# ── 1. 检出代码 ──────────────────────────────────────────
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# ── 2. 生成小写镜像名(规避仓库路径大写问题)─────────────
|
||||
- name: 生成小写镜像名
|
||||
id: image
|
||||
run: |
|
||||
REPO=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')
|
||||
echo "name=${{ env.REGISTRY }}/${REPO}" >> $GITHUB_OUTPUT
|
||||
echo "镜像名: ${{ env.REGISTRY }}/${REPO}"
|
||||
|
||||
# ── 3. 设置 QEMU(多架构支持,按需保留)────────────────────
|
||||
# - name: 设置 QEMU
|
||||
# uses: docker/setup-qemu-action@v3
|
||||
|
||||
# ── 4. 设置 Docker Buildx ────────────────────────────────
|
||||
- name: 设置 Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
# ── 5. 登录 Gitea 镜像仓库 ──────────────────────────────
|
||||
- name: 登录 Gitea 镜像仓库
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
# ── 6. 提取镜像元数据(自动生成 tags 和 labels)─────────
|
||||
- name: 提取镜像元数据
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ steps.image.outputs.name }}
|
||||
tags: |
|
||||
# main/master 分支 → :latest
|
||||
type=raw,value=latest,enable=${{ github.ref_name == 'main' || github.ref_name == 'master' }}
|
||||
# develop 分支 → :develop
|
||||
type=raw,value=develop,enable=${{ github.ref_name == 'develop' }}
|
||||
# 所有分支都打 :sha-<短提交号>
|
||||
type=sha,prefix=sha-,format=short
|
||||
labels: |
|
||||
org.opencontainers.image.title=个人资料库
|
||||
org.opencontainers.image.description=个人多媒体资料管理系统
|
||||
org.opencontainers.image.vendor=HTY1024
|
||||
|
||||
# ── 7. 构建并推送镜像 ────────────────────────────────────
|
||||
- name: 构建并推送镜像
|
||||
id: build
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
# 利用镜像层缓存加速构建(buildcache tag 仅用于缓存)
|
||||
cache-from: type=registry,ref=${{ steps.image.outputs.name }}:buildcache
|
||||
cache-to: type=registry,ref=${{ steps.image.outputs.name }}:buildcache,mode=max
|
||||
|
||||
# ── 8. 输出构建摘要 ──────────────────────────────────────
|
||||
- name: 输出构建信息
|
||||
run: |
|
||||
echo "### 🐳 镜像构建成功" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 项目 | 值 |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "|------|-----|" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 镜像摘要 | \`${{ steps.build.outputs.digest }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 触发分支 | \`${{ github.ref_name }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 提交 SHA | \`${{ github.sha }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**推送的标签:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
@@ -0,0 +1,152 @@
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Release 工作流 — Tag 触发:构建正式版镜像并推送到 Gitea 镜像仓库
|
||||
#
|
||||
# 触发条件:push 符合 v* 格式的 tag(如 v1.0.0、v2.1.3-rc1)
|
||||
# 镜像标签:
|
||||
# v1.2.3 → :1.2.3 + :1.2 + :1 + :latest
|
||||
#
|
||||
# 前置配置(Gitea → 仓库 → 设置 → Secrets):
|
||||
# GITEA_TOKEN — 具有 package:write 权限的 Gitea Access Token
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
name: Release — Docker Build & Push
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
env:
|
||||
REGISTRY: git.hty1024.com
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release Image
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# ── 1. 检出代码(完整历史,用于生成 changelog)──────────
|
||||
- name: 检出代码
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# ── 2. 生成小写镜像名 ────────────────────────────────────
|
||||
- name: 生成小写镜像名
|
||||
id: image
|
||||
run: |
|
||||
REPO=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')
|
||||
echo "name=${{ env.REGISTRY }}/${REPO}" >> $GITHUB_OUTPUT
|
||||
# 提取不含 v 前缀的版本号,如 v1.2.3 → 1.2.3
|
||||
VERSION="${{ github.ref_name }}"
|
||||
echo "version=${VERSION#v}" >> $GITHUB_OUTPUT
|
||||
echo "镜像名: ${{ env.REGISTRY }}/${REPO} 版本: ${VERSION}"
|
||||
|
||||
# ── 3. 校验版本号格式(SemVer)───────────────────────────
|
||||
- name: 校验版本号格式
|
||||
run: |
|
||||
VERSION="${{ github.ref_name }}"
|
||||
if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-].+)?$ ]]; then
|
||||
echo "::warning::标签 '$VERSION' 不符合 vX.Y.Z 格式,仍会构建但建议规范版本号"
|
||||
else
|
||||
echo "版本号格式正确: $VERSION"
|
||||
fi
|
||||
|
||||
# ── 4. 设置 Docker Buildx ────────────────────────────────
|
||||
- name: 设置 Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
# ── 5. 登录 Gitea 镜像仓库 ──────────────────────────────
|
||||
- name: 登录 Gitea 镜像仓库
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
# ── 6. 提取镜像元数据 ────────────────────────────────────
|
||||
# metadata-action 对 semver tag 会自动生成多级标签:
|
||||
# v1.2.3 → :1.2.3、:1.2、:1、:latest
|
||||
- name: 提取镜像元数据
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ steps.image.outputs.name }}
|
||||
tags: |
|
||||
# semver 完整版本号:1.2.3
|
||||
type=semver,pattern={{version}}
|
||||
# 主版本.次版本:1.2
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
# 主版本号:1(仅非 0.x 版本)
|
||||
type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}
|
||||
# 正式 release 同时打 latest
|
||||
type=raw,value=latest,enable=${{ !contains(github.ref_name, '-') }}
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.title=个人资料库
|
||||
org.opencontainers.image.description=个人多媒体资料管理系统
|
||||
org.opencontainers.image.vendor=HTY1024
|
||||
org.opencontainers.image.version=${{ steps.image.outputs.version }}
|
||||
|
||||
# ── 7. 构建并推送正式版镜像 ──────────────────────────────
|
||||
- name: 构建并推送镜像
|
||||
id: build
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
# 复用 CI 构建的缓存层,加速 release 构建
|
||||
cache-from: type=registry,ref=${{ steps.image.outputs.name }}:buildcache
|
||||
cache-to: type=registry,ref=${{ steps.image.outputs.name }}:buildcache,mode=max
|
||||
# 构建参数:写入版本号到镜像内
|
||||
build-args: |
|
||||
APP_VERSION=${{ steps.image.outputs.version }}
|
||||
|
||||
# ── 8. 生成两次 tag 之间的变更日志 ───────────────────────
|
||||
- name: 生成变更日志
|
||||
id: changelog
|
||||
run: |
|
||||
# 获取上一个 tag
|
||||
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
|
||||
if [ -n "$PREV_TAG" ]; then
|
||||
RANGE="${PREV_TAG}..HEAD"
|
||||
echo "上一版本: $PREV_TAG → 当前版本: ${{ github.ref_name }}"
|
||||
else
|
||||
RANGE="HEAD"
|
||||
echo "首次发布"
|
||||
fi
|
||||
# 收集提交日志
|
||||
LOG=$(git log $RANGE --pretty=format:"- %s (%h)" --no-merges 2>/dev/null | head -30)
|
||||
# 写入多行输出
|
||||
EOF_MARKER=$(dd if=/dev/urandom bs=15 count=1 2>/dev/null | base64)
|
||||
echo "log<<${EOF_MARKER}" >> $GITHUB_OUTPUT
|
||||
echo "${LOG:-"- 首次发布"}" >> $GITHUB_OUTPUT
|
||||
echo "${EOF_MARKER}" >> $GITHUB_OUTPUT
|
||||
|
||||
# ── 9. 输出发布摘要 ──────────────────────────────────────
|
||||
- name: 输出发布摘要
|
||||
run: |
|
||||
echo "## 🚀 版本发布:${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 项目 | 值 |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "|------|-----|" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 版本号 | \`${{ github.ref_name }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 镜像摘要 | \`${{ steps.build.outputs.digest }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 提交 SHA | \`${{ github.sha }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**推送的镜像标签:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**本次变更:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo "${{ steps.changelog.outputs.log }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**拉取镜像:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```bash' >> $GITHUB_STEP_SUMMARY
|
||||
echo "docker pull ${{ steps.image.outputs.name }}:${{ steps.image.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
Reference in New Issue
Block a user