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

时间:2019-02-15 09:59:56

标签: gitlab gitlab-ci

我正在尝试构建由4个工作组成的Gitlab管道。我所经历的阶段是:

stages:
- compare
- build
- test
- deploy

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

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

enter image description here

这是我的.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: 

一切都按照我的预期进行,但是我觉得有更好的方法来做到这一点。

有没有办法,如果比较是相同的,只是跳过管道的下一个阶段,但管道仍以“通过”而不是“失败”的方式完成?

3 个答案:

答案 0 :(得分:1)

我可以想到两种解决方案。不幸的是,它们要么使UI行为有些混乱,要么必须调整所有作业。

onlychanges这样的Job属性仅与git存储库的状态或文件有关(请参阅https://docs.gitlab.com/ee/ci/yaml/),因此在这里不再使用,因为该文件仅在CI期间创建,而不是存储库的一部分。

解决方案1:您可以allow_failure: true从事第一份工作。尽管作业失败,这仍将管道标记为成功,并且由于第一个作业未成功,后续作业将不会执行。缺点是,当您调查管道时,此作业将带有感叹号而不是绿色的勾号。

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

答案 1 :(得分:0)

基于Fzgregors的建议,这就是我解决问题的方式: 如果存在差异,并且我希望第二阶段实际进行一些工作,则创建了一个名为“ continue”的文件,并将其作为工件使用。

第二阶段将查找该文件,并使用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

这使我可以保留清单工件,但与此同时,让下一阶段知道它是否需要做一些工作或什么都不做,并且存在代码0

答案 2 :(得分:0)

我有一个基本相似的结构,我正在寻找基本相同的解决方案。

当我 allow_failure: true 我的后续作业确实执行时。

如果我使用图章文件,所有后续作业也会执行占用队列、运行程序等,即使它们不是必需的。

我希望有一个更简单的解决方案,但我认为我将不得不使用生成的 yaml 文件。这似乎是将决策等动态信息注入管道的唯一方法。