Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Одной ΠΈΠ· самых Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π² бСсплатной вСрсии GitLab, являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ голосования ΠΏΡ€ΠΎΡ‚ΠΈΠ² обнулСния рСпозитория ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Merge request (MR), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ code review.

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» сами β€” Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΠΌ Merge, ΠΏΠΎΠΊΠ° нСсколько Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π΅ поставят Β«ΠΏΠ°Π»Π΅Ρ† Π²Π²Π΅Ρ€Ρ…Β» Π½Π° MR.

Π—Π°Ρ‡Π΅ΠΌ это Π²ΠΎΠΎΠ±Ρ‰Π΅?

Наша организация Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС ΠΊΡƒΠΏΠΈΡ‚ΡŒ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ GitLab. Но, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° вСдСтся Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π΅ Π±Π΅Π· доступа Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΈ Π΅ΡΡ‚ΡŒ ТСсткоС ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π°, Π·Π°ΠΊΡƒΠΏΠΊΠ° Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΉ self-managed с Π½ΡƒΠΆΠ½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚ΡΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ мСсяцы, Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΆΠ΅ сСйчас.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ приходится:

  • Π»ΠΈΠ±ΠΎ совсСм Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ Merge Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ для части Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΎ Π½Π° Merge, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ слиянии Ρ‡ΡƒΠΆΠΈΡ… MR ΠΊΠ°ΠΊ бонус;
  • Π»ΠΈΠ±ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Π±Π΅ΡΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ слияния с вашСй мастСр-Π²Π΅Ρ‚ΠΊΠΎΠΉ Π±Π΅Π· code review, Π΄Π°ΠΆΠ΅ Ссли это Junior, ΡƒΡΡ‚Ρ€ΠΎΠΈΠ²ΡˆΠΈΠΉΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‡Π΅Ρ€Π°.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΆΠ΅ Π΄Π΅Π»ΠΎΠΌ отправился Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ, полагая, Ρ‡Ρ‚ΠΎ ΡƒΠΆ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡƒΠΆΠ΅ сдСлал (Π±Π΅Π· Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ΄Π°), Π½ΠΎ оказалось, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² community вСрсии Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ.

ΠžΠ±Ρ‰Π°Ρ схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° настроим Merge request approvals Π½Π° тСстовом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ myapp:

  1. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ‚ΠΎΠΊΠ΅Π½ для доступа ΠΊ API GitLab (Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ количСствС голосов Β«Π·Π°Β» ΠΈ Β«ΠΏΡ€ΠΎΡ‚ΠΈΠ²Β»)
  2. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Ρ‚ΠΎΠΊΠ΅Π½ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ GitLab
  3. Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΠΌ Merge ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅ (Ссли голосов Β«Π·Π°Β» нСдостаточно)
  4. Настроим ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ голосов ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° CI/CD
  5. Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ, всС измСнСния ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· MR
  6. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² ΠΈΡ‚ΠΎΠ³Π΅

1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½ для доступа ΠΊ API

Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Настройки ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ β†’ Π’ΠΎΠΊΠ΅Π½Ρ‹ доступа ΠΈ записываСм Ρ‚ΠΎΠΊΠ΅Π½:

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

УчСтная запись для получСния Ρ‚ΠΎΠΊΠ΅Π½Π°
Доступ ΠΊ API позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ практичСски всС с вашими рСпозиториями, поэтому ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись Gitlab, Π΄Π°Ρ‚ΡŒ Π΅ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° Π½Π° ваши Ρ€Π΅ΠΏΠΎΠ·Ρ‚ΠΎΡ€ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Reporter) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ для этой ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи.

2. ДобавляСм Ρ‚ΠΎΠΊΠ΅Π½ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Gitlab

НапримСр, Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ QmN2Y0NOUFlfeXhvd21ZS01aQzgK

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Настройки β†’ CI/CD β†’ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β†’ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ β†’ GITLAB_TOKEN_FOR_CI

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π½Π° Π³Ρ€ΡƒΠΏΠΏΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π².

3. Π‘Ρ‚Π°Π²ΠΈΠΌ Π·Π°ΠΏΡ€Π΅Ρ‚ Π½Π° Merge, Ссли Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ одобрСния ΠΊΠΎΠ»Π»Π΅Π³ послС ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ code review

Π’ нашСм случаС Π·Π°ΠΏΡ€Π΅Ρ‚ΠΎΠΌ Π½Π° Merge Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сборочный ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ нСдостаточном количСствС голосов.

Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Настройки β†’ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ β†’ Запросы Π½Π° слияниС β†’ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ слияния ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΡŽ Π‘Π±ΠΎΡ€ΠΎΡ‡Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ.

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

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.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² с Π»ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² ваш ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½:

hub.docker.com/r/gableroux/gitlab-ci-lint
hub.docker.com/r/sebiwi/gitlab-ci-validate

И ΠΏΡ€ΠΈΠΌΠ΅Ρ€ стадии ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

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:

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

6. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ

Π—Π°Π΄Π°Π΄ΠΈΠΌ NEED_VOTES: 0

Π”Π΅Π»Π°Π΅ΠΌ MR ΠΈ ставим Β«Π΄ΠΈΠ·Π»Π°ΠΉΠΊΒ».

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Π’ Π»ΠΎΠ³Π°Ρ… сборки:

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ставим Β«Π»Π°ΠΉΠΊΒ» ΠΈ запускаСм ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ:

Code review Π² Gitlab CE: Ссли Merge request approvals Π½Π΅Ρ‚, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ хочСтся

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com