Как пропустить задание в базе gitlab-ci.yml на другом бегуне?

Я использую 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).*/

Я думаю, что оба решения не подходят. Есть ли лучший способ сделать это? Спасибо~

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать $CI_RUNNER_TAGS или $CI_RUNNER_ID предопределенные переменные.

Пример:

rules:
- if: $CI_RUNNER_TAGS == windows

Или:

rules:
- if: $CI_RUNNER_TAGS == macos

Спасибо, CI_RUNNER_TAGS — это разделенный запятыми список тегов бегуна. Так должен ли я использовать регулярное выражение с =~? Если и Windows, и Macos Runner подключены к сети, сборка будет выполняться дважды, но мне нужен только один. Есть ли способ справиться с этим?

watson 19.03.2022 15:57
Ответ принят как подходящий

Не вижу никаких параметров в предопределенные переменные для чего-то вроде онлайн-статуса бегуна.

Если вы хотите основывать правило запуска на статусе исполнителя, вам, вероятно, придется использовать личный токен (или, возможно, токен проекта), чтобы получить статус от 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

Спасибо. Многое узнаете из сценария. Действительно, я должен проверить статус бегуна в отдельной работе. Спасибо~

watson 20.03.2022 04:59

Другие вопросы по теме