如何根据不同的跑步者跳过 gitlab-ci.yml 中的工作?
How to skip job in gitlab-ci.yml base on different runner?
我正在使用 gitlab 作为我的 CI/CD 系统。我需要设置自己的 运行ner。
我有两个 运行ner,'windows' 和 'powershell' 以及 'macos' 和 'shell'。我希望他们中的任何一个都可以 运行 我的构建工作。 'macos' 是一台笔记本电脑,所以它并不总是在线。所以我写了两个版本的构建作业,希望只为不同的 运行ner.
执行其中一个
当我使用 运行ner 标签时,这两个作业都会执行。构建将执行两次。如果我的 'macos' 离线,build-mac
就会卡住。
build-win:
stage: build
tags:
- windows
script: powershell command...
build-mac:
stage: build
tags:
- macos
script: shell command...
所以我想我需要 'skip' 这份工作而不是 select 一个 运行 人。所以我正在尝试使用 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 predefined variables.
示例:
rules:
- if: $CI_RUNNER_TAGS == windows
或者:
rules:
- if: $CI_RUNNER_TAGS == macos
在 predefined variables 中没有看到任何关于 运行ner 在线状态的选项。
如果您想根据 运行 用户状态制定 运行 规则,您可能必须利用个人令牌(或项目令牌)才能达到 运行 ners 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
我正在使用 gitlab 作为我的 CI/CD 系统。我需要设置自己的 运行ner。 我有两个 运行ner,'windows' 和 'powershell' 以及 'macos' 和 'shell'。我希望他们中的任何一个都可以 运行 我的构建工作。 'macos' 是一台笔记本电脑,所以它并不总是在线。所以我写了两个版本的构建作业,希望只为不同的 运行ner.
执行其中一个当我使用 运行ner 标签时,这两个作业都会执行。构建将执行两次。如果我的 'macos' 离线,build-mac
就会卡住。
build-win:
stage: build
tags:
- windows
script: powershell command...
build-mac:
stage: build
tags:
- macos
script: shell command...
所以我想我需要 'skip' 这份工作而不是 select 一个 运行 人。所以我正在尝试使用 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 predefined variables.
示例:
rules:
- if: $CI_RUNNER_TAGS == windows
或者:
rules:
- if: $CI_RUNNER_TAGS == macos
在 predefined variables 中没有看到任何关于 运行ner 在线状态的选项。
如果您想根据 运行 用户状态制定 运行 规则,您可能必须利用个人令牌(或项目令牌)才能达到 运行 ners 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