# #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:
Я не уверен, что это сейчас полезно, но со стороны это выглядит как чрезмерно сложный подход. Я должен сказать, что у меня ограниченные знания, и мой ответ основан на предположении:
QA/tests
репозиторий содержит определенные тестовые примеры для всех репозиториев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