
Mojawapo ya vitendaji muhimu zaidi, ambavyo haviko katika toleo lisilolipishwa la GitLab, ni uwezo wa kupiga kura dhidi ya kubatilisha hazina na kudhibiti ombi la Kuunganisha (MR), kwa kutumia ukaguzi wa lazima wa msimbo.
Wacha tufanye utendakazi wa chini wenyewe - tutakataza Unganisha hadi watengenezaji kadhaa wampe MR dole gumba.
Kwa nini hii ni muhimu hata?
Shirika letu linaweza kumudu kwa urahisi kununua leseni ya GitLab. Lakini, kwa kuwa maendeleo yanafanywa kwa kitanzi kilichofungwa bila upatikanaji wa mtandao, na kuna mipango madhubuti ya bajeti, ununuzi wa leseni za kujitegemea na utendaji muhimu unaweza kuvuta kwa miezi mingi, lakini kazi inahitaji kufanywa sasa.
Kama matokeo, unapaswa:
- au kukataza kabisa Kuunganisha katika matawi yaliyolindwa kwa baadhi ya wasanidi programu, lakini wasanidi programu ambao wana haki ya Kuunganisha hupokea mizozo wakati wa kuunganisha MR za watu wengine kama bonasi;
- au toa fursa ya kuunganisha bila kudhibitiwa na tawi lako kuu bila ukaguzi wa msimbo, hata ikiwa ni Junior, ambaye aliajiriwa jana.
Jambo la kwanza nililofanya ni Google, nikiamini kwamba mtu alikuwa tayari amefanya kitu sawa (bila kurekebisha kanuni), lakini ikawa kwamba hakukuwa na utekelezaji kama huo katika toleo la jumuiya bado.
Mpango wa jumla wa kazi
Kama mfano, hebu tusanidi uidhinishaji wa ombi la Unganisha kwenye hazina ya majaribio :
- Wacha tuunde tokeni ya ufikiaji wa API ya GitLab (kupitia hiyo tutapokea habari kuhusu idadi ya kura "za" na "dhidi").
- Wacha tuongeze ishara kwenye anuwai za GitLab
- Wacha tuzime Kuunganisha ikiwa kuna makosa kwenye bomba (ikiwa hakuna kura za kutosha)
- Hebu tuweke uthibitishaji wa kura kama sehemu ya bomba la CI/CD
- Tunakataza kufanya ahadi kwa matawi yaliyolindwa; mabadiliko yote yanafanywa kupitia MR pekee
- Wacha tuangalie kilichotokea mwishoni
1. Unda ishara ili kufikia API
Nenda kwa Mipangilio ya Mtumiaji → Ishara za Ufikiaji na uandike ishara:

Akaunti ya kupokea tokeni
Ufikiaji wa API hukuruhusu kufanya karibu kila kitu na hazina zako, kwa hivyo ninapendekeza kuunda akaunti tofauti ya Gitlab, kuipa haki ndogo kwa hazina zako (km Ripota) na kupata tokeni ya akaunti hiyo.
2. Ongeza ishara kwa vigeuzo vya Gitlab
Kwa mfano, katika hatua ya awali tulipokea ishara QmN2Y0NOUFlfeXhvd21ZS01aQzgK
Fungua Mipangilio → CI/CD → Vigezo → Ongeza kigeu → GITLAB_TOKEN_FOR_CI

Kama matokeo, tunapata:

Hii inaweza kufanywa ama kwenye hazina moja au kwenye kikundi cha hazina.
3. Tunaweka marufuku ya Kuunganisha ikiwa kibali cha wenzetu hakipokelewi baada ya ukaguzi wa msimbo.
Kwa upande wetu, katazo la Kuunganisha litakuwa kwamba bomba la kusanyiko litarudisha hitilafu ikiwa hakuna kura za kutosha.
Nenda kwa Mipangilio → Jumla → Unganisha Maombi → Unganisha Hundi na uwashe chaguo Mistari ya Mkutano lazima ikamilike kwa mafanikio.

4. Kuweka bomba
Ikiwa bado haujaunda bomba la CI/CD kwa programu yako
Unda faili kwenye mzizi wa hazina .gitlab-ci.yml na yaliyomo rahisi zaidi:
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"
Hifadhi tofauti kwa usanidi wa CI/CD
Ningependekeza kutengeneza hazina tofauti ambayo unahitaji kuunda faili ya myapp.gitlab-ci.yml ili kusanidi bomba. Kwa njia hii unaweza kudhibiti vyema ufikiaji wa washiriki ambao wanaweza kubadilisha bomba la ujenzi na kupokea tokeni ya ufikiaji.
Mahali pa faili mpya ya bomba itahitaji kubainishwa kwa kwenda kwenye hazina ya myapp - Mipangilio - CI/CD - Mistari ya Kusanyiko - Njia ya usanidi ya CI Maalum - bainisha faili mpya, k.m. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Kidokezo: Tumia linter kufanya mabadiliko kwenye faili za GitLab CI
Hata ikiwa unafanya kazi peke yako, kufanya kazi kupitia MR itakuwa msaada mzuri, kuendesha mabadiliko yako yote kwa faili za bomba kupitia linter. Ukikosea katika sintaksia ya faili ya YAML, haitavunja bomba lako la utayarishaji, lakini itazuia tu Kuunganisha.
Mfano wa kontena zilizo na linter ambazo unaweza kujenga kwenye bomba lako:
Na mfano wa hatua ya uthibitishaji:
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;
Inabakia kuongeza vigezo vichache kwenye bomba lako ili kuifanya ifanye kazi:
stages:
- test
vigezo:
INAHITAJI_KURA: 1
pamoja na:
- kijijini: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
Tofauti ya NEED_VOTES huamua ni "dole gumba" ngapi ambazo MR lazima awe nazo ili Kuunganisha kupatikane. Thamani sawa na moja inamaanisha kuwa wewe mwenyewe unaweza kuidhinisha MR wako kwa "kuipenda".
inajumuisha ni pamoja na hatua ya majaribio, ambayo hukagua idadi ya "zinazopendwa".
Bomba rahisi zaidi kwa kutumia mfano wa myapp.gitlab-ci.yml
stages:
- build
- test
vigezo:
INAHITAJI_KURA: 0
pamoja na:
- kijijini: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
run-myapp:
hatua: kujenga
picha: openjdk
hati:
- mwangwi CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java
Yaliyomo 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/.*$/'
Maelezo zaidi kuhusu kile kinachotokea wakati wa uthibitishaji:
- kuna kizuizi ambacho hundi itafanywa tu wakati wa kuunda MR katika matawi makuu au kutolewa/*
- kwa kutumia API ya GitLab, tunapata idadi ya "zinazopendwa" na "zisizopenda"
- kuhesabu tofauti kati ya majibu chanya na hasi
- ikiwa tofauti ni chini ya thamani tuliyoweka katika NEED_VOTES, basi tunazuia uwezo wa kuunganisha
5. Kataza ahadi kwa matawi yaliyolindwa
Tunafafanua matawi ambayo tunapaswa kufanya ukaguzi wa kanuni na kuonyesha kwamba yanaweza tu kufanyiwa kazi kupitia MR.
Ili kufanya hivyo, nenda kwa Mipangilio → Hifadhi → Matawi Yanayolindwa:

6. Angalia
Weka NEED_VOTES: 0
Tunafanya MR na kuweka "kutopenda".

Katika magogo ya ujenzi:

Sasa weka "like" na uanze kuangalia tena:

Chanzo: mapenzi.com
