Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Omunye wemisebenzi edingeka kakhulu, ongekho kunguqulo yamahhala ye-GitLab, yikhono lokuvota ngokumelene nokuchithwa kwenqolobane nokulawula isicelo sokuhlanganisa (MR), kusetshenziswa ukubuyekezwa kwekhodi okuyisibopho.

Masenze umsebenzi omncane ngokwethu - sizokwenqabela ukuhlanganisa kuze kube yilapho onjiniyela abaningana benikeza uMR isithupha.

Kungani lokhu kudingekile?

Inhlangano yethu ingakwazi kalula ukuthenga ilayisensi ye-GitLab. Kodwa, njengoba ukuthuthukiswa kwenziwa ku-loop evaliwe ngaphandle kokufinyelela kwe-intanethi, futhi kukhona ukuhlelwa kwesabelomali okuqinile, ukuthengwa kwamalayisensi okulawulwa ngokwawo ngokusebenza okudingekile kungadonsa izinyanga eziningi, kodwa umsebenzi udinga ukwenziwa manje.

Ngenxa yalokho kufanele:

  • noma ukwenqabela ngokuphelele Ukuhlanganisa emagatsheni avikelwe kwabanye onjiniyela, kodwa-ke abathuthukisi abanelungelo Lokuhlanganisa bathola ukungqubuzana lapho behlanganisa o-MR wabanye abantu njengebhonasi;
  • noma unikeze ithuba lokwenza ukuhlanganisa okungalawuleki negatsha lakho eliyinhloko ngaphandle kokubuyekezwa kwekhodi, ngisho noma kunguJunior, oqashwe izolo nje.

Into yokuqala engiyenzile i-Google, ngikholelwa ukuthi othile usevele enze into efanayo (ngaphandle kokuguqula ikhodi), kodwa kwavela ukuthi kwakungekho ukuqaliswa okunjalo kunguqulo yomphakathi okwamanje.

Uhlelo olujwayelekile lomsebenzi

Njengesibonelo, ake silungiselele ukugunyazwa kwesicelo sokuhlanganisa endaweni yokuhlola myapp:

  1. Masidale ithokheni yokufinyelela ku-GitLab API (ngayo sizothola ulwazi mayelana nenani lamavoti "la" kanye "nokuphikisana").
  2. Ake sengeze ithokheni kokuguquguqukayo kwe-GitLab
  3. Masikhubaze ukuhlanganisa uma kwenzeka kuba namaphutha epayipini (uma kungekho amavoti aphezulu anele)
  4. Masimise ukuqinisekiswa kwevoti njengengxenye yepayipi le-CI/CD
  5. Siyakwenqabela ukuzibophezela emagatsheni avikelwe; zonke izinguquko zenziwa kuphela ngo-MR
  6. Ake sihlole ukuthi kwenzekeni ekugcineni

1. Dala ithokheni ukuze ufinyelele i-API

Iya kokuthi Izilungiselelo Zomsebenzisi → Amathokheni Okufinyelela bese ubhala phansi ithokheni:

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

I-akhawunti yokuthola ithokheni
Ukufinyelela ku-API kukuvumela ukuthi wenze noma yini ngamakhosombe akho, ngakho-ke ngincoma ukuthi udale i-akhawunti ehlukile ye-Gitlab, uyinikeze amalungelo amancane kumakhosombe akho (isb. Intatheli) futhi uthole ithokheni yaleyo akhawunti.

2. Engeza ithokheni kokuguquguqukayo kwe-Gitlab

Isibonelo, esinyathelweni esedlule sithole ithokheni QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Vula Izilungiselelo → CI/CD → Okuguquguqukayo → Engeza okuguquguqukayo → GITLAB_TOKEN_FOR_CI

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Ngenxa yalokho sithola:

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Lokhu kungenziwa endaweni eyodwa noma eqenjini lamakhosombe.

3. Sibeka ukuvinjelwa kokuhlanganisa uma imvume yozakwethu ingatholwa ngemva kokubuyekezwa kwekhodi.

Esimweni sethu, ukuvinjelwa kokuhlanganisa kuzoba ukuthi ipayipi lomhlangano lizobuyisela iphutha uma kungekho amavoti anele.

Iya kokuthi Izilungiselelo → Okujwayelekile → Hlanganisa Izicelo → Hlanganisa Amasheke futhi unike amandla inketho Yokuhlanganisa imigqa kufanele iqedele ngempumelelo.

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

4. Ukusetha ipayipi

Uma ungakadali ipayipi le-CI/CD lesicelo sakho
Dala ifayela empandeni yendawo yokugcina .gitlab-ci.yml ngokuqukethwe okulula:

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"

Inqolobane ehlukene yokucushwa kwe-CI/CD
Ngingancoma ukwenza ikhosombe ehlukile lapho udinga ukudala ifayela le-myapp.gitlab-ci.yml ukuze ulungiselele ipayipi. Ngale ndlela ungakwazi ukulawula kangcono ukufinyelela kwabahlanganyeli abangashintsha ipayipi lokwakha futhi bathole ithokheni yokufinyelela.

Indawo yefayela elisha lephayiphi kuzodingeka icaciswe ngokuya endaweni yesikhombi se-myapp - Izilungiselelo - CI/CD - Imigqa Yomhlangano - Indlela yokumisa yangokwezifiso CI - cacisa ifayela elisha, isb. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Ithiphu: Sebenzisa i-linter ukwenza izinguquko kumafayela e-GitLab CI
Ngisho noma usebenza wedwa, ukusebenza ngo-MR kuzoba usizo oluhle, ukusebenzisa zonke izinguquko zakho kumafayela epayipi ngokusebenzisa i-linter. Uma wenza iphutha ku-syntax yefayela le-YAML, ngeke iphule ipayipi lakho lokukhiqiza, kodwa izomane ivimbe ukuhlanganisa.

Isibonelo seziqukathi ezinama-linter ongazakha epayipini lakho:

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

Futhi isibonelo sesigaba sokuqinisekisa:

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;

Kusele ukungeza amapharamitha ambalwa epayipini lakho ukuze lisebenze:

stages:
- test

variables:
NEED_VOTES: 1

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

Okuhlukile kwe-NEED_VOTES kunquma ukuthi zingaki “izithupha” uMR okufanele abe nazo ukuze Ukuhlanganisa kutholakale. Inani elilingana nelilodwa lisho ukuthi wena ngokwakho ungavuma uMR wakho ngokuthi “uthande”.

kufaka phakathi isigaba sokuhlola, esihlola inombolo "yokuthandwa".

Ipayipi elilula lisebenzisa isibonelo se-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

Okuqukethwe hlola-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/.*$/'

Ulwazi olwengeziwe mayelana nokuthi kwenzekani ngesikhathi sokuqinisekisa:

  • kunomkhawulo wokuthi isheke lizokwenziwa kuphela lapho kwakhiwa uMR egatsheni eliyinhloko noma lokukhulula/*
  • sisebenzisa i-GitLab API, sithola inombolo “yokuthandwa” kanye “nokungathandwa”
  • bala umehluko phakathi kwezimpendulo ezinhle nezingezinhle
  • uma umehluko ungaphansi kwevelu esiyibeka ku-NEED_VOTES, lapho-ke sivimba ikhono lokuhlanganisa

5. Vimbela ukuzibophezela emagatsheni avikelwe

Sichaza amagatsha okumele siwenzele ukubuyekezwa kwamakhodi futhi sikhombise ukuthi angasetshenzwa kuphela ngoMnu.

Ukuze wenze lokhu, iya kokuthi Izilungiselelo → Indawo yokugcina → Amagatsha Avikelwe:

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

6. Hlola

Setha i-NEED_VOTES: 0

Senza uMR futhi sibeka "ukungathandi".

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Ezingodweni zokwakha:

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Manje faka okuthi “like” bese uqala ukuhlola futhi:

Ukubuyekezwa kwekhodi ku-Gitlab CE: uma kungekho ukugunyazwa kwesicelo sokuhlanganisa, kodwa ufuna ngempela

Source: www.habr.com

Engeza amazwana