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β ΠΊΠΎΠ½Π΅Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π·Π°ΡΠΈΡΡ Π²Π΅ΡΠΊΠΈ
- Π Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ -> Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ CI/CD ΠΈ ΠΠ°ΠΏΡΠΎΡΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ (ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΠ±Π½ΠΎΠ²ΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ). ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΠΎΡΠ²ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ Π²ΠΊΠ»Π°Π΄ΠΊΡ ΠΠ°ΠΏΡΠΎΡΡ.
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ ΠΠ°ΠΏΡΠΎΡΡ ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π·Π°ΡΠΈΡΡ Π²Π΅ΡΠΊΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ
build-testΠΏΠ΅ΡΠ΅Π΄ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ°.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° ΠΈ Π·Π°ΠΏΡΡΠΊ ΡΠ°Π½Π½Π΅ΡΠ°
ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π°ΠΊΡΠΈΠ²Π½ΡΠΉ self-hosted ΡΠ°Π½Π½Π΅Ρ (Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΡΠ°Π½Π½Π΅ΡΠΎΠΌ):
- Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π½Π½Π΅ΡΠ° (Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈΠ»ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π Π°Π½Π½Π΅ΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°Π½Π½Π΅Ρ ΠΈ ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½).
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ°Π½Π½Π΅Ρ, ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΌΡ ΡΠΎΠΊΠ΅Π½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
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(ΠΠΌΠ΅ΡΡΠΎ <ΠΠΠ¨_Π’ΠΠΠΠ> ΠΏΠΎΠ΄ΡΡΠ°Π²ΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½.)
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅: Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΠ°ΠΏΡΠΎΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ, Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Π²Π΅ΡΠΊΡ Π΄Π»Ρ ΡΠ»ΠΈΡΠ½ΠΈΡ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠΎΠ»Ρ, Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ PR.
- ΠΠΎΠ³Π΄Π° workflow
ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π·Π°ΡΠΈΡΡ Π²Π΅ΡΠΊΠΈΠΎΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ PR ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ βTASK-β), ΡΡΠ°ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ Π½Π° Β«ΡΡΠΏΠ΅ΡΠ½ΠΎΒ», ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° ΡΠ»ΠΈΡΠ½ΠΈΡ ΡΡΠ°Π½Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ (ΡΠ»ΠΈΡΠ½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ). - ΠΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ, ΡΡΠΎ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΡΡΠΏΠ΅ΡΠ½Π°Ρ CI/CD-ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° (ΡΡΠ°ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Β«Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈΒ»).
ΠΡΠΎΡΠΌΠΎΡΡ ΡΡΠ°ΡΡΡΠ° Π·Π°Π΄Π°ΡΠΈ
ΠΠ»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΡΠ° Π·Π°Π΄Π°ΡΠΈ CI/CD:
2. ΠΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π»ΠΎΠ³ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ build-test. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ βTASK-β (ΠΈΠ»ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΎΠ²Π°Π»ΠΈΠ»Π°ΡΡ). ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ» ΡΡΠ»ΠΎΠ²ΠΈΡ, workflow Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈ ΡΡΠ°ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠ°Π» Π·Π΅Π»ΡΠ½ΡΠΌ (Β«Π£ΡΠΏΠ΅ΡΠ½ΠΎΒ»).
- ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΡΠ΄ΠΎΠΌ ΡΠΎ ΡΡΠ°ΡΡΡΠΎΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π΄Π΅ΡΠ°Π»ΡΠΌ workflow.