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.

Π’Ρ‹ нашли Ρ‡Ρ‚ΠΎ искали?