Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

GitLab-ning bepul versiyasida mavjud bo'lmagan eng kerakli xususiyatlardan biri bu majburiy kodni tekshirish yordamida Birlashtirish so'rovini (MR) boshqarish uchun omborni nolga tenglashtirishga qarshi ovoz berish qobiliyatidir.

Biz minimal funktsiyalarni o'zimiz bajaramiz - bir nechta ishlab chiquvchilar MRga "bosh barmog'i" bermaguncha, biz Birlashtirishni o'chirib qo'yamiz.

Nima uchun bu umuman?

Tashkilotimiz GitLab litsenziyasini sotib olishga qodir. Ammo, ishlab chiqish Internetga ulanmasdan yopiq tsiklda amalga oshirilganligi va qat'iy byudjet rejalashtirish mavjud bo'lganligi sababli, kerakli funksionallikka ega o'z-o'zini boshqaradigan litsenziyalarni sotib olish ko'p oylar davom etishi mumkin va siz hozir ishlashingiz kerak.

Natijada, sizga kerak:

  • yoki ba'zi ishlab chiquvchilar uchun Himoyalangan filiallarga Birlashtirishni butunlay taqiqlang, lekin keyin Birlashtirish huquqiga ega bo'lgan ishlab chiquvchilar bonus sifatida boshqa odamlarning MR-larini birlashtirganda nizolar olishadi;
  • yoki kechagina o'rnashgan Junior bo'lsa ham, kodni ko'rib chiqmasdan master filialingiz bilan nazoratsiz birlashishga ruxsat bering.

Men qilgan birinchi narsa, kimdir allaqachon shunga o'xshash ishni (kodni aniqlamasdan) qilganiga ishonib, Google-ga kirish edi, ammo jamiyat versiyasida hali bunday dastur mavjud emasligi ma'lum bo'ldi.

Umumiy ish sxemasi

Misol tariqasida, test omborida Birlashtirish so'rovini tasdiqlashni o'rnatamiz mening ilovam:

  1. GitLab API-ga kirish uchun token yarataylik (u orqali biz yoqlab va qarshi ovozlar soni haqida ma'lumot olamiz)
  2. GitLab o'zgaruvchilariga token qo'shing
  3. Agar quvur liniyasida xatoliklar mavjud bo'lsa (agar "ma'qul" ovozlar etarli bo'lmasa) Birlashtirishni o'chirib qo'ying.
  4. CI/CD quvur liniyasining bir qismi sifatida ovozni tekshirishni sozlang
  5. Biz himoyalangan filiallarga majburiyatlarni olishni taqiqlaymiz, barcha o'zgarishlarni faqat MR orqali amalga oshiramiz
  6. Keling, oxirida nima bo'lganini tekshirib ko'raylik

1. APIga kirish uchun token yarating

Foydalanuvchi sozlamalari → Tokenlarga kirish-ga o‘ting va tokenni yozib oling:

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Tokenni olish uchun hisob
APIga kirish sizning omborlaringiz bilan deyarli hamma narsani qilish imkonini beradi, shuning uchun men sizga alohida Gitlab hisob qaydnomasini yaratishni, unga omborlaringizga minimal huquqlarni berishni (masalan, Reporter) va ushbu hisob uchun token olishni taklif qilaman.

2. Tokenni Gitlab o'zgaruvchilariga qo'shing

Misol uchun, oldingi bosqichda biz token oldik QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Parametrlar → CI/CD → O‘zgaruvchilar → O‘zgaruvchi qo‘shish → ni oching GITLAB_TOKEN_FOR_CI

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Natijada biz quyidagilarni olamiz:

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Buni bitta omborda ham, omborlar guruhida ham qilish mumkin.

3. Agar kodni ko'rib chiqqandan keyin hamkasblar roziligi olinmasa, biz Birlashtirishga taqiq qo'yamiz.

Bizning holatda, Birlashtirishni taqiqlash, agar ovozlar etarli bo'lmasa, yig'ish quvur liniyasi xatolik yuz berishidan iborat bo'ladi.

Sozlamalar → Umumiy → So‘rovlarni birlashtirish → Tekshirishlarni birlashtirish bo‘limiga o‘ting va Yig‘ish liniyalari muvaffaqiyatli ishlashi kerak opsiyani yoqing.

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

4. Quvurni o'rnating

Agar siz hali arizangiz uchun CI/CD quvurini yaratmagan bo'lsangiz
Repository ildizida fayl yarating .gitlab-ci.yml oddiy tarkib bilan:

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 konfiguratsiyasi uchun alohida ombor
Men quvur liniyasini sozlash uchun myapp.gitlab-ci.yml faylini yaratishingiz kerak bo'lgan alohida ombor yaratishni tavsiya qilaman. Shunday qilib, siz qurilish quvurini o'zgartira oladigan va kirish tokenini oladigan hissa qo'shuvchilarning kirishini yaxshiroq boshqarishingiz mumkin.

Yangi quvur liniyasi faylining joylashuvi ilovam omboriga o'tish orqali aniqlanishi kerak - Sozlamalar - CI / CD - Yig'ish liniyalari - Maxsus CI konfiguratsiya yo'li - masalan, yangi faylni belgilang myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Maslahat: GitLab CI fayllariga o'zgartirish kiritish uchun linterdan foydalaning
Agar siz yolg'iz ishlasangiz ham, MR orqali ishlash yaxshi yordamchi bo'lib, quvur liniyasi fayllariga barcha o'zgarishlarni linter orqali amalga oshiradi. Agar siz YAML faylining sintaksisida xatoga yo'l qo'ysangiz, bu sizga ishlaydigan quvur liniyasini buzishga imkon bermaydi, balki shunchaki Birlashtirishni bloklaydi.

Quvuringizga joylashtirishingiz mumkin bo'lgan linterli konteynerlarga misol:

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

Va tasdiqlash bosqichiga misol:

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;

Quvuringiz ishlashi uchun unga bir nechta parametrlarni qo'shish kerak:

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 o'zgaruvchisi Birlashtirish mavjud bo'lishi uchun MR qancha "bosh barmog'i" bo'lishi kerakligini aniqlaydi. Bitta qiymat sizning MR-ni "yoqtirish" orqali tasdiqlashingiz mumkinligini anglatadi.

o'z ichiga "layk" sonini tekshiradigan test bosqichini o'z ichiga oladi.

Misol sifatida myapp.gitlab-ci.yml dan foydalangan eng oddiy quvur liniyasi
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 tarkibi
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/.*$/'

Tekshirish paytida nima sodir bo'lishi haqida ko'proq bilib oling:

  • cheklash o'rnatiladi, tekshirish faqat masterda MR yaratish yoki /* filiallarini chiqarishda bo'ladi
  • GitLab API-dan foydalanib, "yoqdi" va "yoqmadilar" sonini oling
  • ijobiy va salbiy javoblar orasidagi farqni hisoblang
  • agar farq biz NEED_VOTES da o'rnatgan qiymatdan kam bo'lsa, biz birlashish imkoniyatini bloklaymiz

5. Himoyalangan filiallarga majburiyatlarni o'chirib qo'ying

Biz kodni ko'rib chiqishimiz kerak bo'lgan filiallarni aniqlaymiz va ular bilan faqat MR orqali ishlash mumkinligini ko'rsatamiz.

Buning uchun Sozlamalar → Repository → Himoyalangan filiallarga o'ting:

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

6. Tekshirish

NEED_VOTES sozlang: 0

Biz MR qilamiz va "dislayk" qo'yamiz.

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Qurilish jurnallarida:

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Endi "yoqdi" ni qo'ying va qayta tekshirib ko'ring:

Gitlab CE da kodni ko'rib chiqish: Agar birlashtirish so'rovini tasdiqlash bo'lmasa, lekin men buni juda xohlayman

Manba: www.habr.com

a Izoh qo'shish