为何GitLab流水线在合并请求触发时仅运行最后一个阶段?
实现GitLab流水线:手动触发全阶段,MR触发仅运行最后阶段(带依赖)
要实现手动点击「Run pipeline」时运行所有阶段,合并请求触发时仅运行最后阶段且满足依赖关系,同时每个阶段至少有一个无rules任务的需求,可参考以下配置方案:
基础配置示例
stages: - build - test - deploy # Build阶段:无rules任务,仅手动触发时运行 build:main: stage: build script: - echo "执行实际构建操作:编译代码、打包镜像等" # 替换为你的构建命令 only: - web # 匹配手动触发场景 # Test阶段:无rules任务,仅手动触发时运行 test:main: stage: test script: - echo "执行实际测试操作:单元测试、集成测试等" # 替换为你的测试命令 only: - web # Deploy阶段:手动/MR触发均运行,支持可选依赖 deploy:final: stage: deploy script: - echo "执行实际部署操作:推送镜像、部署到服务器等" # 替换为你的部署命令 needs: - job: build:main optional: true # MR触发时该任务不存在,跳过依赖检查 - job: test:main optional: true rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # MR触发时运行 - if: $CI_PIPELINE_SOURCE == 'web' # 手动触发时运行
配置说明
- 阶段定义:明确
build、test、deploy三个执行阶段,确保流水线按顺序推进。 - 无rules任务实现:
build:main和test:main未配置rules字段(符合需求中“无rules任务”的要求),通过only: web限制仅在手动触发(点击「Run pipeline」)时运行,合并请求触发时不会创建这两个任务。 - Deploy阶段依赖处理:
用rules同时支持手动和MR两种触发场景;needs: optional: true设置可选依赖:手动触发时,必须等build:main和test:main执行完成才会启动deploy:final;MR触发时,因前两个任务不存在,流水线会跳过依赖检查直接运行deploy:final。
进阶优化:依赖手动触发的构建产物
如果MR触发的部署任务需要依赖手动触发时生成的构建产物,可结合GitLab工件(Artifacts)实现:
build:main: stage: build script: - echo "执行构建操作" - mkdir -p dist - echo "构建产物示例" > dist/output.txt only: - web artifacts: paths: - dist/ expire_in: 1 week # 设置工件过期时间 deploy:final: stage: deploy script: - | if [ "$CI_PIPELINE_SOURCE" = "merge_request_event" ]; then # 下载最新成功的手动流水线的Build工件 curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/main/download?job=build:main" -o artifacts.zip unzip artifacts.zip fi - echo "基于工件执行部署操作" needs: - job: build:main optional: true - job: test:main optional: true rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_PIPELINE_SOURCE == 'web'
内容的提问来源于stack exchange,提问作者LoadingPleaseWait
相关产品推荐
相关产品推荐

