我需要一个可以手动执行或按夜间计划自动运行的任务。我找到了这个解决方案:
rules:
- changes:
- scheduled
when: always
- when: manual
该解决方案的问题是,当创建新管道并且任务未运行时,管道将陷入阻塞状态,直到我手动运行它。
为了避免这种情况,我找到了一个建议的解决方法来添加:
allow_failure: true
但这又带来了一个问题,如果任务在夜间运行时失败,那么管道不会失败,并且我不会收到电子邮件通知。
有办法解决这个问题吗?
您可以使用
allow_failure
有条件地设置 rules:
。因此,不要在作业上设置 allow_faulure:
键,而是在任何导致作业变为“手动”的规则中进行设置。
rules:
- changes:
- scheduled
when: always
- when: manual
allow_failure: true
此外,根据您的描述,最好使用如下规则:
myjob:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
when: always
allow_failure: false
- when: manual
allow_failure: true
防止管道被此作业阻塞的另一种选择是让它在
.post
阶段运行,并使用 needs: []
让它立即运行。这样,它就永远不会导致其他作业等待它。
myjob:
needs: []
stage: .post
# ...
可能有更好的解决方案,但另一种解决方法可能是有两个单独的作业,其中包含规则并模板化其他所有内容。例如:
.build_template: &build_template
image: ubuntu:18.04
script:
- echo "hello world"
build_manual:
<<: *build_template
when: manual
except:
- schedules
build_nightly:
<<: *build_template
only:
- schedules