Перейти к содержимому
GitRiverGitRiver
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_SLUG URL-safe slug ref (lowercase, макс 63 символа)
CI_COMMIT_MESSAGE Сообщение коммита

Репозиторий

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

Pipeline

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

Job

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

Container Registry

Переменная Описание
CI_REGISTRY Адрес Container Registry
CI_REGISTRY_IMAGE registry/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 на workflow 50
Steps на job 100
Уровней needs 10
Matrix комбинаций 256
Таймаут job (макс) 6 часов
Таймаут job (по умолчанию) 1 час
Cron интервал (мин) 15 минут
Паттернов в paths 100