ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡΡ
Π½ΡΠΆΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅Ρ Π² Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ GitLab, ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ² ΠΎΠ±Π½ΡΠ»Π΅Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ Merge request (MR), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ code review.
Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ°ΠΌΠΈ β Π·Π°ΠΏΡΠ΅ΡΠΈΠΌ Merge, ΠΏΠΎΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π΅ ΠΏΠΎΡΡΠ°Π²ΡΡ Β«ΠΏΠ°Π»Π΅Ρ Π²Π²Π΅ΡΡ
Β» Π½Π° MR.
ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅?
ΠΠ°ΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ ΠΊΡΠΏΠΈΡΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ GitLab. ΠΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π²Π΅Π΄Π΅ΡΡΡ Π² Π·Π°ΠΊΡΡΡΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΠ΅ Π±Π΅Π· Π΄ΠΎΡΡΡΠΏΠ° Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ, ΠΈ Π΅ΡΡΡ ΠΆΠ΅ΡΡΠΊΠΎΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ΄ΠΆΠ΅ΡΠ°, Π·Π°ΠΊΡΠΏΠΊΠ° Π»ΠΈΡΠ΅Π½Π·ΠΈΠΉ self-managed Ρ Π½ΡΠΆΠ½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΡΠ½ΡΡΡΡΡ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠ΅ΡΡΡΡ, Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ.
Π ΠΈΡΠΎΠ³Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ:
- Π»ΠΈΠ±ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π·Π°ΠΏΡΠ΅ΡΠ°ΡΡ Merge Π² Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²Π΅ΡΠΊΠΈ Π΄Π»Ρ ΡΠ°ΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π½ΠΎ ΡΠΎΠ³Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΎ Π½Π° Merge, ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΠΏΡΠΈ ΡΠ»ΠΈΡΠ½ΠΈΠΈ ΡΡΠΆΠΈΡ MR ΠΊΠ°ΠΊ Π±ΠΎΠ½ΡΡ;
- Π»ΠΈΠ±ΠΎ Π΄Π°Π²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ Π±Π΅ΡΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΡ Ρ Π²Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΡΠ΅Ρ-Π²Π΅ΡΠΊΠΎΠΉ Π±Π΅Π· code review, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ Junior, ΡΡΡΡΠΎΠΈΠ²ΡΠΈΠΉΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΡΠ°.
ΠΠ΅ΡΠ²ΡΠΌ ΠΆΠ΅ Π΄Π΅Π»ΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΠ»ΡΡ Π³ΡΠ³Π»ΠΈΡΡ, ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΠΆ ΡΠΎΡΠ½ΠΎ ΠΊΡΠΎ-ΡΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π» (Π±Π΅Π· Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠ΄Π°), Π½ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² community Π²Π΅ΡΡΠΈΠΈ Π΅ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ.
ΠΠ±ΡΠ°Ρ ΡΡ Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π°ΡΡΡΠΎΠΈΠΌ Merge request approvals Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ
- Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ API GitLab (ΡΠ΅ΡΠ΅Π· Π½Π΅Π³ΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π³ΠΎΠ»ΠΎΡΠΎΠ² Β«Π·Π°Β» ΠΈ Β«ΠΏΡΠΎΡΠΈΠ²Β»)
- ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠΊΠ΅Π½ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ GitLab
- ΠΠ°ΠΏΡΠ΅ΡΠΈΠΌ Merge ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ°Ρ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅ (Π΅ΡΠ»ΠΈ Π³ΠΎΠ»ΠΎΡΠΎΠ² Β«Π·Π°Β» Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ)
- ΠΠ°ΡΡΡΠΎΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π³ΠΎΠ»ΠΎΡΠΎΠ² ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° CI/CD
- ΠΠ°ΠΏΡΠ΅ΡΠΈΠΌ Π΄Π΅Π»Π°ΡΡ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²Π΅ΡΠΊΠΈ, Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· MR
- ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π² ΠΈΡΠΎΠ³Π΅
1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ API
ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ β Π’ΠΎΠΊΠ΅Π½Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Π½:
Π£ΡΠ΅ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°
ΠΠΎΡΡΡΠΏ ΠΊ API ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ Ρ Π²Π°ΡΠΈΠΌΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΎΠ²Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Gitlab, Π΄Π°ΡΡ Π΅ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠ°Π²Π° Π½Π° Π²Π°ΡΠΈ ΡΠ΅ΠΏΠΎΠ·ΡΠΎΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Reporter) ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ.
2. ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠΊΠ΅Π½ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Gitlab
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ QmN2Y0NOUFlfeXhvd21ZS01aQzgK
ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β CI/CD β ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ β ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ β GITLAB_TOKEN_FOR_CI
Π ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ:
ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ Π½Π° Π³ΡΡΠΏΠΏΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π².
3. Π‘ΡΠ°Π²ΠΈΠΌ Π·Π°ΠΏΡΠ΅Ρ Π½Π° Merge, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»Π΅Π³ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ code review
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΏΡΠ΅ΡΠΎΠΌ Π½Π° Merge Π±ΡΠ΄Π΅Ρ ΡΠ²Π»ΡΡΡΡΡ ΡΠΎ, ΡΡΠΎ ΡΠ±ΠΎΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π²Π΅ΡΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π³ΠΎΠ»ΠΎΡΠΎΠ².
ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ β ΠΠ°ΠΏΡΠΎΡΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ β ΠΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ»ΠΈΡΠ½ΠΈΡ ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠΏΡΠΈΡ Π‘Π±ΠΎΡΠΎΡΠ½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ.
4. ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½
ΠΡΠ»ΠΈ Π²Ρ Π΅ΡΠ΅ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ CI/CD ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π² ΠΊΠΎΡΠ½Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΡΠ°ΠΉΠ» .gitlab-ci.yml Ρ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ΠΌ:
stages:
- build
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
run-myapp:
stage: build
script: echo "Hello world"
ΠΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ CI/CD
Π― Π±Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» myapp.gitlab-ci.yml Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. Π’Π°ΠΊ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π»ΡΡΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΡΡΡΠΏ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π΄ΠΎΡΡΡΠΏΠ°.
Π Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°ΡΡ, Π·Π°ΠΉΠ΄Ρ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ myapp β ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β CI/CD β Π‘Π±ΠΎΡΠΎΡΠ½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ β ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ CI β ΡΠΊΠ°Π·Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Π‘ΠΎΠ²Π΅Ρ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π»ΠΈΠ½ΡΠ΅Ρ Π΄Π»Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ°ΠΉΠ»Ρ GitLab CI
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½, Ρ
ΠΎΡΠΎΡΠΈΠΌ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π²ΡΡΡΡΠΏΠΈΡ ΡΠ°Π±ΠΎΡΠ° ΡΠ΅ΡΠ΅Π· MR, ΠΏΡΠΎΠ³ΠΎΠ½ΡΡ Π²ΡΠ΅ Π²Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° ΡΠ΅ΡΠ΅Π· Π»ΠΈΠ½ΡΠ΅Ρ. ΠΡΠ»ΠΈ Π²Ρ ΠΎΡΠΈΠ±Π΅ΡΠ΅ΡΡ Π² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ YAML-ΡΠ°ΠΉΠ»Π°, ΡΡΠΎ Π½Π΅ Π΄Π°ΡΡ Π²Π°ΠΌ ΡΠ»ΠΎΠΌΠ°ΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, Π° ΠΏΡΠΎΡΡΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Merge.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Ρ Π»ΠΈΠ½ΡΠ΅ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΡΠΎΠΈΡΡ Π² Π²Π°Ρ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½:
Π ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ°Π΄ΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ:
stages:
- lint
lint:
stage: lint
image: sebiwi/gitlab-ci-validate:1.3.0
variables:
GITLAB_HOST: https://gitlab.com
script:
- CI_FILES=(./*.yml)
- for f in "${CI_FILES[@]}"; do
gitlab-ci-validate $f;
done;
ΠΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π²Π°Ρ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ:
stages:
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ NEED_VOTES ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΊΠΎΠ»ΡΠΊΠΎ Β«ΠΏΠ°Π»ΡΡΠ΅Π² Π²Π²Π΅ΡΡ
Β» Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Ρ MR, ΡΡΠΎΠ±Ρ Π±ΡΠ» Π΄ΠΎΡΡΡΠΏΠ΅Π½ Merge. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Ρ ΡΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄ΠΎΠ±ΡΠΈΡΡ ΡΠ²ΠΎΠΉ MR, Β«Π»Π°ΠΉΠΊΠ½ΡΠ²Β» Π΅Π³ΠΎ.
include ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΠ°Π΄ΠΈΡ test, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Β«Π»Π°ΠΉΠΊΠΎΠ²Β».
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ myapp.gitlab-ci.yml
stages:
- build
- test
variables:
NEED_VOTES: 0
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
run-myapp:
stage: build
image: openjdk
script:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ check-approve.gitlab-ci.yml
ci-mr:
stage: test
script:
- echo ${CI_API_V4_URL}
- echo "CI_PROJECT_ID ${CI_PROJECT_ID}"
- echo "CI_COMMIT_SHA ${CI_COMMIT_SHA}"
- "export MR_ID=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .id else {} end" | grep --invert-match {})"
- "export MR_TITLE=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .title else {} end" | grep --invert-match {})"
- "export MR_WIP=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .work_in_progress else {} end" | grep --invert-match {})"
- "export MR_UPVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .upvotes else {} end" | grep --invert-match {})"
- "export MR_DOWNVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .downvotes else {} end" | grep --invert-match {})"
- MR_VOTES=$(expr ${MR_UPVOTES} - ${MR_DOWNVOTES})
- NEED_VOTES_REAL=${NEED_VOTES:-1}
- echo "MR_ID ${MR_ID} MR_TITLE ${MR_TITLE} MR_WIP ${MR_WIP} MR_UPVOTES ${MR_UPVOTES} MR_DOWNVOTES ${MR_DOWNVOTES}"
- echo "MR_VOTES ${MR_VOTES} Up vote = 1, down vote = -1, MR OK if votes >=${NEED_VOTES_REAL}"
- if [ "${MR_VOTES}" -ge "$(expr ${NEED_VOTES_REAL})" ];
then
echo "MR OK";
else
echo "MR ERROR Need more votes";
exit 1;
fi
image: laptevss/gitlab-api-util
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release/.*$/'
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅:
- ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ MR Π² Π²Π΅ΡΠΊΠΈ master ΠΈΠ»ΠΈ release/*
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ API GitLab, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Β«Π»Π°ΠΉΠΊΠΎΠ²Β» ΠΈ Β«Π΄ΠΈΠ·Π»Π°ΠΉΠΊΠΎΠ²Β»
- Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΎΡΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ
- Π΅ΡΠ»ΠΈ ΡΠ°Π·Π½ΠΎΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² NEED_VOTES, ΡΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅
5. ΠΠ°ΠΏΡΠ΅ΡΠ°Π΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²Π΅ΡΠΊΠΈ
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Π΅ΡΠΊΠΈ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ code review ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· MR.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π·Π°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ β Protected Branches:
6. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ
ΠΠ°Π΄Π°Π΄ΠΈΠΌ NEED_VOTES: 0
ΠΠ΅Π»Π°Π΅ΠΌ MR ΠΈ ΡΡΠ°Π²ΠΈΠΌ Β«Π΄ΠΈΠ·Π»Π°ΠΉΠΊΒ».
Π Π»ΠΎΠ³Π°Ρ
ΡΠ±ΠΎΡΠΊΠΈ:
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠ°Π²ΠΈΠΌ Β«Π»Π°ΠΉΠΊΒ» ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com