我正在尝试构建一个由 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)
一切都如我所愿,但我觉得有更好的方法来做到这一点。
有没有办法,如果比较相同,可以简单地跳过管道的下一个阶段,但仍然让管道以“通过”而不是“失败”完成?
根据 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 退出
我能想到的有两种解决方案。不幸的是,它们要么使 UI 行为有些混乱,要么您必须适应所有工作。
作业属性如only或changes仅与 git 存储库的状态或文件有关(请参阅https://docs.gitlab.com/ee/ci/yaml/),因此在此处不使用,因为该文件仅在CI 而不是存储库的一部分。
解决方案1:可以allow_failure: true到第一个工作。尽管作业失败,但这会将管道标记为成功,并且后续作业将不会执行,因为第一个作业没有成功。缺点是当您调查管道时,此作业将显示感叹号而不是绿色勾号。
解决方案 2:当没有更改时,第一个作业不会失败,而是inventory.json删除文件。当文件不存在时,所有后续作业直接以退出代码 0 终止。请注意,这仅适用于inventory.json被标记为工件。
| 归档时间: |
|
| 查看次数: |
7894 次 |
| 最近记录: |