GitLab CI - 仅在计划的管道上自动运行任务

use*_*273 5 gitlab gitlab-ci

我需要一个可以手动执行或按夜间计划自动运行的任务。我找到了这个解决方案:

  rules:
    - changes:
      - scheduled
      when: always
    - when: manual
Run Code Online (Sandbox Code Playgroud)

该解决方案的问题在于,当创建新管道并且任务未运行时,管道将陷入阻塞状态,直到我手动运行它。

为了避免这种情况,我找到了一个建议的解决方法来添加:

 allow_failure: true
Run Code Online (Sandbox Code Playgroud)

但这又带来了一个问题,如果任务在夜间运行时失败,那么管道不会失败,并且我不会收到电子邮件通知。

有办法解决这个问题吗?

syt*_*ech 12

您可以allow_failure使用 有条件地设置rules:。因此,不要allow_faulure:在作业上设置密钥,而是在任何导致作业成为“手动”的规则中设置它。

  rules:
    - changes:
      - scheduled
      when: always
    - when: manual
      allow_failure: true
Run Code Online (Sandbox Code Playgroud)

另外,根据您的描述,最好使用如下规则:

myjob:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: always
      allow_failure: false
    - when: manual
      allow_failure: true
Run Code Online (Sandbox Code Playgroud)

防止管道被此作业阻塞的另一种方法是让它在阶段中运行.postneeds: []立即运行。这样,它就永远不会导致其他作业等待它。

myjob:
  needs: []
  stage: .post
  # ...
Run Code Online (Sandbox Code Playgroud)


Rek*_*vni 3

可能有更好的解决方案,但另一种解决方法可能是有两个单独的作业,其中包含规则并模板化其他所有内容。例如:

.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
Run Code Online (Sandbox Code Playgroud)