Запустите конкретное задание в базе CI Gitlab при условии

# #gitlab #continuous-integration #gitlab-ci #gitlab-ci-runner

Вопрос:

У меня есть репо QA/tests , в котором я хочу запускать все задания, когда есть толчок к этому репо.

Я использовал скрипт для динамического создания заданий:

 job-generator:
  stage: generate
  tags:
    - kuber
  script:
    - scripts/generate-job.sh > generated-job.yml
  artifacts:
    paths:
      - generated-job.yml

main:
  trigger:
    include:
      - artifact: generated-job.yml
        job: job-generator
    strategy: depend
 

На следующем шаге у меня есть еще одно репо products/first , в котором я хочу выполнять определенную работу QA/tests при каждом нажатии, products/first поэтому я попытался:

 stages:
  - test

tests:
  stage: test
  variables:
    TARGET: first
  trigger:
    project: QA/tests
    branch: master
    strategy: depend
 

Затем я попытался определить глобальную TARGET: all переменную в своей основной gitlab-ci.yml и переопределить ее с TARGET: first помощью приведенного выше YAML.

generate-job.sh:

 #!/bin/bash

PRODUCTS=("first" "second" "third")

for P in "${PRODUCTS[@]}"; do
cat << EOF
$P:
  stage: test
  tags:
    - kuber
  script:
    - echo -e "Hello from $P"
  rules:
    - if: '"$TARGET" == "all"'
      when: always
    - if: '"$TARGET" == $P'
      when: always

EOF
done
 

Но безрезультатно. в нижележащем трубопроводе вообще нет никакой работы!

Есть идеи?

Ответ №1:

Я не уверен, что это сейчас полезно, но со стороны это выглядит как чрезмерно сложный подход. Я должен сказать, что у меня ограниченные знания, и мой ответ основан на предположении:

  1. QA/tests репозиторий содержит определенные тестовые примеры для всех репозиториев
  2. QA/tests имеет единственную цель-содержать тесты, а не обзор проектов и т.д.

Мое Предложение

Поскольку QA/tests он содержит только тесты, которые должны выполняться для каждого проекта, я бы создал из него образ docker, который содержит все тесты и может их фактически выполнять. (давайте назовем это qa-tests:latest )

В своих проектах я бы добавил шаг, который использует эти изображения, с моим исходным кодом проекта и выполняет тесты:

 qa-test:
  image: qa-tests:latest
  script:
    - echo "command to execute scripts"
  # add rules here accordingly
 

это решило бы проблему с каждым толчком в репозитории. Для более удобного использования я мог бы создать QA-Tests.gitlab-ci.yml файл, который может быть включен в подпроекты с

 include:
  - project: QA/tests
    file: QA-Tests.gitlab-ci.yml
 

таким образом, вам не нужно выполнять обновления в репозиториях, если фрагмент ci изменится.

Наконец, чтобы запустить выполнение при каждом нажатии, вам нужно только запустить конвейеры подпроектов из QA/tests .

Отказ от ответственности

Как я уже сказал, у меня их немного, так как описана цель, но не мотивация. При таком подходе вы удаляете некоторые вызовы директив — в основном те, которые запускаются из подпроектов в QA/тесты. И это создает четкую структуру, но она может не соответствовать вашим потребностям.

Ответ №2:

Я решил эту проблему с помощью:

gitlab-ci.yml:

 variables:
  TARGET: all

job-generator:
  stage: generate
  tags:
    - kuber
  script:
    - scripts/generate-job.sh > generated-job.yml
  artifacts:
    paths:
      - generated-job.yml

main:
  variables:
    CHILD_TARGET: $TARGET
  trigger:
    include:
      - artifact: generated-job.yml
        job: job-generator
    strategy: depend
 

и использовать CHILD_TARGET в моей generate-job.sh:

 #!/bin/bash

PRODUCTS=("first" "second" "third")

for P in "${PRODUCTS[@]}"; do
cat << EOF
$P:
  stage: test
  tags:
    - kuber
  script:
    - echo -e "Hello from $P"
  rules:
    - if: '$CHILD_TARGET == "all"'
      when: always
    - if: '$CHILD_TARGET == "$P"'
      when: always

EOF
done
 

Так что я мог бы позвонить из других подобных проектов:

 stages:
  - test

e2e-tests:
  stage: test
  variables:
    TARGET: first
  trigger:
    project: QA/tests
    branch: master
    strategy: depend