Раздел.gitlab-ci.yml after_script: как я могу определить, успешно ли выполнена задача?
Я использую Gitlab CI, и поэтому работаю над довольно сложным .gitlab-ci.yml
файл. Файл имеет after_script
секция, которая запускается, когда основная задача выполнена или основная задача как-то не выполнена. Проблема: мне нужно выполнить другую очистку в зависимости от того, была ли основная задача выполнена успешно или нет, но я не могу найти переменную CI Gitlab, которая указывает результат основной задачи.
Как я могу сказать, внутри after_script
раздел, была ли основная задача выполнена или не выполнена?
4 ответа
Вместо того, чтобы определить, была ли задача выполнена успешно или нет в after_script
Я бы предложил определить другой этап и использовать синтаксис when, где вы можете использовать when: on_failure
или же when: on_success
,
Пример из документации:
stages:
- build
- cleanup_build
- test
- deploy
- cleanup
build_job:
stage: build
script:
- make build
cleanup_build_job:
stage: cleanup_build
script:
- cleanup build when failed
when: on_failure
test_job:
stage: test
script:
- make test
deploy_job:
stage: deploy
script:
- make deploy
when: manual
cleanup_job:
stage: cleanup
script:
- cleanup after jobs
when: always
Начиная с gitlab-runner 13.5, вы можете использовать
CI_JOB_STATUS
переменная.
test_job:
# ...
after_script:
- >
if [ $CI_JOB_STATUS == 'success' ]; then
echo 'This will only run on success'
else
echo 'This will only run when job failed or is cancelled'
fi
См. документацию GitLab по предопределенным_переменным: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html .
Принятый ответ может относиться к большинству ситуаций, но он не отвечает на первоначальный вопрос и будет работать, только если у вас есть только одна работа на этап.
Примечание. Там в настоящее время открыт запрос функции ( эмитентов / 3116) для обработки. on_failure
а также on_success
в after_script
,
Можно было бы использовать переменные для передачи статуса задания after_script
сценария, но здесь также открыт запрос функции ( Issues / 1926), чтобы иметь возможность обмениваться переменными между before_script
, script
а также after_script
,
Одним из обходных путей будет запись во временный файл, который будет доступен во время after_script
блок.
test_job:
stage: test
before_script:
- echo "FAIL" > .job_status
script:
- exit 1
- echo "SUCCESS" > .job_status
after_script:
- echo "$(cat .job_status)"
Просто еще один способ справиться с этим, если вы хотите настроитьif failure
поведение.
scripts:
- ./script_that_fails.sh > /dev/null 2>&1 || FAILED=true
- if [ $FAILED ]
then ./do_something.sh
fi
Примечание. У меня сработали и другие примеры, но я считаю эту реализацию более быстрой и подходящей для меня.