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
- GitLab API-ga kirish uchun token yarataylik (u orqali biz yoqlab va qarshi ovozlar soni haqida ma'lumot olamiz)
- GitLab o'zgaruvchilariga token qo'shing
- Agar quvur liniyasida xatoliklar mavjud bo'lsa (agar "ma'qul" ovozlar etarli bo'lmasa) Birlashtirishni o'chirib qo'ying.
- CI/CD quvur liniyasining bir qismi sifatida ovozni tekshirishni sozlang
- Biz himoyalangan filiallarga majburiyatlarni olishni taqiqlaymiz, barcha o'zgarishlarni faqat MR orqali amalga oshiramiz
- 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:
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
Natijada biz quyidagilarni olamiz:
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.
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:
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:
6. Tekshirish
NEED_VOTES sozlang: 0
Biz MR qilamiz va "dislayk" qo'yamiz.
Qurilish jurnallarida:
Endi "yoqdi" ni qo'ying va qayta tekshirib ko'ring:
Manba: www.habr.com