Gitlab CI 管道 - 仅在特定条件下继续进入下一阶段

Mar*_*n W 9 gitlab gitlab-ci

我正在尝试构建一个由 4 个作业组成的 Gitlab 管道。我的阶段是:

stages:
- compare
- build
- test
- deploy
Run Code Online (Sandbox Code Playgroud)

比较阶段从另一台服务器上的 API 获取转储,将其与上次成功管道运行的相同转储进行比较(它作为工件提供),然后比较两者。如果有任何区别,我希望管道进入下一阶段,如果没有区别,那么我希望它优雅地退出。

我让它工作,但如果没有差异,它会失败并且管道被标记为失败,而不是正常退出,这是它的外观。

在此处输入图片说明

这是我的 .gitlab-ci.yaml 中的重要代码(删除了一些识别信息)

Get_inventory_dump:
  stage: compare  
  only:
    - schedules
  script: 
    - 'curl -k --output "previous-inventory.json" --header "PRIVATE-TOKEN: $user_token" "https://url/to/get/artifact/from/last/successful/run"'
    - python3 auto_config_scripts/dump_device_inventory_api_to_json.py -p $pass -o /inventory.json -u https://url/for/inventory/dump -y
    - /usr/bin/cmp previous-inventory.json inventory.json && echo "No Change in inventory since last successful run" && exit 1 || echo "Inventory has changed since last run, continue" && exit 0
  artifacts:
    when: on_success
    expire_in: 4 weeks
    paths:
     - inventory.json

Generate_icinga_config:
  stage: build
  only:
    - schedules
  when: on_success
  script: 
Run Code Online (Sandbox Code Playgroud)

一切都如我所愿,但我觉得有更好的方法来做到这一点。

有没有办法,如果比较相同,可以简单地跳过管道的下一个阶段,但仍然让管道以“通过”而不是“失败”完成?

Mar*_*n W 6

根据 Fzgregors 的建议,这就是我解决问题的方法:如果存在差异并且我希望我的第二阶段实际做一些工作,我创建了一个名为“继续”的文件并将其作为工件提供。

第二阶段将查找该文件并使用 IF 语句来决定是否应该执行某些操作或直接退出

Get_inventory_dump:
  stage: compare  
  only:
    - schedules
  script: 
    - 'curl -k --output "previous-inventory.json" --header "PRIVATE-TOKEN: $user_token" "https://url/to/get/artifact/from/last/successful/run"'
    - python3 auto_config_scripts/dump_device_inventory_api_to_json.py -p $pass -o /inventory.json -u https://url/for/inventory/dump -y
    - /usr/bin/cmp previous-inventory.json inventory.json && echo "No Change in inventory since last successful run" || echo "Inventory has changed since last run, continue" && touch continue
  artifacts:
    when: on_success
    expire_in: 4 weeks
    paths:
     - inventory.json
     - continue

Generate_icinga_config:
  stage: build
  only:
    - schedules
  when: on_success
  script: 
    - if [[ -f continue ]]; then
        do some stuff;
      else
        echo "No Change in inventory, nothing to do";
      fi
Run Code Online (Sandbox Code Playgroud)

这允许我保留我的库存工件,但同时让下一阶段知道它是否需要做一些工作,或者什么都不做并以代码 0 退出

  • `Generate_icinga_config` 作业不应该有一个 `dependency: Get_inventory_dump` 吗? (3认同)

fzg*_*gor 5

我能想到的有两种解决方案。不幸的是,它们要么使 UI 行为有些混乱,要么您必须适应所有工作。

作业属性如onlychanges仅与 git 存储库的状态或文件有关(请参阅https://docs.gitlab.com/ee/ci/yaml/),因此在此处不使用,因为该文件仅在CI 而不是存储库的一部分。

解决方案1:可以allow_failure: true到第一个工作。尽管作业失败,但这会将管道标记为成功,并且后续作业将不会执行,因为第一个作业没有成功。缺点是当您调查管道时,此作业将显示感叹号而不是绿色勾号。

解决方案 2:当没有更改时,第一个作业不会失败,而是inventory.json删除文件。当文件不存在时,所有后续作业直接以退出代码 0 终止。请注意,这仅适用于inventory.json被标记为工件。