Как я могу правильно указать условие выбора runner'а в github actions в моем pipeline?

Как можно избежать приостановки выполнения pipeline, если self-hosted сервер недоступен, чтобы процесс переходил к следующему шагу вместо остановки?
  • 30 января 2024 г. 11:18
Ответы на вопрос 2
Чтобы указать условие выбора runner'а в GitHub Actions в вашем pipeline, можно использовать лейблы (labels), которые ассоциированы с вашими self-hosted runner'ами. В вашем workflow файле `.github/workflows/<название_workflow>.yml`, вы можете добавить `runs-on` ключ с соответствующим лейблом:

```yaml
jobs:
  my_job:
    runs-on: [self-hosted, linux, x64]
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    # Другие шаги...
```

В примере выше, `self-hosted` относится к runner'у, которые вы разместили на своем сервере, а `linux` и `x64` являются дополнительными лейблами, которые помогают точно определить нужный runner.

Чтобы избежать приостановки выполнения pipeline в случае, если self-hosted сервер недоступен, вы можете использовать стратегию матрицы (`matrix`) для определения нескольких типов runner'ов и добавления условия для перехода к следующему шагу. Например, сначала попробовать использовать self-hosted runner, а если он не доступен, то использовать hosted runner от GitHub:

```yaml
jobs:
  my_job:
    runs-on: ${{ matrix.runner_label }}
    strategy:
      fail-fast: false
      matrix:
        runner_label: [self-hosted, ubuntu-latest]
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    # Другие шаги...
```

Опция `fail-fast: false` гарантирует, что если один из runner'ов в матрице терпит неудачу, работа не остановится, пока не будут испробованы все варианты.

Также, можно использовать условия `if` в шагах для управления порядком выполнения:

```yaml
jobs:
  my_job:
    runs-on: self-hosted
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Attempt to Run on Self-Hosted
      if: runner.label == 'self-hosted' && runner.isAvailable
      run: |
        echo "Running on self-hosted runner."
    - name: Fallback to GitHub-Hosted if Self-Hosted is Unavailable
      if: runner.label == 'self-hosted' && !runner.is_available
      uses: actions/checkout@v2
      runs-on: ubuntu-latest
```

Обратите внимание, что переменная `runner.isAvailable` не является реальным свойством объекта `runner`; это условное представление для того, как бы вы могли контролировать доступность self-hosted runner'а. Такой функциональности на самом деле нет "из коробки" в GitHub Actions – для имплементации подобного поведения вам может потребоваться написать свой собственный скрипт проверки или использовать сторонние действия, разработанные сообществом.

Для определения реального состояния доступности self-hosted runner'ов может быть необходимо использовать API GitHub или специализированные действия от сообщества, которые помогут управлять и мониторить состояние runner'ов.
Я советую забыть для начала о ChatGPT и прочитать пару постов (или посомотреть видео) "мой первый workflow". 
Если коротко, Self-Hosted Runner обычно не нужен.
Чтобы запуститься на линукс, пишем

runs-on: ubuntu-latest
Похожие вопросы