Gitlab ci 如何实现-流程控制
在 GitLab CI/CD 中,流程控制主要通过 条件判断、阶段依赖、人工干预 等机制实现,以下是 7 种核心流程控制方法及具体示例:
一、条件执行(rules)
最灵活的流程控制方式,支持 if/changes/exists 等规则:
test:
script: pytest
rules:
- if: $CI_COMMIT_BRANCH == "main" # 仅main分支执行
- if: $CI_MERGE_REQUEST_ID # MR时执行
- changes: # 文件变化时执行
- src/**/*.py
- tests/*
- when: never # 默认拒绝
二、阶段依赖(needs)
打破阶段顺序限制,实现并行或选择性执行:
build: stage: build script: echo "Building..." unit_test: stage: test needs: ["build"] # 显式依赖build阶段 script: echo "Unit tests" e2e_test: stage: test needs: [] # 不依赖任何Job,立即执行 script: echo "E2E tests"
三、人工干预(when: manual)
需要手动点击才能继续流程:
deploy_prod:
stage: deploy
script: ./deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual # 手动批准后执行
- when: never
四、动态生成子流程(trigger)
根据条件触发不同的子 Pipeline:
generate_child:
stage: setup
script: ./generate-pipeline.py
artifacts:
paths:
- child-pipeline.yml
trigger_child:
stage: deploy
trigger:
include:
- artifact: child-pipeline.yml
job: generate_child
五、失败处理(allow_failure)
允许非关键任务失败而不中断流程:
notify_slack: script: ./notify.sh allow_failure: true # 即使失败也不阻塞后续Job
六、重试机制(retry)
自动重试失败的 Job:
flakey_test:
script: ./run-flakey-test.sh
retry:
max: 2 # 最多重试2次
when: runner_system_failure # 仅在系统错误时重试
七、超时控制(timeout)
防止 Job 无限卡死:
long_running_job: script: ./slow-process.sh timeout: 1 hour # 超时设置
流程控制组合示例
stages:
- build
- test
- deploy
variables:
DEPLOY_ENV: $CI_COMMIT_BRANCH == "main" ? "prod" : "staging"
build:
stage: build
script: docker build -t app .
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH
test:
stage: test
needs: ["build"]
script: ./run-tests.sh
retry: 2
timeout: 30 minutes
deploy:
stage: deploy
script: ./deploy-$DEPLOY_ENV.sh
rules:
- if: $DEPLOY_ENV == "prod"
when: manual
- if: $DEPLOY_ENV == "staging"
when: on_success
关键技巧
- 条件表达式:
- 文件变化检测:
- 变量驱动流程:
调试建议
- 可视化流程:GitLab Pipeline 页面可直观查看阶段依赖关系:
- 模拟运行:
通过组合这些方法,可以实现从简单线性流程到复杂决策树的完整控制。
进阶高级测试工程师 文章被收录于专栏
《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart
查看10道真题和解析
