From 5c9886ac2496e5993e004b19d42e078f22357c57 Mon Sep 17 00:00:00 2001 From: sunjunzhao Date: Fri, 16 Oct 2026 22:48:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(gitea-actions):=20pull+push=20missed=20bas?= =?UTF-8?q?e=20images=20into=20{registry}/images=20before=20FROM=20rewrite?= =?UTF-8?q?=20=E2=80=94=20new=20base=20images=20persist=20to=20internal=20?= =?UTF-8?q?namespace=20on=20first=20build=20instead=20of=20passive=20fallb?= =?UTF-8?q?ack;=20bare=20invocation=20is=20read-only=20CI/CD=20compliance?= =?UTF-8?q?=20audit;=20brace=20variable=20refs=20before=20full-width=20cha?= =?UTF-8?q?rs=20(bash=203.2=20UTF-8=20expansion=20bug);=20check-workflow.s?= =?UTF-8?q?h=20item=20=E2=91=A9=20now=20requires=20sync-on-miss=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/gitea-actions/SKILL.md | 18 ++--- .../references/docker-deploy-template.yaml | 65 ++++++++++++------- .../gitea-actions/scripts/check-workflow.sh | 9 +-- 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/skills/gitea-actions/SKILL.md b/skills/gitea-actions/SKILL.md index 0709395..e038d9d 100644 --- a/skills/gitea-actions/SKILL.md +++ b/skills/gitea-actions/SKILL.md @@ -1,6 +1,6 @@ --- name: gitea-actions -description: 按统一规范给项目生成或评审优化 Gitea Actions 构建部署工作流(.gitea/workflows/docker-deploy.yaml):推 v 开头 tag 触发 → buildx 构建推 Gitea Packages → 本机 docker 重建容器 → 清理本机与注册表旧版本;零第三方 action、INNEV_ 前缀变量/密钥、凭证回退链、基础镜像强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn)并优先 {registry}/images 内网源。凡用户要求「给项目加构建工作流 / 加个 CI / 配发版流水线 / 加 Gitea Actions / 生成 docker-deploy.yaml / 打 tag 自动构建部署 / 这个项目怎么自动发版 / 看看这个 workflow 规范不规范 / 帮我评审一下这个流水线」,或出现 推了 tag Actions 没动静 / workflow 不触发 / push 镜像 denied / unauthorized / 健康检查超时 / 拉基础镜像超时 等症状,或提到 .gitea/workflows / workflow_dispatch / buildx / Gitea Packages / self-hosted runner / INNEV_ 变量 时,务必使用本 skill——即使用户没说「Gitea Actions」这几个字。Use whenever the user wants to add, review, or standardize a Gitea Actions build/deploy workflow for a project. 边界:写/改 Dockerfile 用 runtime-image;提交推送代码+写日报用 push-and-report;手工推镜像发版用 xgent-image-push。 +description: 按统一规范给项目生成或评审优化 Gitea Actions 构建部署工作流(.gitea/workflows/docker-deploy.yaml):推 v 开头 tag 触发 → buildx 构建推 Gitea Packages → 本机 docker 重建容器 → 清理本机与注册表旧版本;零第三方 action、INNEV_ 前缀变量/密钥、凭证回退链、基础镜像强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn),FROM 未命中 {registry}/images 时自动拉官方源推送落盘后再改写。不带任何输入调用本 skill = 审查当前项目 CI/CD 是否符合本规范。凡用户要求「给项目加构建工作流 / 加个 CI / 配发版流水线 / 加 Gitea Actions / 生成 docker-deploy.yaml / 打 tag 自动构建部署 / 这个项目怎么自动发版 / 看看这个 workflow 规范不规范 / 帮我评审一下这个流水线」,或出现 推了 tag Actions 没动静 / workflow 不触发 / push 镜像 denied / unauthorized / 健康检查超时 / 拉基础镜像超时 等症状,或提到 .gitea/workflows / workflow_dispatch / buildx / Gitea Packages / self-hosted runner / INNEV_ 变量 时,务必使用本 skill——即使用户没说「Gitea Actions」这几个字。Use whenever the user wants to add, review, or standardize a Gitea Actions build/deploy workflow for a project. 边界:写/改 Dockerfile 用 runtime-image;提交推送代码+写日报用 push-and-report;手工推镜像发版用 xgent-image-push。 --- # gitea-actions — 按统一规范给项目装构建部署工作流 @@ -10,11 +10,13 @@ description: 按统一规范给项目生成或评审优化 Gitea Actions 构建 - **版本号即镜像 tag**:发布 = 打 v 开头 git tag,镜像 tag 与之一一对应,可回溯;推 main 不发版 - **runner 与部署目标同机**:self-hosted 实例级 runner 直连宿主 docker,构建完即本机部署 - **零外部依赖**:不用任何第三方 action,run 步骤直连 git/docker,内网 runner 无需访问 github.com -- **基础镜像内网优选**:FROM 优先 `{registry}/images`(组织已把常用基础镜像同步到该命名空间),未命中回退官方源;拉取前强制网络检测选址——内网 `livebook:8418`、外网 `code.innev.cn`,写死任一地址换网络环境必挂;改写只落在 CI 克隆副本,仓库 Dockerfile 保持任意网络可构建 +- **基础镜像内网落盘**:FROM 命中 `{registry}/images` 直接改写为内部引用;未命中则由流水线把官方源镜像拉下来、推送进 images 命名空间后再改写——新基础镜像一次构建即落盘,后续构建全部内网命中、越构建越快。拉取/推送失败回退官方源不硬失败;拉取前强制网络检测选址——内网 `livebook:8418`、外网 `code.innev.cn`,写死任一地址换网络环境必挂;改写只落在 CI 克隆副本,仓库 Dockerfile 保持任意网络可构建 ## 默认流程(不带任何附加提示词也照此执行) -检测项目是否存在 `.gitea/workflows/` 下的工作流文件(yml/yaml),自动分流: +**用户不带任何附加输入调用本 skill = 审查当前项目 CI/CD 是否符合本规范**:走评审优化模式的只读审计——已有 workflow 逐条对照审计清单;连 `.gitea/workflows/` 都没有则如实报告"未配置 CI/CD"并给出新建建议,不默认动手生成。 + +带明确意图输入(如"加个 CI""生成 workflow")时,检测项目是否存在 `.gitea/workflows/` 下的工作流文件(yml/yaml),自动分流: - **不存在 → 新建模式**:按规范从零生成 `docker-deploy.yaml` - **已存在 → 评审优化模式**:对照规范逐条审计,差异摊开,用户确认后按规范改写优化(默认不直接覆盖) @@ -85,7 +87,7 @@ description: 按统一规范给项目生成或评审优化 Gitea Actions 构建 | B8 | 明文密钥 / clone 日志未 `grep -v` 过滤 token / docker login 未走 `--password-stdin` | ⑦ | 必须修(安全项,优先处理) | | B9 | 健康检查缺失或窗口与启动模型不匹配(runtime-node 首启数分钟) | ⑧ | 建议修 | | B10 | 自定义变量/密钥未用 INNEV_ 前缀 | 命名约定 | 建议修 | -| B11 | 缺基础镜像内网优选(无强制网络检测选址步 / FROM 未优先 {registry}/images) | ⑩ | 必须修 | +| B11 | 缺基础镜像同步落盘(无强制网络检测选址步 / FROM 未命中 {registry}/images 时未先拉取推送落盘再改写、仅被动回退官方源) | ⑩ | 必须修 | 级别定义:**必须修** = 会挂/泄密/误删邻项目产物;**建议修** = 能跑但稳定性/可维护性受损。 @@ -129,7 +131,7 @@ description: 按统一规范给项目生成或评审优化 Gitea Actions 构建 - ⑦ **密钥全部走 secrets 引用,clone 日志 `grep -v "$GIT_TOKEN"` 过滤,docker login 走 `--password-stdin`**。为什么:明文 token 进 workflow 文件 = 进 git 历史;密码进 argv 会留在日志与进程列表。 - ⑧ **健康检查窗口按启动模型放宽**。为什么:runtime-node 系容器首启要 install+build 数分钟,窗口太短会把正常启动当失败杀掉(spms 实测放宽到 ~7.5 分钟);项目没有健康端点时不虚构——省略该步并显式声明。 - ⑨ **生成/改写前先摊全文或 diff 给用户确认**。为什么:workflow 直接决定发布行为,未经确认的写入超出授权;默认动作永远是"不写"。 -- ⑩ **基础镜像强制优选内部源 `{registry}/images`,拉取前强制网络检测选址(内网 `livebook:8418` / 外网 `code.innev.cn`),未命中回退官方源不硬失败;FROM 改写只作用 CI 克隆副本**。为什么:内网 runner 直连 docker.io 慢/超时,images 命名空间已同步常用基础镜像,优先内网源又快又稳;livebook:8418 是 LAN 明文、code.innev.cn 是 WAN TLS,写死任一地址换网络环境必挂——必须运行时探测;仓库 Dockerfile 要在任意网络可构建,不能把内网地址烙进源码。 +- ⑩ **基础镜像强制落盘内部源 `{registry}/images`:命中直接改写 FROM;未命中先 `docker pull` 官方源 → `docker push` 到 `{registry}/images` 落盘 → 再改写 FROM;仅拉取/推送失败才回退官方源(告警不硬失败)。拉取前强制网络检测选址(内网 `livebook:8418` / 外网 `code.innev.cn`);改写只作用 CI 克隆副本**。为什么:内网 runner 直连 docker.io 慢/超时——新基础镜像首次构建即同步落盘,后续构建全部命中内网源、越构建越快,不再依赖组织提前手工同步;livebook:8418 是 LAN 明文、code.innev.cn 是 WAN TLS,写死任一地址换网络环境必挂——必须运行时探测;同步失败只告警回退,不让镜像源问题阻塞发版;仓库 Dockerfile 要在任意网络可构建,不能把内网地址烙进源码。 ## 凭证与配置 @@ -148,8 +150,8 @@ description: 按统一规范给项目生成或评审优化 Gitea Actions 构建 | 推 tag 后 Actions 没动静 | 仓库未启用 Actions Units / tag 不是 v 开头 | 仓库设置启用 Actions;tag 改 v 开头重打 | | 镜像 push 阶段失败(http 相关报错) | buildkitd.toml 未声明 `http=true`(buildkitd 不继承宿主 insecure-registries) | 按约束③补齐注入(本规范模板已含) | | 构建拉基础镜像超时 | docker-container 驱动不继承宿主 registry-mirrors | 经 buildkitd.toml 注入 INNEV_DOCKERHUB_MIRRORS | -| 优选步骤全部显示「内部源未命中」 | images 命名空间未同步该基础镜像 | 在 Gitea images 组织确认/同步对应镜像;流水线自动回退官方源,不阻塞 | -| 优选/构建拉 livebook:8418 报 http 相关错误 | buildkitd.toml 缺该 registry 的 http=true 声明 | 模板已含条件注入;旧 workflow 按约束③⑩补齐 | +| 同步步反复出现「同步失败」告警 | 宿主 pull 官方源超时(mirrors 未配)/ push 到 images 被拒(token 缺 write:package 或对 images 组织无写权限 / 宿主 daemon.json 未登记 livebook:8418 insecure-registries) | 配宿主 registry-mirrors;确认 INNEV_REGISTRY_TOKEN scope 与 images 组织写权限、daemon.json 登记并重启 docker——同步失败只告警回退官方源,不阻塞构建 | +| 同步/构建拉 livebook:8418 报 http 相关错误 | buildkitd.toml 缺该 registry 的 http=true 声明 | 模板已含条件注入;旧 workflow 按约束③⑩补齐 | | 外网 runner 检测命中 code.innev.cn 但拉取失败 | token 失效或 runner 无外网 | 确认 INNEV_REGISTRY_TOKEN 有效(同一 Gitea 实例内外网凭证通用)、runner 可出外网 | | 部署机 `docker pull` 报 `HTTP response to HTTPS client` | 宿主 daemon.json 未登记 LAN 明文 registry | 登记 insecure-registries 并重启 docker(人工),或前缀改 TLS 地址 | | 健康检查超时/失败 | runtime-node 首启 install+build 数分钟窗口太短;或 .env 缺 key | 按约束⑧放宽窗口;看容器日志确认缺哪个 key | @@ -174,4 +176,4 @@ die 消息统一三段式:是什么 + 为什么(后果) + 怎么办。 - 提交推送代码并写日报(归 push-and-report) - 手工构建推送业务镜像发版(归 xgent-image-push / xgent-app-release) - 修改 runtime 基础镜像本身(归 runtime-base 仓库维护) -- 基础镜像同步进 `{registry}/images` 命名空间(组织级镜像维护动作;本 skill 只管流水线侧的优选与回退) +- `{registry}/images` 命名空间的组织级批量同步与清理(本 skill 让流水线在构建时对未命中的 FROM 按需同步落盘,日常构建即自然积累;批量预同步/下架清理不归本 skill) diff --git a/skills/gitea-actions/references/docker-deploy-template.yaml b/skills/gitea-actions/references/docker-deploy-template.yaml index 65a58f4..72c92d5 100644 --- a/skills/gitea-actions/references/docker-deploy-template.yaml +++ b/skills/gitea-actions/references/docker-deploy-template.yaml @@ -18,8 +18,9 @@ # 命名约定:自定义变量/密钥一律 INNEV_ 前缀(仓库 → 设置 → Actions 配置,清单见本文件尾部注释)。 # 凭证回退链:INNEV_REGISTRY_USER / INNEV_REGISTRY_TOKEN → gitea.actor / 内置 GITHUB_TOKEN; # INNEV_CI_TOKEN → GITHUB_TOKEN。加了即生效。 -# 基础镜像:拉取前强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn),FROM 优先 -# /images 命名空间,未命中回退官方源;改写只作用 CI 克隆副本,不动仓库 Dockerfile。 +# 基础镜像:拉取前强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn);FROM 命中 +# /images 直接改写,未命中先拉官方源推送落盘到该命名空间再改写(同步失败回退官方源); +# 改写只作用 CI 克隆副本,不动仓库 Dockerfile。 # 镜像 tag = 版本号(git tag,如 v1.2.3)+ latest;手动 dispatch 无 tag 上下文时回退提交短 sha。 name: docker-deploy @@ -49,7 +50,8 @@ env: # 服务器上单独维护的 .env 绝对路径(key 与仓库 .env.example 一致);.env 不进 git/镜像 INNEV_ENV_FILE: ${{ vars.INNEV_ENV_FILE || '/etc/{{PROJECT}}/.env' }} # 基础镜像内网源 registry——默认空 = 强制网络检测自动选址(内网 livebook:8418 / 外网 - # code.innev.cn);显式设置覆盖探测结果。FROM 命中 <该值>/images 即改写为内部引用,缺失回退官方源 + # code.innev.cn);显式设置覆盖探测结果。FROM 命中 <该值>/images 即改写为内部引用; + # 未命中先拉官方源推送落盘到该命名空间再改写,同步失败回退官方源 INNEV_IMAGES_REGISTRY: ${{ vars.INNEV_IMAGES_REGISTRY || '' }} jobs: @@ -73,7 +75,7 @@ jobs: # 从 /images 拉基础镜像之前必须强制网络检测选址:livebook:8418 是 LAN 明文 HTTP、 # code.innev.cn 是 WAN TLS——写死任一地址,换个网络环境流水线必挂。均不可达则置空, - # 后续优选步整体回退官方源(buildkitd.toml 的 docker.io mirrors 兜底)。 + # 后续同步/改写步整体跳过,基础镜像全走官方源(buildkitd.toml 的 docker.io mirrors 兜底)。 - name: 强制网络检测(基础镜像源选址) run: | REG="${INNEV_IMAGES_REGISTRY#*://}" @@ -130,13 +132,18 @@ jobs: cat buildkitd.toml docker buildx create --use --name {{PROJECT}}builder --config buildkitd.toml - # 基础镜像强制优选内部源:src 副本 Dockerfile 里命中 /images 的 FROM 改写为内部引用, - # 未命中保持原样(构建时经 buildkitd.toml 的 docker.io mirrors 回退官方源),不硬失败。 + # 基础镜像强制落盘内部源:src 副本 Dockerfile 里每个官方源 FROM—— + # ① /images 已存在 → 直接改写为内部引用; + # ② 未命中 → docker pull 官方源(宿主 daemon registry-mirrors 加速)→ tag 后 push 到 + # /images 落盘 → 再改写引用——新镜像一次构建即入内部源,后续构建全部内网命中; + # ③ 拉取/推送失败 → 保留官方源引用并告警(buildkitd.toml 的 docker.io mirrors 兜底),不硬失败。 + # push 走部署机宿主 docker:LAN 明文 registry 需宿主 daemon.json 已登记 insecure-registries + # (一次性人工准备第 2 条),token 需 write:package 且对 images 组织有写权限。 # 只改 CI 克隆出的副本,不动仓库 Dockerfile——同一 Dockerfile 在任意网络环境都要可构建。 - - name: 基础镜像优选内部源(images 命名空间,缺失回退官方源) + - name: 基础镜像同步入 images 并改写 FROM(未命中先拉取推送落盘) run: | if [ -z "$INNEV_IMAGES_REGISTRY" ]; then - echo "内部镜像源不可用,跳过优选,基础镜像全部走官方源" + echo "::warning::内部镜像源不可用,基础镜像全部走官方源(未执行同步落盘)" exit 0 fi cd src @@ -145,22 +152,31 @@ jobs: { grep -niE '^[[:space:]]*FROM[[:space:]]' Dockerfile || true; } | cut -d: -f1 | while read -r N; do REF=$(awk -v n="$N" 'NR==n{for(i=2;i<=NF;i++){if($i ~ /^--/) continue; print $i; exit}}' Dockerfile) case "$REF" in ''|scratch|'$'*|*@*) echo "跳过 ${REF:-空引用}(scratch/ARG/digest)"; continue ;; esac - W="${REF#docker.io/}" # 显式 docker.io 前缀视同官方源,纳入优选 + W="${REF#docker.io/}" # 显式 docker.io 前缀视同官方源,纳入同步 # 仅当含 / 时才可能带 registry:首段含 . 或 : 或是 localhost 即视为已带 registry,保持原样 - case "$W" in */*) case "${W%%/*}" in *.*|*:*|localhost) echo "跳过 $REF(已带 registry)"; continue ;; esac ;; esac - if echo "$STAGES" | grep -qx "$W"; then echo "跳过 $REF(构建阶段名)"; continue; fi + case "$W" in */*) case "${W%%/*}" in *.*|*:*|localhost) echo "跳过 ${REF}(已带 registry)"; continue ;; esac ;; esac + if echo "$STAGES" | grep -qx "$W"; then echo "跳过 ${REF}(构建阶段名)"; continue; fi NAME="${W%%:*}"; if [ "$NAME" = "$W" ]; then TAG=latest; else TAG="${W##*:}"; fi NAME="${NAME#library/}" CAND="$INNEV_IMAGES_REGISTRY/images/$NAME:$TAG" if docker buildx imagetools inspect "$CAND" >/dev/null 2>&1; then - ESC=$(printf '%s' "$REF" | sed 's/[.[\*^$/]/\\&/g') - sed -i "${N}s|$ESC|$CAND|" Dockerfile - echo "优选命中:$REF → $CAND" + echo "内部源已存在:$CAND" else - echo "内部源未命中,保留官方源:$REF" + echo "内部源未命中,同步落盘:$REF → $CAND" + if docker pull "$REF" && docker tag "$REF" "$CAND" && docker push "$CAND"; then + # 宿主本地留两份基础镜像副本纯属占盘(buildx docker-container 不用宿主镜像存储),推完即删 + docker rmi "$REF" "$CAND" >/dev/null 2>&1 || true + echo "同步完成:$CAND" + else + echo "::warning::同步 $REF 失败(pull/push 未成功),保留官方源引用" + continue + fi fi + ESC=$(printf '%s' "$REF" | sed 's/[.[\*^$/]/\\&/g') + sed -i "${N}s|$ESC|$CAND|" Dockerfile + echo "FROM 改写:$REF → $CAND" done - echo '--- 优选后的 FROM 行 ---' + echo '--- 改写后的 FROM 行 ---' grep -niE '^[[:space:]]*FROM[[:space:]]' Dockerfile || true # [OPTIONAL:PRE_BUILD] 项目有特殊预构建步骤(如从源码构建工具二进制)时取消注释并改写本步, @@ -216,7 +232,7 @@ jobs: - name: 重建 {{PROJECT}} 容器 run: | IMAGE="$INNEV_IMAGE_PREFIX/{{PROJECT}}:$IMAGE_TAG" - [ -f "$INNEV_ENV_FILE" ] || { echo "::error::服务器上未找到 $INNEV_ENV_FILE——请按 .env.example 的 key 创建,或用仓库变量 INNEV_ENV_FILE 指向实际路径"; exit 1; } + [ -f "$INNEV_ENV_FILE" ] || { echo "::error::服务器上未找到 ${INNEV_ENV_FILE}——请按 .env.example 的 key 创建,或用仓库变量 INNEV_ENV_FILE 指向实际路径"; exit 1; } # [OPTIONAL:ENV_KEY_CHECKS] 项目有硬性必需的 .env key 时保留本块(按 .env.example 渲染, # 每个 key 一行 grep 检查),否则连同标记整块删除。示例: # grep -q '^DATABASE_URL=.' "$INNEV_ENV_FILE" || { echo "::error::$INNEV_ENV_FILE 缺少 DATABASE_URL"; exit 1; } @@ -248,7 +264,7 @@ jobs: for i in $(seq 1 90); do if curl -fsS "http://127.0.0.1:${INNEV_HOST_PORT}{{HEALTH_PATH}}"; then echo "" - echo "部署完成:http://127.0.0.1:${INNEV_HOST_PORT}(镜像 $INNEV_IMAGE_PREFIX/{{PROJECT}}:$IMAGE_TAG)" + echo "部署完成:http://127.0.0.1:${INNEV_HOST_PORT}(镜像 $INNEV_IMAGE_PREFIX/{{PROJECT}}:${IMAGE_TAG})" exit 0 fi sleep 5 @@ -335,10 +351,12 @@ jobs: # host-gateway 访问不通——实测踩坑,切勿写错。 # 7. 日常发布:git tag v1.2.3 && git push origin v1.2.3(tag 需 v 开头才会触发流水线); # 部署成功后 cleanup 自动删除本机与 Gitea Packages 里的旧版本镜像,无需人工干预。 -# 8. 基础镜像内网源:组织已在 Gitea images 命名空间同步常用基础镜像(如 images/golang:1.25-alpine)。 -# 构建前强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn),命中即把 src 副本 -# Dockerfile 的 FROM 改写为 /images/*,未命中自动回退官方源——全自动无需人工干预, -# 只需保证 images 命名空间持续同步需要的基镜像。 +# 8. 基础镜像内网落盘:构建前强制网络检测选址(内网 livebook:8418 / 外网 code.innev.cn)。 +# src 副本 Dockerfile 的官方源 FROM 命中 /images 即直接改写;未命中时流水线 +# 自动 docker pull 官方源、push 到 /images 落盘后再改写——新基础镜像一次构建 +# 即入内部源,后续构建全部内网命中,无需组织提前手工同步。同步失败仅告警并回退官方源, +# 不阻塞构建。push 走部署机宿主 docker:livebook:8418 需已登记 daemon.json +# insecure-registries(见第 2 条),token 需 write:package 且对 images 组织有写权限。 # # 仓库 → 设置 → Actions 配置清单 # 变量(Variables): @@ -351,7 +369,8 @@ jobs: # INNEV_ENV_FILE 服务器上 .env 的绝对路径,默认 /etc/{{PROJECT}}/.env(见上方准备 6) # INNEV_IMAGES_REGISTRY 基础镜像内网源 registry——默认空 = 强制网络检测自动选址 # (内网 livebook:8418 / 外网 code.innev.cn);显式设置覆盖探测结果。 -# FROM 命中 <该值>/images 即改写为内部引用,缺失回退官方源 +# FROM 命中 <该值>/images 即改写;未命中先拉官方源推送落盘到 +# 该命名空间再改写,同步失败回退官方源 # 密钥(Secrets): # INNEV_REGISTRY_USER docker login 账号——跨命名空间推包时必需(同命名空间可回退 gitea.actor) # INNEV_REGISTRY_TOKEN docker login token(scope: write:package + read:package); diff --git a/skills/gitea-actions/scripts/check-workflow.sh b/skills/gitea-actions/scripts/check-workflow.sh index 19ab593..7fa5ecd 100644 --- a/skills/gitea-actions/scripts/check-workflow.sh +++ b/skills/gitea-actions/scripts/check-workflow.sh @@ -91,11 +91,12 @@ else bad "⑨ 缺基础镜像源强制网络检测——内网 livebook:8418 / 外网 code.innev.cn 必须运行时探测选址" fi -# ⑩ FROM 强制优选 /images 内部源,未命中回退官方源 -if grep -q 'INNEV_IMAGES_REGISTRY/images/' "$FILE"; then - pass "⑩ FROM 优选 /images 内部源(未命中回退官方源)" +# ⑩ FROM 强制落盘 /images 内部源:命中直接改写,未命中先拉取官方源推送落盘再改写 +if grep -q 'INNEV_IMAGES_REGISTRY/images/' "$FILE" \ + && grep -qE 'docker push.*(CAND|INNEV_IMAGES_REGISTRY)' "$FILE"; then + pass "⑩ FROM 未命中先同步入 /images 落盘再改写(失败回退官方源)" else - bad "⑩ 缺 FROM 优选内部源步骤——基础镜像应优先 /images,未命中回退官方源" + bad "⑩ 缺基础镜像同步落盘逻辑——FROM 未命中 images 时应先 docker pull 官方源并 push 入 /images 落盘再改写,而非仅回退官方源" fi if [ "$fail" -ne 0 ]; then