Gitlab запускает задание либо по триггеру, либо по изменениям - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь вызвать конкретное задание в CI после того, как одно из двух условий

  1. инициирует другое задание в том же конвейере ИЛИ
  2. изменения : somefile.txt

Мой CI такой, как описано

job1:
    stage: build
    script: 
    - echo "JOb1"
    - curl -X POST -F token=2342344444 -F "variables[TRIGGER_JOB]=job1" -F ref=master https://main.gitlab.myconmpanyxyz.com/api/v4/projects/1234/trigger/pipeline
    only:
     changes:
     - job1.md

job2: # This does not RUN as expected because of the TRIGGER_JOB set to job1
    stage: test
    script: 
    - echo "Job2"   
    rules:
    - if: $TRIGGER_JOB =="job2"

job3: # this RUNS as expected because of VARIABLE TRIGGER_JOB
    stage: test
    script: 
    - echo "Job3"   
    rules:
    - if: $TRIGGER_JOB =="job1"

job4: # this also RUNS, but this should not be the expected behavior 
    stage: test
    script: 
    - echo “job4“   
    rules:
    - if: $TRIGGER_JOB == "xyz"
    - changes: 
      - job4.md

После завершения job1 также необходимо вызвать job4 и , а не любые другие задания (job2 в этот случай). Поэтому я использую CURL для вызова самой работы. Если есть какие-либо более эффективные способы вызова заданной c работы в том же CI, пожалуйста, дайте мне знать. Я уже видел эту страницу переполнения стека, но это не помогает, потому что моя работа должна быть вызвана любым из 2 условий , что не разрешено, бит gitlab-ci.

Мне нужно, чтобы job4 вызывался по одному из двух условий - если TRIGGER_JOB == "job1" или есть какие-либо изменения в файле job4.md, В настоящее время job4 запускается, если в файл job4.md вносятся изменения, но также запускается и при запуске job1. Но на самом деле это не должно быть ожидаемым поведением. документы . Может кто-нибудь, пожалуйста, дайте мне несколько советов, как создать этот вид дизайна.

1 Ответ

0 голосов
/ 11 февраля 2020

Ваше решение было почти правильным, но ключевое слово changes с only или except работает только в том случае, если конвейер инициируется событием push или merge_request. Это определено в переменной CI_PIPELINE_SOURCE. Когда вы запускаете конвейер, вызывая API, переменная CI_PIPELINE_SOURCE содержит значение trigger и, следовательно, only:changes всегда возвращает true, что снова вызывает job1 и заканчивается бесконечным l oop. Вы можете добавить простое except правило к вашему job1, чтобы предотвратить это:

job1:
    stage: build
    script: 
    - echo "JOb1"
    - curl -X POST -F token=2342344444 -F "variables[TRIGGER_JOB]=job1" -F ref=master https://main.gitlab.myconmpanyxyz.com/api/v4/projects/1234/trigger/pipeline
    only:
     changes:
       - job1.md
    except:
      variables:
        - $CI_PIPELINE_SOURCE == "trigger"

Более подробную информацию о only/except:changes можно найти в документации .

...