如何让GitLab定时流水线触发的子任务仅在指定日期运行
实现方案
方案1:父流水线判断星期后传递控制变量(推荐)
该方案将日期判断逻辑集中在主调度流水线侧,后续调整规则无需批量修改子项目配置,适合子项目较多的场景。
- 第一步:修改主流水线配置,新增前置步骤计算当前工作日,触发子流水线时传递标识变量
主项目gitlab.yml示例:
# 前置检查任务:计算当前是否为周一 pre-check-weekday: stage: .pre script: # date +%u 输出1-7对应周一到周日 - echo "IS_MONDAY=$(date +%u | grep -q '^1$' && echo 'true' || echo 'false')" >> build.env artifacts: reports: dotenv: build.env main job: needs: ["pre-check-weekday"] trigger: project: 你的子项目路径 # 向子流水线传递控制变量 variables: PARENT_TRIGGER: "true" IS_MONDAY: $IS_MONDAY
- 第二步:修改子流水线任务规则,仅在符合要求的场景下执行
子项目gitlab.yml示例:
child job: rules: # 场景1:非父流水线触发,直接执行,不受日期限制 - if: $PARENT_TRIGGER != "true" when: on_success # 场景2:父流水线触发,且当前不是周一才执行 - if: $PARENT_TRIGGER == "true" && $IS_MONDAY == "false" when: on_success # 其余场景不执行 - when: never script: - # 原有任务逻辑
方案2:子流水线自行判断(无需修改父流水线)
如果没有权限修改主流水线配置,可以将判断逻辑放在子流水线侧,通过GitLab内置变量区分触发来源。
子项目gitlab.yml示例:
child job: rules: # 非上游流水线触发,直接执行 - if: $CI_PIPELINE_SOURCE != "pipeline" when: on_success # 上游流水线触发时,先校验日期 - if: $CI_PIPELINE_SOURCE == "pipeline" before_script: # 被父流水线触发且为周一,直接正常退出跳过执行 - if [ $(date +%u) -eq 1 ]; then echo "周一被父流水线触发,跳过当前任务" && exit 0; fi script: - # 原有任务逻辑
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

