build/deploy 合并为单 workflow 双 job,删除 deploy.yml
原 workflow_run 链触发会在 Actions 列表产生两条独立 run,UX 割裂。 合并后单 run + dependency graph 显式串联 build → deploy。 代价:失去"不 rebuild 只 redeploy"的 UI 单点触发,临时只想 重启容器需直接 ssh NAS 跑 docker compose up -d。 paths-ignore 同步移除已不存在的 deploy.yml 项。
This commit is contained in:
@@ -14,13 +14,12 @@ on:
|
||||
- '.gitignore'
|
||||
- 'LICENSE'
|
||||
- 'screenshot/**'
|
||||
# 这两个 workflow 改动不影响镜像内容,没必要 rebuild:
|
||||
# - deploy.yml 改的是部署逻辑(compose pull/up),不动镜像
|
||||
# - sync-upstream.yml 改的是 main reset 逻辑,跟 build 也无关
|
||||
# sync-upstream.yml 改的是 main reset 逻辑,跟 build 无关
|
||||
# build-image.yml 自己留着会触发,作为 workflow 改动的 self-test
|
||||
- '.gitea/workflows/deploy.yml'
|
||||
- '.gitea/workflows/sync-upstream.yml'
|
||||
# 手动触发:保留作为应急通道(重新打包旧 commit / 用自定义 tag / 等)
|
||||
# 注意:手动触发也会跑 deploy job —— 如果只想 build 不部署,临时把 deploy
|
||||
# job 注释掉或在 deploy 里加 if 条件
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
@@ -34,7 +33,7 @@ on:
|
||||
|
||||
# 并发控制:同一分支的连续 push 只跑最新的,旧 in-progress run 会被取消
|
||||
# 例:连续 3 次 push,第 1 次 build 跑了 30s,第 2 次开始 → 取消第 1,第 2 跑;
|
||||
# 期间第 3 次又来 → 取消第 2,第 3 跑。最后只构建出最新代码,省 CI 时间。
|
||||
# 期间第 3 次又来 → 取消第 2,第 3 跑。最后只构建+部署最新代码,省 CI 时间。
|
||||
# group 包含 ref 是为了不同分支的 build 互不干扰(虽然当前只有 custom 用)
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
@@ -117,4 +116,52 @@ jobs:
|
||||
echo "| 源 commit (full) | \`${{ steps.meta.outputs.full_sha }}\` |"
|
||||
echo "| 源 commit (short) | \`${{ steps.meta.outputs.image_tag }}\` |"
|
||||
echo "| 镜像 tag | \`git.zhengchentao.win/dev/ezbookkeeping:${{ steps.meta.outputs.image_tag }}\` + \`:latest\` |"
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
deploy:
|
||||
# needs: build 串起来 —— build 失败 deploy 自动跳过,无需 if 条件
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# 登录 Gitea Container Registry,否则 docker compose pull 私有镜像 401。
|
||||
# 跟 build job 那步是同一个 PACKAGES_TOKEN,但每个 job 跑在独立 runner 上,
|
||||
# 凭据不会从 build job 继承,必须在这里再登一次。
|
||||
- name: Login to Gitea Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: git.zhengchentao.win
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.PACKAGES_TOKEN }}
|
||||
|
||||
- name: Pull and restart ezbookkeeping
|
||||
# 部署逻辑直接内联在这。runner 容器挂了 host docker.sock,
|
||||
# 所以这里 docker 命令直接操作的是宿主机 docker daemon,
|
||||
# 容器层面相当于 "ssh 到 NAS 跑 docker compose"。
|
||||
#
|
||||
# NAS_INFRA_TOKEN secret 仅在 nas-infra 是私有仓库时需要;
|
||||
# 公开仓库不设这个 secret 也能拉。
|
||||
env:
|
||||
NAS_INFRA_TOKEN: ${{ secrets.NAS_INFRA_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
|
||||
TMPDIR=$(mktemp -d)
|
||||
trap 'rm -rf "$TMPDIR"' EXIT
|
||||
|
||||
# 决定 clone URL:有 token 用 token(私有),没有用裸 URL(公开)
|
||||
if [ -n "$NAS_INFRA_TOKEN" ]; then
|
||||
CLONE_URL="https://x-access-token:${NAS_INFRA_TOKEN}@git.zhengchentao.win/dev/nas-infra.git"
|
||||
else
|
||||
CLONE_URL="https://git.zhengchentao.win/dev/nas-infra.git"
|
||||
fi
|
||||
|
||||
git clone --depth 1 "$CLONE_URL" "$TMPDIR/nas-infra"
|
||||
cd "$TMPDIR/nas-infra/ezbookkeeping"
|
||||
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
|
||||
# 简单 health:列容器状态 + 输出最近日志
|
||||
sleep 3
|
||||
docker compose ps
|
||||
docker compose logs --tail=30 ezbookkeeping
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
name: Deploy Docker Image
|
||||
|
||||
on:
|
||||
# 自动触发:build-image workflow 成功完成后跑
|
||||
workflow_run:
|
||||
workflows: ["Build Docker Image"]
|
||||
types: [completed]
|
||||
branches: [custom]
|
||||
# 手动触发:保留作为应急通道(重新部署当前镜像 / 跑临时脚本)
|
||||
workflow_dispatch:
|
||||
|
||||
# 并发控制:连续多次 build 完成时,最新那次的 deploy 会取消旧的 in-progress
|
||||
# deploy。避免老镜像被 docker compose up -d 临时切换到、又立即被新镜像覆盖
|
||||
# 的窗口期,保证 ezbookkeeping 容器最终运行的是最新代码
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
# 只在 build 成功后跑;手动触发时 workflow_run 字段不存在,
|
||||
# 第一个条件保证手动跑也能继续
|
||||
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
||||
steps:
|
||||
# 登录 Gitea Container Registry,否则 docker compose pull 私有镜像 401。
|
||||
# 跟 build-image.yml 那步是同一个 PACKAGES_TOKEN,但每个 workflow 容器
|
||||
# 是干净环境,凭据不会从 build 步骤继承过来,必须在这里再登一次。
|
||||
- name: Login to Gitea Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: git.zhengchentao.win
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.PACKAGES_TOKEN }}
|
||||
|
||||
- name: Pull and restart ezbookkeeping
|
||||
# 部署逻辑直接内联在这。runner 容器挂了 host docker.sock,
|
||||
# 所以这里 docker 命令直接操作的是宿主机 docker daemon,
|
||||
# 容器层面相当于 "ssh 到 NAS 跑 docker compose"。
|
||||
#
|
||||
# NAS_INFRA_TOKEN secret 仅在 nas-infra 是私有仓库时需要;
|
||||
# 公开仓库不设这个 secret 也能拉。
|
||||
env:
|
||||
NAS_INFRA_TOKEN: ${{ secrets.NAS_INFRA_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
|
||||
TMPDIR=$(mktemp -d)
|
||||
trap 'rm -rf "$TMPDIR"' EXIT
|
||||
|
||||
# 决定 clone URL:有 token 用 token(私有),没有用裸 URL(公开)
|
||||
if [ -n "$NAS_INFRA_TOKEN" ]; then
|
||||
CLONE_URL="https://x-access-token:${NAS_INFRA_TOKEN}@git.zhengchentao.win/dev/nas-infra.git"
|
||||
else
|
||||
CLONE_URL="https://git.zhengchentao.win/dev/nas-infra.git"
|
||||
fi
|
||||
|
||||
git clone --depth 1 "$CLONE_URL" "$TMPDIR/nas-infra"
|
||||
cd "$TMPDIR/nas-infra/ezbookkeeping"
|
||||
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
|
||||
# 简单 health:列容器状态 + 输出最近日志
|
||||
sleep 3
|
||||
docker compose ps
|
||||
docker compose logs --tail=30 ezbookkeeping
|
||||
|
||||
- name: Deploy summary
|
||||
if: always()
|
||||
run: |
|
||||
{
|
||||
echo "## Deploy Summary"
|
||||
echo ""
|
||||
echo "| 项 | 值 |"
|
||||
echo "|---|---|"
|
||||
echo "| 触发方式 | \`${{ github.event_name }}\` |"
|
||||
if [ "${{ github.event_name }}" = "workflow_run" ]; then
|
||||
echo "| 触发自 | \`${{ github.event.workflow_run.name }}\` run #${{ github.event.workflow_run.run_number }} |"
|
||||
echo "| 上游 build 结果 | \`${{ github.event.workflow_run.conclusion }}\` |"
|
||||
echo "| 上游 build commit | \`${{ github.event.workflow_run.head_sha }}\` |"
|
||||
fi
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
Reference in New Issue
Block a user