Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Ib qho ntawm cov haujlwm tsim nyog tshaj plaws, uas tsis yog nyob rau hauv qhov dawb version ntawm GitLab, yog lub peev xwm los pov npav tawm tsam qhov chaw khaws cia thiab tswj kev sib koom ua ke (MR), siv qhov yuav tsum tau tshuaj xyuas.

Cia peb ua qhov tsawg kawg nkaus ua haujlwm ntawm peb tus kheej - peb yuav txwv tsis pub sib koom ua ke kom txog thaum ntau tus neeg tsim khoom muab MR tus ntiv tes xoo.

Vim li cas qhov no tseem tsim nyog?

Peb lub koom haum tuaj yeem them taus yooj yim mus yuav daim ntawv tso cai GitLab. Tab sis, txij li thaum txoj kev loj hlob tau ua nyob rau hauv lub voj kaw tsis muaj kev nkag tau hauv Is Taws Nem, thiab muaj kev npaj nyiaj txiag nruj, kev yuav cov ntawv tso cai tswj hwm tus kheej nrog cov haujlwm tsim nyog tuaj yeem rub rau ntau lub hlis, tab sis kev ua haujlwm yuav tsum tau ua tam sim no.

Yog li ntawd koj yuav tsum:

  • los yog tag nrho txwv Merge hauv kev tiv thaiv ceg rau qee tus neeg tsim khoom, tab sis tom qab ntawd cov neeg tsim khoom uas muaj txoj cai sib koom ua ke tau txais kev tsis sib haum xeeb thaum sib koom ua ke lwm tus neeg MRs ua nyiaj ntxiv;
  • los yog muab lub sijhawm los ua kom tsis muaj kev sib koom ua ke nrog koj tus tswv ceg tsis muaj kev tshuaj xyuas, txawm tias nws yog Junior, uas tau ntiav nag hmo.

Thawj qhov kuv tau ua yog Google, ntseeg tias ib tus neeg tau ua ib yam dab tsi zoo sib xws (tsis tau hloov kho cov cai), tab sis nws tau pom tias tsis muaj qhov kev coj ua hauv zej zog tsis tau.

Kev ua haujlwm dav dav

Ua piv txwv, cia peb teeb tsa Merge thov kev pom zoo ntawm qhov chaw sim myapp:

  1. Cia peb tsim lub cim rau kev nkag mus rau GitLab API (los ntawm nws peb yuav tau txais cov ntaub ntawv hais txog tus lej pov npav "rau" thiab "tawm tsam")
  2. Cia peb ntxiv cov token rau GitLab hloov pauv
  3. Cia peb lov tes taw Merge nyob rau hauv cov ntaub ntawv ntawm kev ua yuam kev nyob rau hauv lub pipeline (yog hais tias tsis txaus upvotes)
  4. Cia peb teeb tsa kev pov npav pov npav raws li ib feem ntawm CI/CD pipeline
  5. Peb txwv tsis pub ua kev cog lus rau cov ceg tiv thaiv; txhua qhov kev hloov pauv tsuas yog ua los ntawm MR
  6. Cia peb tshawb xyuas qhov tshwm sim thaum kawg

1. Tsim lub token kom nkag mus rau API

Mus rau Tus Neeg Siv Teeb Meem → Access Token thiab sau rau hauv lub token:

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Account kom tau txais ib qho token
Kev nkag mus API tso cai rau koj ua txhua yam nrog koj cov chaw khaws cia, yog li kuv pom zoo kom tsim ib tus account Gitlab cais, muab nws tsawg kawg nkaus rau koj qhov chaw cia khoom (xws li Reporter) thiab tau txais ib qho token rau tus account ntawd.

2. Ntxiv cov token rau Gitlab variables

Piv txwv li, hauv cov kauj ruam dhau los peb tau txais ib qho token QmN2Y0NOUFlffeXhvd21ZS01aQzgK

Qhib Chaw → CI/CD → Variables → Ntxiv sib txawv → GITLAB_TOKEN_FOR_CI

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Raws li qhov tshwm sim peb tau txais:

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Qhov no tuaj yeem ua tiav ntawm ib qho chaw khaws cia lossis hauv ib pawg ntawm cov chaw khaws cia.

3. Peb muab kev txwv rau Merge yog tias tsis tau txais kev pom zoo los ntawm cov npoj yaig tom qab kev tshuaj xyuas cov cai.

Hauv peb qhov xwm txheej, kev txwv tsis pub sib koom ua ke yuav yog qhov kev sib sau ua ke yuav rov ua qhov yuam kev yog tias tsis muaj kev pov npav txaus.

Mus rau Chaw → General → Merge Thov → Merge Checks thiab pab kom cov kev xaiv los ua ke kab yuav tsum ua kom tiav.

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

4. Kev teeb tsa lub kav dej

Yog tias koj tseem tsis tau tsim CI / CD pipeline rau koj daim ntawv thov
Tsim ib cov ntaub ntawv nyob rau hauv lub hauv paus ntawm lub repository .gitlab-ci.yml nrog cov ntsiab lus yooj yim tshaj plaws:

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"

Separate repository rau CI/CD configuration
Kuv xav kom ua ib qho chaw cia khoom cais uas koj yuav tsum tau tsim cov ntaub ntawv myapp.gitlab-ci.yml los teeb tsa lub raj xa dej. Txoj kev no koj tuaj yeem tswj tau zoo dua ntawm kev nkag mus ntawm cov neeg tuaj koom uas tuaj yeem hloov pauv cov kav dej thiab tau txais lub cim nkag.

Qhov chaw ntawm cov ntaub ntawv kav dej tshiab yuav tsum tau teev tseg los ntawm kev mus rau myapp repository - Chaw - CI / CD - Cov kab sib dhos - Custom CI configuration path - qhia cov ntaub ntawv tshiab, piv txwv li. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Tswv yim: Siv lub linter los hloov cov ntaub ntawv GitLab CI
Txawm hais tias koj ua haujlwm ib leeg, kev ua haujlwm los ntawm MR yuav yog ib qho kev pab zoo, khiav tag nrho koj cov kev hloov pauv rau cov ntaub ntawv xa mus los ntawm ib lub linter. Yog tias koj ua yuam kev nyob rau hauv syntax ntawm YAML cov ntaub ntawv, nws yuav tsis ua txhaum koj cov kav dej ntau lawm, tab sis tsuas yog thaiv Merge.

Ib qho piv txwv ntawm cov thawv nrog linters uas koj tuaj yeem tsim rau hauv koj lub raj xa dej:

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

Thiab ib qho piv txwv ntawm theem pov thawj:

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;

Nws tseem yuav ntxiv ob peb qhov tsis sib xws rau koj lub raj xa dej kom nws ua haujlwm:

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 qhov sib txawv txiav txim siab pes tsawg "thumbs up" MR yuav tsum muaj nyob rau hauv thiaj li yuav Merge kom muaj. Tus nqi sib npaug ntawm ib qho txhais tau hais tias koj tus kheej tuaj yeem pom zoo koj MR los ntawm "nyiam" nws.

suav nrog suav nrog theem xeem, uas kuaj xyuas tus naj npawb ntawm "nyiam".

Cov kav dej yooj yim tshaj plaws uas siv cov piv txwv ntawm 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

Cov ntsiab lus 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/.*$/'

Xav paub ntau ntxiv txog dab tsi tshwm sim thaum kuaj xyuas:

  • muaj kev txwv tias daim tshev yuav tsuas yog ua thaum tsim MR hauv tus tswv lossis tso tawm / * ceg
  • siv GitLab API, peb tau txais cov naj npawb ntawm "nyiam" thiab "tsis nyiam"
  • xam qhov sib txawv ntawm cov lus teb zoo thiab tsis zoo
  • yog tias qhov sib txawv tsawg dua tus nqi peb teev hauv NEED_VOTES, ces peb thaiv lub peev xwm los ua ke

5. Txwv tsis pub ua rau cov ceg tiv thaiv

Peb txhais cov ceg uas peb yuav tsum ua cov cai tshuaj xyuas thiab qhia tias lawv tuaj yeem ua haujlwm nrog MR nkaus xwb.

Ua li no, mus rau Chaw → Repository → Tiv thaiv ceg:

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

6. Tshawb xyuas

Teem NEED_VOTES: 0

Peb ua tus MR thiab muab "tsis nyiam".

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Hauv cov ntawv qhia zaub mov:

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Tam sim no muab "zoo li" thiab pib kuaj dua:

Code tshuaj xyuas hauv Gitlab CE: yog tias tsis muaj Merge thov kev pom zoo, tab sis kuv xav tau tiag tiag

Tau qhov twg los: www.hab.com

Ntxiv ib saib