Я использую gitlab в качестве системы CI/CD. И мне нужно настроить свой собственный бегун. У меня есть два бегуна: «окна» с «powershell» и «macos» с «оболочкой». Я хочу, чтобы любой из них мог выполнять мою работу по сборке. «Макос» — это ноутбук, поэтому он не всегда онлайн. Поэтому я пишу две версии заданий сборки и надеюсь просто выполнить одну из них для другого бегуна.
Когда я использую теги бегуна, оба задания будут выполняться. И сборка будет выполняться дважды. Если мой «macos» не в сети, build-mac
застрянет.
build-win:
stage: build
tags:
- windows
script: powershell command...
build-mac:
stage: build
tags:
- macos
script: shell command...
Поэтому я думаю, что мне нужно «пропустить» задание, но не выбирать бегуна. Поэтому я пытаюсь использовать only
или rules
, чтобы пропустить задание. Я нахожу связь: https://gitlab.com/gitlab-org/gitlab/-/issues/21860
Но, как было сказано в выпусках, CI_RUNNER_EXECUTABLE_ARCH
нельзя использовать в only
, except
и rules
.
build-win:
stage: build
script: powershell command...
rules:
- if: $CI_RUNNER_EXECUTABLE_ARCH =~ /^windows.*/
build-mac:
stage: build
script: shell command...
rules:
- if: $CI_RUNNER_EXECUTABLE_ARCH =~ /^(darwin|linux).*/
Я думаю, что оба решения не подходят. Есть ли лучший способ сделать это? Спасибо~
Вы можете использовать $CI_RUNNER_TAGS или $CI_RUNNER_ID предопределенные переменные.
Пример:
rules:
- if: $CI_RUNNER_TAGS == windows
Или:
rules:
- if: $CI_RUNNER_TAGS == macos
Не вижу никаких параметров в предопределенные переменные для чего-то вроде онлайн-статуса бегуна.
Если вы хотите основывать правило запуска на статусе исполнителя, вам, вероятно, придется использовать личный токен (или, возможно, токен проекта), чтобы получить статус от API бегунов. Вы можете сделать что-то вроде этого:
stages:
- check-runner
- run
image: python
check runner:
stage: check-runner
script:
- curl --header "PRIVATE-TOKEN:$READ_RUNNERS_TOKEN" "$CI_API_V4_URL/runners?tag_list=unreliable"
- |
echo RUNNER_STATUS=$(\
curl --header "PRIVATE-TOKEN:$READ_RUNNERS_TOKEN" "$CI_API_V4_URL/runners?tag_list=macos" \
| python -c "import sys, json; print(json.load(sys.stdin)[0]['status'])" \
) >> .env
artifacts:
reports:
dotenv: .env
use tagged runner:
stage: run
script:
- echo $RUNNER_STATUS
dependencies:
- check runner
rules:
- if: '$RUNNER_STATUS == "online"'
tags:
- macos
user other runner:
stage: run
script:
- echo "used runner"
dependencies:
- check runner
rules:
- if: '$RUNNER_STATUS != "online"'
tags:
- windows
Спасибо. Многое узнаете из сценария. Действительно, я должен проверить статус бегуна в отдельной работе. Спасибо~
Спасибо, CI_RUNNER_TAGS — это разделенный запятыми список тегов бегуна. Так должен ли я использовать регулярное выражение с =~? Если и Windows, и Macos Runner подключены к сети, сборка будет выполняться дважды, но мне нужен только один. Есть ли способ справиться с этим?