Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Яке аз вазифаҳои зарурӣ, ки дар версияи ройгони GitLab мавҷуд нест, қобилияти овоз додан ба зидди беэътиборкунии анбор ва назорати дархости Merge (MR) бо истифода аз баррасии ҳатмии код мебошад.

Биёед худамон функсияҳои ҳадди ақалро иҷро кунем - мо якҷоя карданро манъ мекунем, то он даме, ки якчанд таҳиягарон ба MR даст надиҳанд.

Чаро ин ҳатто зарур аст?

Ташкилоти мо метавонад ба осонӣ литсензияи GitLab бихарад. Аммо, азбаски рушд дар як ҳалқаи пӯшида бидуни дастрасӣ ба Интернет сурат мегирад ва банақшагирии қатъии буҷет вуҷуд дорад, хариди литсензияҳои худидорашаванда бо функсияҳои зарурӣ метавонад моҳҳои зиёд кашол ёбад, аммо кор бояд ҳоло анҷом дода шавад.

Дар натиҷа шумо бояд:

  • ё барои баъзе таҳиягарон Merge-ро дар шохаҳои муҳофизатшаванда комилан манъ кунед, аммо баъдтар таҳиягароне, ки ҳуқуқи муттаҳид карданро доранд, ҳангоми якҷоя кардани MR-ҳои одамони дигар ҳамчун бонус ихтилофҳо мегиранд;
  • ё имконият диҳед, ки бо филиали устои худ бидуни баррасии код якҷояшавии беназорат анҷом диҳед, ҳатто агар он Junior бошад, ки дирӯз ба кор гирифта шудааст.

Аввалин коре, ки ман кардам, Google буд, ки боварӣ дошт, ки касе аллакай як чизи шабеҳро анҷом додааст (бе тағир додани код), аммо маълум шуд, ки дар версияи ҷомеа чунин татбиқ вуҷуд надорад.

Схемаи умумии кор

Ҳамчун мисол, биёед тасдиқҳои дархости Merge-ро дар анбори санҷиш танзим кунем myapp:

  1. Биёед барои дастрасӣ ба API GitLab нишона эҷод кунем (тавассути он мо дар бораи шумораи овозҳои "тарафдор" ва "муқобил" маълумот мегирем)
  2. Биёед токенро ба тағирёбандаҳои GitLab илова кунем
  3. Биёед дар сурати хатогиҳо дар қубур (агар овозҳои кофӣ надошта бошанд) Merge-ро ғайрифаъол кунем.
  4. Биёед тафтиши овозҳоро ҳамчун як қисми лӯлаи CI/CD таъсис диҳем
  5. Мо қабул кардани ӯҳдадориҳоро ба филиалҳои муҳофизатшуда манъ мекунем; ҳама тағирот танҳо тавассути MR анҷом дода мешаванд
  6. Биёед тафтиш кунем, ки дар охир чӣ шуд

1. Барои дастрасӣ ба API нишона эҷод кунед

Ба Танзимоти корбар → Токенҳои дастрасӣ гузаред ва нишонаро нависед:

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Ҳисоб барои гирифтани нишона
Дастрасии API ба шумо имкон медиҳад, ки бо анборҳои худ қариб ҳама чизро иҷро кунед, аз ин рӯ ман тавсия медиҳам, ки ҳисоби алоҳидаи Gitlab эҷод кунед ва ба он ҳуқуқҳои ҳадди ақалро ба анборҳои худ (масалан, Reporter) диҳед ва барои ин ҳисоб нишона гиред.

2. Токенро ба тағирёбандаҳои Gitlab илова кунед

Масалан, дар қадами қаблӣ мо нишона гирифтем QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Танзимотҳо → CI/CD → Тағирёбандаҳо → Иловаи тағирёбанда → -ро кушоед GITLAB_TOKEN_FOR_CI

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Дар натиҷа мо ба даст меорем:

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Инро ҳам дар як анбор ё дар як гурӯҳи анборҳо анҷом додан мумкин аст.

3. Мо Merge-ро манъ мекунем, агар тасдиқи ҳамкорон пас аз баррасии код гирифта нашавад.

Дар ҳолати мо, манъи муттаҳидшавӣ аз он иборат аст, ки лӯлаи васлкунӣ хатогиро бармегардонад, агар овозҳои кофӣ надошта бошанд.

Ба Танзимотҳо → Умумӣ → Якҷоя кардани дархостҳо → Якҷоя чекҳо гузаред ва имкони фаъол кардани хатҳои васлкунӣ бояд бомуваффақият анҷом ёбад.

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

4. Ҷойгир кардани қубур

Агар шумо то ҳол лӯлаи CI/CD-ро барои дархости худ эҷод накарда бошед
Дар решаи репозиторий файл эҷод кунед .gitlab-ci.yml бо соддатарин мундариҷа:

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
Ман тавсия медиҳам, ки анбори алоҳида созед, ки дар он шумо бояд файли myapp.gitlab-ci.yml эҷод кунед, то қубурро танзим кунед. Бо ин роҳ шумо метавонед дастрасии иштирокчиёнро беҳтар назорат кунед, ки метавонанд лӯлаи сохтмонро иваз кунанд ва аломати дастрасӣ гиранд.

Ҷойгиршавии файли қубури нав бояд тавассути рафтан ба анбори myapp муайян карда шавад - Танзимотҳо - CI/CD - Хатҳои васлкунӣ - Роҳи конфигуратсияи фармоишии CI - файли навро муайян кунед, масалан. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Маслиҳат: Барои тағир додани файлҳои GitLab CI линтерро истифода баред
Ҳатто агар шумо танҳо кор кунед, кор тавассути MR кӯмаки хуб хоҳад буд ва ҳамаи тағиротҳои худро ба файлҳои қубур тавассути линтер иҷро кунед. Агар шумо дар синтаксиси файли YAML хато кунед, он лӯлаи истеҳсолии шуморо вайрон намекунад, балки танҳо Merge-ро маҳкам мекунад.

Намунаи контейнерҳои дорои линтерҳо, ки шумо метавонед дар қубури худ созед:

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

Ва як мисоли марҳилаи санҷиш:

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;

Барои кор кардан ба лӯлаи худ чанд параметр илова кардан боқӣ мемонад:

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 муайян мекунад, ки MR барои дастрас шудани Merge чӣ қадар "ангушти боло" дошта бошад. Қимати баробар ба як маънои онро дорад, ки шумо худатон метавонед MR-и худро бо "писанд кардан" тасдиқ кунед.

дохил марҳилаи санҷишро дар бар мегирад, ки шумораи "лайкҳо" -ро тафтиш мекунад.

Соддатарин лӯла бо истифода аз мисоли 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

Мундариҷа 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/.*$/'

Маълумоти бештар дар бораи он, ки ҳангоми санҷиш чӣ мешавад:

  • маҳдудият вуҷуд дорад, ки санҷиш танҳо ҳангоми сохтани MR дар усто ё релиз/* филиалҳо анҷом дода мешавад
  • бо истифода аз GitLab API, мо шумораи "писанд" ва "нописанд" -ро мегирем
  • Фарқи байни ҷавобҳои мусбат ва манфиро ҳисоб кунед
  • агар фарқият аз арзише, ки мо дар NEED_VOTES муқаррар кардем камтар бошад, мо қобилияти муттаҳид карданро маҳкам мекунем

5. Манъи ӯҳдадориҳо ба филиалҳои муҳофизатшаванда

Мо шохаҳоеро муайян мекунем, ки барои онҳо мо бояд баррасии кодҳоро гузаронем ва нишон медиҳем, ки бо онҳо танҳо тавассути MR кор кардан мумкин аст.

Барои ин, ба Танзимотҳо → Репозиторий → Филиалҳои ҳифзшуда гузаред:

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

6. Санҷед

NEED_VOTES таъин кунед: 0

Мо MR месозем ва "дизлайк" мегузорем.

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Дар сабтҳои сохтмон:

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Акнун "лайк" гузоред ва дубора тафтиш кунед:

Баррасии код дар Gitlab CE: агар тасдиқи дархости Merge мавҷуд набошад, аммо ман дар ҳақиқат мехоҳам

Манбаъ: will.com

Илова Эзоҳ