GitLab CI手动启动job时如何触发依赖job避免依赖被提前清理
GitLab CI手动触发stage依赖问题解决方案
手动启动stage时自动运行前置stage的实现
GitLab CI 14.10及以上版本原生支持该能力:
- 网页端触发时,勾选界面上的*运行需要的前置作业(Run needed jobs)*选项,系统会自动识别目标stage下所有作业的依赖关系,重新执行缺失的前置步骤
- API触发时,添加参数
run_needed: true即可实现相同效果
其他可选解决方案
方案1:调整cleanup作业的触发规则
修改cleanup stage的触发逻辑,仅在手动stage执行完成后再运行清理操作,参考配置:
cleanup_job: stage: cleanup rules: # 定时流水线等不需要执行手动stage的场景直接清理 - if: $CI_PIPELINE_SOURCE == "schedule" when: always # 正常流水线需等待手动作业执行成功后再清理 - when: on_success needs: ["你的手动作业名称"]
如果不需要自动清理,也可以直接将cleanup作业设置为手动触发。
方案2:手动作业内置依赖拉取逻辑
给手动触发的作业单独配置依赖拉取步骤,不依赖全局前置拉取的结果。该方案无需调整原有流水线结构,兼容性最高,缺点是会重复执行依赖拉取操作。
方案3:依赖资源上传为流水线制品
将前置拉取的依赖打包上传为GitLab流水线制品,设置合理的过期时间,手动作业直接下载制品使用,不受本地清理操作影响,参考配置:
pull_deps: stage: deps script: - 拉取依赖的原有命令 - tar -zcf deps_package.tar.gz 你的依赖目录 artifacts: paths: - deps_package.tar.gz expire_in: 7d # 按需设置制品保留时间 manual_job: stage: manual_stage script: - tar -zxf deps_package.tar.gz - 手动作业的原有业务逻辑 when: manual
方案4:拆分多流水线触发
将自动执行流程和手动触发流程拆分为独立流水线,主自动流水线不执行cleanup操作,手动触发时拉起包含依赖拉取、业务逻辑、清理步骤的独立子流水线。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

