如何在GitLab CI流水线中生成文件并校验其与已提交文件的差异
实现文件差异校验的配置补充方案
核心逻辑为执行生成脚本前后对比文件变更,存在差异则直接终止流水线,具体修改如下:
完整修改后的Job配置
js-run-graphql-gen: interruptible: true # 允许后续运行的同Job取消旧版本任务 extends: [.js-project-xxxxx.com] stage: build rules: - if: "$DEPLOY_xxxx == 'true'" # 显式跳过前端构建时不执行 - if: "$SKIP_FRONTEND == 'true'" when: never # 指定路径变更时触发Job - changes: - xxx/**/* script: # 【修改点1】恢复生成目录到当前提交的原始状态,排除环境干扰 # 请将下方路径替换为你实际GraphQL SDK生成的目录/文件路径 - git clean -fd src/generated/graphql/ - git checkout -- src/generated/graphql/ # 原有的SDK生成命令 - yarn workspace $WORKSPACE run graphql:gen # 【修改点2】校验文件差异,有变更则抛出错误 # 请将下方路径替换为你实际GraphQL SDK生成的目录/文件路径 - | # 检查已跟踪文件的变更 if ! git diff --exit-code src/generated/graphql/; then echo "错误:GraphQL SDK生成文件与当前提交不一致,请本地执行 yarn workspace $WORKSPACE run graphql:gen 后重新提交" exit 1 fi # 可选:检查未被git跟踪的新增生成文件 untracked=$(git status --porcelain src/generated/graphql/ | grep '^??') if [ -n "$untracked" ]; then echo "错误:检测到未提交的新增SDK文件:$untracked,请本地执行生成命令后提交所有变更" exit 1 fi
逻辑说明
git clean -fd <目标路径>:清理目标路径下所有未被git跟踪的缓存文件,避免环境残留影响对比结果git checkout -- <目标路径>:将目标路径的文件恢复到当前合并请求提交的原始状态git diff --exit-code <目标路径>:对比生成后的文件和原始提交文件的差异,存在差异时返回非0错误码,直接终止Job,同时会在日志中输出具体的变更内容- 可选的未跟踪文件检查:覆盖生成了新SDK文件、但未提交的场景,避免遗漏未跟踪的新增文件
内容的提问来源于stack exchange,提问作者hektik
相关产品推荐
相关产品推荐

