Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

GitLab тегін нұсқасында жоқ ең қажетті функциялардың бірі - репозиторийді жоюға қарсы дауыс беру және кодты міндетті түрде тексеру арқылы Біріктіру сұрауын (MR) басқару.

Ең аз функционалдылықты өзіміз орындайық – бірнеше әзірлеушілер MR-ге оң баға бермейінше, біріктіруге тыйым саламыз.

Бұл не үшін қажет?

Біздің ұйым GitLab лицензиясын оңай сатып ала алады. Бірақ, әзірлеу Интернетке қосылусыз жабық циклде жүзеге асырылатындықтан және қатаң бюджеттік жоспарлау болғандықтан, қажетті функционалдығы бар өзін-өзі басқаратын лицензияларды сатып алу көптеген айларға созылуы мүмкін, бірақ қазір жұмыс істеу керек.

Нәтижесінде сізге қажет:

  • немесе кейбір әзірлеушілер үшін қорғалған филиалдарда Біріктіруге толығымен тыйым салады, бірақ содан кейін біріктіруге құқығы бар әзірлеушілер бонус ретінде басқа адамдардың MR-ін біріктіру кезінде қайшылықтар алады;
  • немесе кеше ғана жұмысқа қабылданған Джуниор болса да, кодты қарап шықпай-ақ басты филиалыңызбен бақыланбайтын біріктірулер жасауға мүмкіндік беріңіз.

Мен жасаған бірінші нәрсе Google болды, біреу міндетті түрде ұқсас нәрсені жасады деп сенді (кодты өзгертпей), бірақ қауымдастық нұсқасында мұндай енгізу әлі жоқ екені белгілі болды.

Жұмыстың жалпы схемасы

Мысал ретінде сынақ репозиторийінде Біріктіру сұрауын бекітуді теңшейік менің қолданбам:

  1. GitLab API-ге кіруге арналған таңбалауыш жасайық (ол арқылы біз «жақтаған» және «қарсы» дауыстар саны туралы ақпаратты аламыз)
  2. Токенді GitLab айнымалыларына қосамыз
  3. Құбырда қателер болған жағдайда біріктіруді өшірейік (егер жақсы дауыстар жеткіліксіз болса)
  4. CI/CD құбырының бөлігі ретінде дауысты тексеруді орнатайық
  5. Біз қорғалған филиалдарға міндеттеме беруге тыйым саламыз, барлық өзгертулер тек MR арқылы жасалады
  6. Соңында не болғанын тексерейік

1. API интерфейсіне кіру үшін таңбалауышты жасаңыз

Пайдаланушы параметрлері → Токендерге қол жеткізу тармағына өтіп, таңбалауышты жазып алыңыз:

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Токен алу үшін тіркелгі
API рұқсаты репозиторийлеріңізбен кез келген дерлік әрекетті орындауға мүмкіндік береді, сондықтан мен жеке Gitlab тіркелгісін жасауды ұсынамын, оған репозиторийлеріңізге (мысалы, Reporter) минималды құқықтар беріп, сол тіркелгі үшін таңбалауыш алыңыз.

2. Gitlab айнымалыларына таңбалауышты қосыңыз

Мысалы, алдыңғы қадамда біз жетон алдық QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Параметрлер → CI/CD → Айнымалылар → Айнымалы қосу → тармағын ашыңыз GITLAB_TOKEN_FOR_CI

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Нәтижесінде біз аламыз:

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Мұны бір репозиторийде де, репозиторийлер тобында да жасауға болады.

3. Егер кодты қарап шыққаннан кейін әріптестердің мақұлдауын алмаса, біріктіруге тыйым саламыз.

Біздің жағдайда біріктіруге тыйым салу, егер дауыс жеткіліксіз болса, құрастыру құбыры қатені қайтарады.

Параметрлер → Жалпы → Сұрауларды біріктіру → Тексерулерді біріктіру тармағына өтіп, «Құрастыру жолдары сәтті аяқталуы керек» опциясын қосыңыз.

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

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 файлының синтаксисінде қателессеңіз, ол сіздің өндірістік құбырыңызды бұзбайды, тек Біріктіруді блоктайды.

Құбырға салуға болатын линтерлері бар контейнерлердің мысалы:

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-де қанша «жоғары бармақ» болуы керектігін анықтайды. Бірге тең мән сіздің MR-ді «ұнату» арқылы өзіңіз бекіте алатыныңызды білдіреді.

қосу «ұнату» санын тексеретін сынақ кезеңін қамтиды.

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 жасағанда орындалатынына шектеу бар
  • GitLab API көмегімен біз «ұнату» және «ұнатпау» санын аламыз
  • оң және теріс жауаптардың айырмашылығын есептеңіз
  • егер айырмашылық NEED_VOTES-те орнатқан мәннен аз болса, біз біріктіру мүмкіндігін блоктаймыз

5. Қорғалатын филиалдарға міндеттемелерге тыйым салу

Біз кодтық шолуды жүргізуіміз керек филиалдарды анықтаймыз және олармен тек MR арқылы жұмыс істеуге болатынын көрсетеміз.

Ол үшін Параметрлер → Репозиторий → Қорғалған филиалдар тармағына өтіңіз:

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

6. Тексеріңіз

NEED_VOTES орнатыңыз: 0

Біз МР жасап, «ұнатпау» қоямыз.

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Құрастыру журналдарында:

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Енді «лайк» белгісін қойып, қайтадан тексеруді бастаңыз:

Gitlab CE жүйесінде кодты қарау: Біріктіру сұрауын мақұлдау болмаса, бірақ мен шынымен де қалаймын

Ақпарат көзі: www.habr.com

пікір қалдыру