如何根据不同的跑步者跳过 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 一个 运行 人。所以我正在尝试使用 onlyrules 来跳过作业。我找到链接:https://gitlab.com/gitlab-org/gitlab/-/issues/21860 但正如问题所述,CI_RUNNER_EXECUTABLE_ARCH 不能在 onlyexceptrules 中使用。

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