执行摘要
- 一句话:重构 CI 日志获取脚本输出文件名逻辑
- 推荐动作:该 PR 为维护性小改进,逻辑简单清晰,无需深入精读。CI 相关开发者可了解变化,确保下游脚本适配新行为(特别是文件名变更和覆盖保护)。
功能与动机
CI 日志获取脚本在并行拉取同一个 build 下多个 job 的日志时,原先默认文件名仅使用 UUID 前 8 个字符,而同一 build 内 job UUID 的前 8 个字符可能相同,导致文件名冲突并被互相覆盖。PR body 明确指出:'Updated output filename logic to ensure uniqueness when fetching logs for multiple jobs in parallel.'
实现拆解
- 注释说明:在脚本开头的注释块中添加了使用说明,解释默认输出路径格式
ci-<build>-<uuid_first_13_chars>.log,并说明为什么需要第二个片段保证唯一性。
- 变量默认值后移:将原直接赋值的
OUT 变量改为先置空,后续统一构造默认文件名,使逻辑分支更清晰。
- 文件名构造增加字符数:默认文件名中的 UUID 片段从
{JOB:0:8}(前 8 字符)改为 {JOB:0:13}(前 13 字符),确保同一 build 内不同 job 的默认文件名唯一。
- 新增覆盖保护:检查
$OUT 指向的文件是否已存在,若存在且环境变量 CI_FETCH_LOG_FORCE 未设置,则退出并报错,提示用户指定显式路径或设置环境变量强制覆盖。
关键文件:
.buildkite/scripts/ci-fetch-log.sh(模块 CI 脚本;类别 other;类型 core-logic): 唯一变更文件,重构输出文件名处理和覆盖保护。
关键符号:未识别
关键源码片段
.buildkite/scripts/ci-fetch-log.sh
唯一变更文件,重构输出文件名处理和覆盖保护。
# Default output path: ci-<build>-<uuid_first_13_chars>.log (e.g.
# ci-68478-019e6b07-daae.log). Jobs in the same build share the UUID's
# first 8 chars, so the second segment is needed for uniqueness when
# fetching multiple jobs in parallel. The script refuses to overwrite an
# existing output file; pass an explicit path or set CI_FETCH_LOG_FORCE=1
# to override.
... # 原逻辑:OUT="${2:-ci-${BUILD}-${JOB:0:8}.log}"
# 改为先置空,后续统一处理
OUT="${2:-}"
if [ -z "$OUT" ]; then
# 使用前 13 个字符确保唯一性
OUT="ci-${BUILD}-${JOB:0:13}.log"
fi
# 若文件已存在且无强制覆盖标志,则拒绝覆盖并提示
if [ -e "$OUT" ] && [ -z "${CI_FETCH_LOG_FORCE:-}" ]; then
echo "Refusing to overwrite existing $OUT (set CI_FETCH_LOG_FORCE=1 or pass an explicit output path)." >&2
exit 1
fi
评论区精华
无 review 评论。
风险与影响
- 风险:风险极低。变更仅影响 CI 内部脚本的日志获取流程,不涉及任何推理、模型或核心业务逻辑。可能的风险包括:
- 用户依赖旧默认文件名时可能找不到文件(可通过显式指定路径解决)。
- 新增的覆盖保护可能使未设置
CI_FETCH_LOG_FORCE 的脚本在重跑时失败,但这是预期行为,且报错信息清晰。
- 影响:影响范围仅限于使用
ci-fetch-log.sh 的 CI 作业。对正常 CI 流程无负面影响;对并行获取多个 job 日志的场景,可避免数据覆盖,提升可靠性。属于正向改进。
- 风险标记:文件名变更
关联脉络
参与讨论