GitRiver GitRiver
EN
Навигация

CI/CD: справочник

Полный справочник формата CI/CD: matrix, concurrency, retry, outputs, переменные

Управление параллельностью (concurrency)

concurrency:
  group: deploy-$CI_COMMIT_BRANCH
  cancel_in_progress: true

При новом запуске в той же группе - предыдущий автоматически отменяется.


Условие запуска (if)

jobs:
  deploy:
    if: $CI_COMMIT_BRANCH == "main"
    steps:
      - run: ./deploy.sh

  notify-on-fail:
    if: failure()
    needs: [deploy]
    steps:
      - run: curl -X POST $SLACK_WEBHOOK
ВыражениеОписание
$VAR == "value"Сравнение строк
$VAR != "value"Неравенство
$VAR =~ /pattern/Regex совпадение
$VARОпределена и не пуста
!exprОтрицание
expr1 && expr2Логическое И
expr1 || expr2Логическое ИЛИ
success()Все предыдущие jobs успешны
failure()Хотя бы один предыдущий job провалился
always()Всегда выполнять
cancelled()Pipeline был отменён

Приоритет: || < && < сравнение < !


Rules (правила запуска)

rules:
  - if: "$CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == 'main'"
    when: always
  - changes:
      - "src/**"
      - "*.rs"
    when: manual
  - when: never

Значения when: always, never, manual, on_success, on_failure.


Matrix (матричные сборки)

jobs:
  test:
    strategy:
      matrix:
        os: [ubuntu, alpine]
        rust: ['1.80', '1.93', stable]
      fail_fast: false
      max_parallel: 4
    image: rust:${{ matrix.rust }}
    steps:
      - run: cargo test

Генерирует job для каждой комбинации. Значения доступны через ${{ matrix.<ключ> }}.

include / exclude

strategy:
  matrix:
    os: [ubuntu, alpine]
    rust: [stable, nightly]
    include:
      - os: ubuntu
        rust: nightly
        features: experimental
    exclude:
      - os: alpine
        rust: nightly

Retry (автоповтор)

jobs:
  test:
    retry:
      max: 2
      when: [script_failure, stuck_or_timeout_failure]
    steps:
      - run: cargo test

Условия: script_failure, stuck_or_timeout_failure, always (пустой список = always).


allow_failure

jobs:
  lint:
    allow_failure: true
    steps:
      - run: cargo clippy -- -D warnings

timeout

jobs:
  build:
    timeout: 30m
    steps:
      - run: cargo build --release

Форматы: 30s, 10m, 1h, 1h30m. По умолчанию: 1h. Максимум: 6h.


interruptible

jobs:
  test:
    interruptible: true
    steps:
      - run: cargo test

При новом push в тот же ref - running job автоматически отменяется.


needs (DAG-зависимости)

jobs:
  deploy:
    needs:
      - job: build
        optional: false
      - test
    steps:
      - run: ./deploy.sh

Поддержка optional: true - зависимость не ломает pipeline, если зависимый job был отфильтрован правилами.


Job outputs

Jobs могут передавать данные через файл $CI_OUTPUT:

jobs:
  prepare:
    steps:
      - run: |
          VERSION=$(cat VERSION)
          echo "version=$VERSION" >> $CI_OUTPUT

  deploy:
    needs: [prepare]
    steps:
      - run: echo "Deploying $NEEDS_PREPARE_OUTPUTS_VERSION"

Предопределённые переменные

Коммит

ПеременнаяОписание
CI_COMMIT_SHAПолный SHA коммита
CI_COMMIT_SHORT_SHAПервые 7 символов SHA
CI_COMMIT_BRANCHВетка (при push в ветку)
CI_COMMIT_TAGТег (при push тега)
CI_COMMIT_REF_NAMEПолное имя ref (refs/heads/main или refs/tags/v1.0)
CI_COMMIT_REF_SLUGURL-safe slug ref (lowercase, макс 63 символа)
CI_COMMIT_MESSAGEСообщение коммита

Репозиторий

ПеременнаяОписание
CI_REPOSITORY_NAMEИмя репозитория
CI_REPOSITORY_OWNERВладелец
CI_REPOSITORY_FULL_NAMEowner/repo
CI_REPOSITORY_URLHTTPS URL репозитория

Pipeline

ПеременнаяОписание
CIВсегда true
CI_PIPELINE_IDID pipeline
CI_PIPELINE_SOURCEИсточник (push, pull_request, schedule, web)
CI_PIPELINE_URLURL pipeline в интерфейсе

Job

ПеременнаяОписание
CI_JOB_IDID текущего job
CI_JOB_NAMEИмя текущего job
CI_JOB_TOKENJWT-токен для доступа к Registry и API

Container Registry

ПеременнаяОписание
CI_REGISTRYАдрес Container Registry
CI_REGISTRY_IMAGEregistry/owner/repo
CI_REGISTRY_USERЛогин для Registry
CI_REGISTRY_PASSWORDТокен для Registry (= CI_JOB_TOKEN)
CI_SERVER_URLБазовый URL GitRiver

Workspace

ПеременнаяОписание
CI_WORKSPACEРабочая директория
CI_OUTPUTПуть к файлу outputs

Пулл-реквест

ПеременнаяОписание
CI_PULL_REQUEST_NUMBERНомер PR
CI_PULL_REQUEST_SOURCEИсходная ветка
CI_PULL_REQUEST_TARGETЦелевая ветка

Переменные репозитория

Настраиваются в Settings / CI/CD / Variables:

  • Name - имя
  • Value - значение
  • Masked - скрывать в логах ([MASKED])

Приоритет переменных

  1. DB-переменные (из настроек репозитория)
  2. Глобальные env: (верхний уровень workflow)
  3. Job-уровень env:
  4. Предопределённые CI_*
  5. Интерполяция (разрешение цепочек $A -> $B -> значение, до 10 итераций)
  6. Registry-переменные (CI_REGISTRY_*)

4 уровня в иерархии: инстанс -> группа -> репозиторий -> окружение.


Множественные workflow-файлы

.gitriver/
  workflows/
    ci.yml
    release.yml
    nightly.yml
    deploy.yml

Каждый файл - независимый workflow. При push GitRiver проверяет все файлы и запускает те, чьи on: совпадают.


Ограничения

ПараметрЛимит
Workflow-файлов20 на репозиторий
Jobs на workflow50
Steps на job100
Уровней needs10
Matrix комбинаций256
Таймаут job (макс)6 часов
Таймаут job (по умолчанию)1 час
Cron интервал (мин)15 минут
Паттернов в paths100