CI/CD при защите ветки

Рассмотрим сценарий, когда включена защита ветки (branch protection) и требуется запускать CI-проверки при каждом запросе на слияние.

Для демонстрации этого сценария подготовлен репозиторий CICD_examples (в организации gitverse_tutorials) с веткой CICD_branch_protection_demo:

  • в репозиторий уже добавлен файл конфигурации .gitverse/workflows/CICD_branch_protection_demo.yaml;
  • запущен self-hosted раннер (для выполнения задачи).

Конфигурация CI/CD

Файл CICD_branch_protection_demo.yaml (разместите его в директории .gitverse/workflows/ вашего проекта) определяет следующий pipeline:

name: Демонстрация защиты ветки
on:
  pull_request:
jobs:
  build-test:
    name: CICD branch protection
    runs-on: ubuntu-latest
    steps:
      - name: Display pull request title
        run: echo ${{ github.event.pull_request.title }}
      - name: Display commit message
        run: echo ${{ github.event.head_commit.message }}
      - name: Check pull request title
        run: |
          if [[ "${{ github.event.pull_request.title }}" == *"TASK-"* ]]; then
            echo "Pull request title contains 'TASK-'"
          else
            echo "Pull request title does not contain 'TASK-'"
            exit 1
          fi

(Внимание: self-hosted раннер GitVerse также обрабатывает YAML-файлы, расположенные в директории .github/workflows — они эквивалентны .gitverse/workflows.)

Структура конфигурации:

  • name: Демонстрация защиты ветки — название CI/CD-конфигурации.
  • on: pull_request — указывает запуск workflow при событиях запроса на слияние.
  • jobs: — начало определения списка задач.
    • build-test: — идентификатор задачи.
    • name: CICD branch protection — имя задачи.
    • runs-on: ubuntu-latest — задача выполняется на облачном раннере с ОС Ubuntu.
    • steps — перечень шагов задачи:
    • name: Display pull request title — шаг, выводящий заголовок PR:
    • run: echo ${{ github.event.pull_request.title }} — выводит заголовок PR.
    • name: Display commit message — шаг, выводящий сообщение коммита:
    • run: echo ${{ github.event.head_commit.message }} — выводит сообщение коммита.
    • name: Check pull request title — шаг-проверка заголовка PR:
    • run: | — начало многострочного сценария:
    • if [[ "${{ github.event.pull_request.title }}" == *"TASK-"* ]]; then — проверяет, содержит ли заголовок строку “TASK-”. Если содержит, то:
    • echo "Pull request title contains 'TASK-'" — выводится сообщение о наличии метки “TASK-” в заголовке.
    • else — если не содержит, то:
    • echo "Pull request title does not contain 'TASK-'" — выводится сообщение об отсутствии “TASK-” в заголовке;
    • exit 1 — завершается с ошибкой (проверка провалена).
    • fi — конец условия.

Настройка защиты ветки

  1. В настройках репозитория на вкладке Настройки -> Репозиторий включите опции CI/CD и Запросы на слияние (после чего нажмите Обновить настройки). После этого на странице репозитория появятся новые вкладки, включая вкладку Запросы.
  2. Перейдите на вкладку Запросы и создайте новое правило защиты ветки, добавив требование успешного выполнения задачи build-test перед слиянием запроса.

Получение токена и запуск раннера

Для выполнения проверки необходим активный self-hosted раннер (в примере используется Docker-контейнер с раннером):

  1. Сгенерируйте токен регистрации раннера (в настройках репозитория или организации на вкладке Раннеры нажмите Добавить раннер и скопируйте токен).
  2. Запустите раннер, передав ему токен. Например, командой:
sudo docker run \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e INSTANCE_URL=https://gitverse.ru/sc/ \
  -e RUNNER_REGISTRATION_TOKEN=<ВАШ_ТОКЕН> \
  gitverse.ru/gitverse/act-runner:4.3.0

(Вместо <ВАШ_ТОКЕН> подставьте полученный регистрационный токен.)

Создание и проверка запроса на слияние

  1. Создайте новый запрос на слияние: на вкладке Запросы нажмите Создать новый запрос, выберите ветку для слияния и заполните необходимые поля, затем создайте PR.
  2. Когда workflow Демонстрация защиты ветки отработает и завершится успешно (заголовок PR содержит “TASK-”), статус проверки изменится на «успешно», и кнопка слияния станет активной (слияние разрешено).
  3. ППосле создания запроса на его странице будет отображаться, что слияние недоступно до тех пор, пока не пройдет успешная CI/CD-проверка (статус проверки будет в состоянии «в ожидании»).

Просмотр статуса задачи

Для просмотра подробного статуса задачи CI/CD: 2. Вы увидите логи выполнения задачи build-test. В нашем случае там будет сообщение о том, что заголовок содержит “TASK-” (или не содержит, если бы проверка провалилась). Поскольку в нашем примере заголовок удовлетворял условию, workflow завершился успешно, и статус проверки стал зелёным («Успешно»).

  1. На странице запроса на слияние нажмите кнопку Подробнее рядом со статусом проверки, чтобы перейти к деталям workflow.

Вы нашли что искали?