แแ แ-แแ แแ แงแแแแแแ แแฃแชแแแแแแแ แคแฃแแฅแชแแ, แ แแแแแแช แแ แแ แแก GitLab-แแก แฃแคแแกแ แแแ แกแแแจแ, แแ แแก แกแแชแแแแแแก แแแฃแฅแแแแแก แฌแแแแแฆแแแแ แฎแแแก แแแชแแแแก แจแแกแแซแแแแแแแ แแ แจแแ แฌแงแแแก แแแแฎแแแแแก (MR) แแแแขแ แแแ, แแแแแก แกแแแแแแแแฃแแ แแแแฎแแแแแก แแแแแงแแแแแแ.
แแแแแ แแแแแแแแแ แแแแแแแแฃแ แ แคแฃแแฅแชแแแแแ แแแ แฉแแแ แแแแแแ - แฉแแแ แแแแ แซแแแแแ Merge-แก แแแแแ, แกแแแแ แ แแแแแแแแ แแแแแแแแแ แ MR-แก แแ แแแแแแแฎแแแแ.
แ แแขแแ แแ แแก แแก แกแแแ แแแ แกแแญแแ แ?
แฉแแแแก แแ แแแแแแแชแแแก แจแแฃแซแแแ แแแแแแแ แจแแแซแแแแก GitLab แแแชแแแแแ. แแแแ แแ, แ แแแแแ แแแแแแแแ แแแ แฎแแ แชแแแแแแแ แแแฎแฃแ แฃแ แแแ แงแฃแแจแ แแแขแแ แแแขแแ แฌแแแแแแก แแแ แแจแ แแ แแ แกแแแแแก แแแแชแ แ แแแฃแฏแแขแแก แแแแแแแแ, แกแแญแแ แ แคแฃแแฅแชแแแแแ แแแแ แแแแแแแ แแแแแ แแแชแแแแแแแแก แจแแซแแแ แจแแแซแแแแ แแ แแแแแ แแแแก แแแแแแแแแแแจแ แแแแ แซแแแแแก, แแแแ แแ แกแแแฃแจแแ แแฎแแ แฃแแแ แแแแแแแแก.
แจแแแแแแ แแฅแแแ แฃแแแ:
- แแ แแแแแแแแ แแแ แซแแแแก แจแแ แฌแงแแ แแแชแฃแ แคแแแแแแแแจแ แแแแแแ แแ แแแแแแแแแ แแกแแแแก, แแแแ แแ แจแแแแแ แแแแแแแแแ แแแ, แ แแแแแแกแแช แแฅแแ แจแแ แฌแงแแแก แฃแคแแแแ, แแฆแแแแ แแแแคแแแฅแขแแแก แกแฎแแ แแแแแแแแแแแก MR-แแแแก แแแแ แแแแแแแแกแแก แแแแฃแกแแ;
- แแ แแแแชแแ แจแแกแแซแแแแแแแ, แแแแแฎแแ แชแแแแแ แฃแแแแขแ แแแ แจแแ แฌแงแแ แแฅแแแแก แแแแแแ แคแแแแแแแแ แแแแแก แแแแฎแแแแแก แแแ แแจแ, แแฃแแแแช แแก แแงแแก แฃแแชแ แแกแ, แ แแแแแแช แแฃแจแแ แแแฅแแ แแแแแฃแแ แแงแ.
แแแ แแแแ, แ แแช แแแแแแแแ, แแงแ Google, แแฏแแ แ, แ แแ แแแฆแแชแแก แแแแแแแแแ แฐแฅแแแแ แแกแแแแกแ แ แแ (แแแแแก แจแแชแแแแก แแแ แแจแ), แแแแ แแ แแฆแแแฉแแแ, แ แแ แกแแแแแแแแแแแก แแแ แกแแแจแ แแกแแแ แแแแฎแแ แชแแแแแแ แฏแแ แแ แงแแคแแแ.
แแฃแจแแแแแก แแแแแแ แกแฅแแแ
แแแแแแแแแ, แแแแแ แแแแแแแแคแแแฃแ แแ แแ Merge-แแก แแแแฎแแแแแก แแแแขแแแชแแแแแ แกแแขแแกแขแ แกแแชแแแแ
- แแแแแ แจแแแฅแแแแ แแแขแแแ GitLab API-แแ แฌแแแแแแกแแแแก (แแแกแ แแแจแแแแแแ แแแแแฆแแแ แแแคแแ แแแชแแแก โแแแแฎแ แโ แแ โแฌแแแแแฆแแแแโ แฎแแแแแก แ แแแแแแแแแก แจแแกแแฎแแ)
- แแแแแ แแแแแแแขแแ แแแขแแแ GitLab แชแแแแแแแก
- แแแแแ แแแแแ แแแ แจแแ แฌแงแแ แแแแกแแแแแจแ แจแแชแแแแแก แจแแแแฎแแแแแจแ (แแฃ แกแแแแแ แแกแ แฎแแ แแ แแ แแก)
- แแแแแ แแแแแงแแแแ แฎแแแก แแแแแแแฌแแแแ, แ แแแแ แช CI/CD แแแแกแแแแแแก แแแฌแแแ
- แฉแแแ แแ แซแแแแแก แแแชแฃแ แคแแแแแแแแก แแแแแแแฃแแแแแแแก แแแฆแแแแก; แงแแแแ แชแแแแแแแ แฎแแแแ แแฎแแแแ MR-แแก แแแจแแแแแแ
- แแแแแ แจแแแแแแฌแแแ แ แ แแแฎแแ แแแแแก
1. แจแแฅแแแแแ แแแขแแแ API-แแ แฌแแแแแแกแแแแก
แแแแแแแ แแแแฎแแแ แแแแแก แแแ แแแแขแ แแแแ โ แฌแแแแแแก แแแขแแแแแแ แแ แฉแแฌแแ แแ แแแขแแแ:
แแแแแ แแจแ แขแแแแแแก แแแกแแฆแแแแ
API แฌแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแแแ แแแแฅแแแก แงแแแแแคแแ แ แแฅแแแแ แกแแชแแแแแแ, แแแแขแแ แแแ แฉแแแ แจแแฅแแแแ แชแแแแ Gitlab แแแแแ แแจแ, แแแกแชแแ แแแแแแแแฃแ แ แฃแคแแแแแแ แแฅแแแแก แกแแชแแแแแแ (แแแ. Reporter) แแ แแแแฆแแ แขแแแแแ แแ แแแแแ แแจแแกแแแแก.
2. แแแแแแขแแ แแแขแแแ Gitlab แชแแแแแแแก
แแแแแแแแแ, แฌแแแ แแขแแแแ แแแแแฆแแ แแแขแแแ QmN2Y0NOUFlfeXhvd21ZS01aQzgK
แแแฎแกแแแแ แแแ แแแแขแ แแแ โ CI/CD โ แชแแแแแแแ โ แชแแแแแแก แแแแแขแแแ โ GITLAB_TOKEN_FOR_CI
แจแแแแแแ แแแฆแแแ:
แแก แจแแแซแแแแ แแแแแแแแก แ แแแแ แช แแ แ แกแแชแแแแ, แแกแแแ แกแแชแแแแแแก แฏแแฃแคแแ.
3. แฉแแแ แแแแ แซแแแแแ 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-แก.
แแแแขแแแแแ แแแแก แแแแแแแแ แแแขแ แแ, แ แแแแแแช แจแแแแซแแแแ แแแจแแแแ แแฅแแแแก แแแแกแแแแแจแ:
แแ แจแแแแฌแแแแแก แแขแแแแก แแแแแแแแ:
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-แก, แ แแ แจแแ แฌแงแแ แแงแแก แฎแแแแแกแแฌแแแแแ. แแ แแแก แขแแแ แแแแจแแแแแแแ แแแจแแแแก, แ แแ แแฅแแแ แแแแแ แจแแแแซแแแแ แแแแแขแแแชแแ แแฅแแแแ 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-แแก แกแแจแฃแแแแแแ.
แแแแกแแแแแก แแแแแแแ แแแ แแแแขแ แแแจแ โ แกแแชแแแ โ แแแชแฃแแ แคแแแแแแแแ:
6. แจแแแแแฌแแแ
แแแแงแแแแ NEED_VOTES: 0
แฉแแแ แแแแแแแแ MR-แก แแ แแแงแแแแแ "dislike".
แแจแแแแแแแแแก แแฃแ แแแแแแจแ:
แแฎแแ แฉแแแแ โแแแแฅแโ แแ แแแแแ แแแแฌแงแแ แจแแแแฌแแแแ:
แฌแงแแ แ: www.habr.com