Трубопровод Gitlab CI - переход к следующему этапу только при определенных условиях - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь построить конвейер Gitlab, который состоит из 4 рабочих мест.У меня есть следующие этапы:

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: 

Все ведет себя так, как я ожидал, но я чувствую, что естьлучший способ сделать это.

Есть ли способ, если сравнение такое же, просто пропустить следующие этапы конвейера, но все же завершить конвейер как "пройденный", а не "неудачный"?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Основываясь на предложении 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

0 голосов
/ 15 февраля 2019

Есть два решения, которые я могу придумать.К сожалению, они либо приводят в замешательство поведение пользовательского интерфейса, либо вам приходится адаптировать все задания.

Атрибуты заданий, такие как only или changes, касаются только состояния или файлов репозитория git (см. https://docs.gitlab.com/ee/ci/yaml/) и поэтому здесь не используется, так как файл создается только во время CI и не является частью репозитория.

Решение 1: Вы можете allow_failure: true выполнить первое задание. Это пометит конвейеркак успешный, несмотря на сбой задания, и последующие задания не будут выполнены, так как первое задание не было выполнено успешно. Недостатком является то, что при исследовании конвейера вместо зеленого флажка для этого задания будет восклицательный знак.

Решение 2. Вместо того, чтобы проваливать первое задание при отсутствии изменений, удаляется файл * 1012. * И все последующие задания напрямую завершаются с кодом выхода 0, когда файл не существует. Обратите внимание, что это работает только потому, что inventory.jsonпомечен как артефакт.

...