
ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΡΠΎ Π»ΠΈΠΏΡΠ²Π° Π² Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° GitLab, Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π³Π»Π°ΡΡΠ²Π°Π½Π΅ ΡΡΠ΅ΡΡ Π½ΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΉΠΊΠΈ Merge request (MR) ΡΡΠ΅Π· Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ code review.
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ°ΠΌΠΈ - ΡΠ΅ Π·Π°Π±ΡΠ°Π½ΠΈΠΌ Merge, Π΄ΠΎΠΊΠ°ΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π΅ ΠΏΠΎΡΡΠ°Π²ΡΡ Β«ΠΏΠ°Π»Π΅Ρ Π½Π°Π³ΠΎΡΠ΅Β» Π½Π° MR.
ΠΠ°ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠΎ?
ΠΠ°ΡΠ°ΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π·Π°ΠΊΡΠΏΠΈ Π»ΠΈΡΠ΅Π½Π· Π·Π° GitLab. ΠΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² Π·Π°ΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ½ΡΡΡ Π±Π΅Π· Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΡΠΎΠ³ΠΈ Π±ΡΠ΄ΠΆΠ΅ΡΠ½ΠΈ ΠΏΠ»Π°Π½ΠΎΠ²Π΅, Π·Π°ΠΊΡΠΏΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π»ΠΈΡΠ΅Π½Π·ΠΈ self-managed Ρ Π½ΡΠΆΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠ΅ΡΠΈ, Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ Π²Π΅Π΄Π½Π°Π³Π°.
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π½ΠΈ ΡΠ΅ Π½Π°Π»Π°Π³Π°:
- ΠΈΠ»ΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄Π° Π·Π°Π±ΡΠ°Π½ΠΈΠΌ Merge Π² Π·Π°ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π·Π° ΡΠ°ΡΡ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅, Π½ΠΎ ΡΠΎΠ³Π°Π²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΠΏΡΠ°Π²ΠΎ Π½Π° Merge, ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΏΡΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠΆΠ΄ΠΈ MR ΠΊΠ°ΡΠΎ Π±ΠΎΠ½ΡΡ;
- ΠΈΠ»ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π½Π΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΡΠ»ΠΈwania Ρ Π²Π°ΡΠ°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΠΊΠ»ΠΎΠ½ Π±Π΅Π· code review, Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΠΎΠ²Π° Π΅ Junior, ΠΊΠΎΠΉΡΠΎ ΡΠΎΠΊΡ-ΡΠΎ Π΅ Π·Π°ΠΏΠΎΡΠ½Π°Π».
ΠΡΡΠ²ΠΎΡΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ , Π±Π΅ΡΠ΅ Π΄Π° Π³ΡΠ³Π»Ρ, Π²ΡΡΠ²Π°ΠΉΠΊΠΈ, ΡΠ΅ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½ΡΠΊΠΎΠΉ Π²Π΅ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ (Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π°), Π½ΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² community Π²Π΅ΡΡΠΈΡΡΠ° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΠΈΠΌΠ°Π»ΠΎ.
ΠΠ±ΡΠ° ΡΡ Π΅ΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Merge request Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ :
- Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ API Π½Π° GitLab (ΡΡΠ΅Π· Π½Π΅Π³ΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π±ΡΠΎΡ Π½Π° Π³Π»Π°ΡΠΎΠ²Π΅ΡΠ΅ Β«Π·Π°Β» ΠΈ Β«ΠΏΡΠΎΡΠΈΠ²Β»)
- ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠΎΠΊΠ΅Π½Π° Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° GitLab
- ΠΠ°Π±ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Merge ΠΏΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° (Π°ΠΊΠΎ Π³Π»Π°ΡΠΎΠ²Π΅ΡΠ΅ Β«Π·Π°Β» ΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ)
- ΠΠ°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π³Π»Π°ΡΠΎΠ²Π΅ΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° CI/CD
- ΠΠ°Π±ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ Π² Π·Π°ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΡΠ°ΠΌΠΎ ΡΡΠ΅Π· MR
- Π©Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΌΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Π»ΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°
1. Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ API
ΠΠ»ΠΈΠ·Π°ΠΌΠ΅ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ β Π’ΠΎΠΊΠ΅Π½ΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½Π°:

ΠΡΠΎΡΠΈΠ» Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΎΠΊΠ΅Π½
ΠΠΎΡΡΡΠΏΡΡ Π΄ΠΎ API ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠΈΡΠΊΠΎ Ρ Π²Π°ΡΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠΈΠ» Π·Π° GitLab, Π΄Π° ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΡΠ°Π²Π° Π²ΡΡΡ
Ρ Π²Π°ΡΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Reporter) ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π·Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠΈΠ».
2. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠΎΠΊΠ΅Π½Π° Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° GitLab
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΡΠΏΠΊΠ° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ ΡΠΎΠΊΠ΅Π½Π° QmN2Y0NOUFlfeXhvd21ZS01aQzgK
ΠΡΠ²Π°ΡΡΠΌΠ΅ ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β CI/CD β ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° β GITLAB_TOKEN_FOR_CI

Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ:

ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° ΠΊΠ°ΠΊΡΠΎ Π½Π° Π΅Π΄Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΠΈ Π½Π° Π³ΡΡΠΏΠ° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
3. ΠΠ°Π»Π°Π³Π°ΠΌΠ΅ Π·Π°Π±ΡΠ°Π½Π° Π·Π° Merge, Π°ΠΊΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΊΠΎΠ»Π΅Π³ΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ ΠΏΡΠ΅Π³Π»Π΅Π΄.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π·Π°Π±ΡΠ°Π½Π°ΡΠ° Π·Π° 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;
ΠΡΡΠ°Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² Π²Π°ΡΠΈΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½, Π·Π° Π΄Π° Π·Π°ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠΈΡΠΊΠΎ:
Π΅ΡΠ°ΠΏΠΈ:
- ΡΠ΅ΡΡ
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
Π΅ΡΠ°ΠΏΠΈ:
- ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅
- ΡΠ΅ΡΡ
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
ΡΠΊΡΠΈΠΏΡ:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java
Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ check-approve.gitlab-ci.yml
ci-mr:
Π΅ΡΠ°ΠΏ: ΡΠ΅ΡΡ
ΡΠΊΡΠΈΠΏΡ:
- 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})" ];
ΡΠΎΠ³Π°Π²Π°
echo "MR OK";
ΠΈΠ½Π°ΡΠ΅
echo "MR ERROR Need more votes";
exit 1;
fi
image: laptevss\/gitlab-api-util
ΠΏΡΠ°Π²ΠΈΠ»Π°:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ \/^release\/.*$\/'
ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°:
- Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΎ Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° ΡΠ΅ ΡΡΠ°Π½Π΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° MR Π² ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ master ΠΈΠ»ΠΈ release/*
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ GitLab API, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π±ΡΠΎΡ Π½Π° Β«Π»Π°ΠΉΠΊΠΎΠ²Π΅ΡΠ΅Β» ΠΈ Β«Π΄ΠΈΠ·Π»Π°ΠΉΠΊΠΎΠ²Π΅ΡΠ΅Β»
- ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΎΡΠ·ΠΈΠ²ΠΈ
- Π°ΠΊΠΎ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΎΡ Π·Π°Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΠΎΡ Π½Π°Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² NEED_VOTES, Π±Π»ΠΎΠΊΠΈΡΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΈΠ²Π°Π½Π΅
5. ΠΠ°Π±ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ Π² Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΈ
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅ΠΌ code review ΠΈ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅, ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΡΡ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π° ΡΠ°ΠΌΠΎ ΡΡΠ΅Π· MR.
ΠΠ° ΡΠ΅Π»ΡΠ° ΠΎΡΠΈΠ²Π°ΠΌΠ΅ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ β ΠΠ°ΡΠΈΡΠ΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΈ:

6. ΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅
ΠΠ°Π΄Π°Π²Π°ΠΌΠ΅ NEED_VOTES: 0
ΠΡΠ°Π²ΠΈΠΌ MR ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Β«Π΄ΠΈΠ·Π»Π°ΠΉΠΊΒ».

Π Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ±ΠΎΡΠΊΠ°ΡΠ°:

Π‘Π΅Π³Π° ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Β«Π»Π°ΠΉΠΊΒ» ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°:

ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
