CI/CD փոխակրիչներ ՝ GitHub Actions, GitLab CI
CI/CD փոխակրիչներ ՝ GitHub Actions, GitLab CI
1) CI/CD առաջադրանքը և պլատֆորմի տեղը
CI/CD-ը շարունակական հավաքումն է, փորձարկումը և փոփոխությունը ռեպոզորիայից դեպի աշխատանքային միջավայրեր։ Նպատակները
Ածխաջրերի արագությունը և կանխատեսելիությունը (կարճ lead time)։
Որակը (ավտոտեստեր, ստատիկ/դինամիկ վերլուծություն)։
Մատակարարման շղթայի անվտանգությունը (արտեֆակտների ստորագրությունը, հասանելի վերահսկումը)։
Մոսկվան (Կանարյան դոպլոներ, արագ արձագանք)։
Դիտարկումը (հետքեր և չափումներ յուրաքանչյուր փուլում)։
Հիմնական սկզբունքները ՝ «pipeline as code», իմուտաբային արտեֆակտներ, «build once - run many», «shift-left», «leportprivilege», դետերմինացված հավաքումներ։
2) փոխակրիչների ճարտարապետական փամփուշտները
Stage-gate: build → test → security → package → deploy → post-deploy checks.
Fan-out/Fan-in: Զուգահեռ մատրիցային հավաքածուներ (լեզուներ/պլատֆորմներ) արդյունքների միավորման հետ։
Promotion: նույն արտեֆակտը շարժվում է շրջակա միջավայրի միջոցով (dev winstage), ոչ թե փոխակերպվում։
Trunk-based + կարճ ճյուղերը 'dreaft նվազեցումը, ավտոմատ ստուգումները PR/MR-ում։
Reusable: workflow/ձևանմուշներ (Actions: Reusable workflows; GitLab: includes/child-pipelines).
GitOps (oporational) '«հավաքման» և «առաքման» բաժանումը (Argo CD/Flux հետևում են շրջակա միջավայրի անօրինական ռեպոն)։
3) Մատակարարման շղթայի անվտանգությունը (supply chain)
Նույնականացում: OIDC ֆեդեգրաֆիա runner 'a ամպի (առանց երկար գոյատևողների)։
Գաղտնիքները 'կենտրոնացված պահեստ, ենթատեքստի սահմանափակում, լոգայի դուրս գալու արգելք։
Արտեֆակտների/բեռնարկղերի ստորագրությունը (cosport/Sigstore), ստորագրության ստուգումը admission-վերահսկման մեջ։
SBSA (Cyclect DX/SPDX) և SCA, SOM/DMS/Windainer Scan - «պարտադիր դարպաս»։
Քաղաքական գործիչները ՝ OPA/Wintest-ը IaC/մանիֆեստների համար, «wwww.latest», արտոնյալ բեռնարկղերի արգելք։
Runner's մեկուսացումը 'մասնավոր ցանցում նախկին վիրուսները, առանձնացնել հանրային ինտերնետից ելքային հասանելի։
4) GitHub Actions-ը կառուցվածք և պրակտիկա է։
4. 1 Workflows կառուցվածքը
`.github/workflows/.yml` — триггеры (`on: push, pull_request, schedule, workflow_call`).
Reusable workflows-ը ստանդարտացման համար (linter, SCA, բեռնարկղային հավաքածու, deple)։
4. 2 Օրինակ ՝ բազմաբնույթ pline OIDC-ի և պատկերի ստորագրման հետ
yaml name: ci-cd
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
id-token: write # для OIDC contents: read packages: write
jobs:
build_test_matrix:
runs-on: ubuntu-latest strategy:
matrix:
node: [18, 20]
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: { node-version: ${{ matrix. node }} }
- name: Cache npm uses: actions/cache@v4 with:
path: ~/.npm key: npm-${{ runner. os }}-${{ matrix. node }}-${{ hashFiles('/package-lock. json') }}
- run: npm ci
- run: npm run lint && npm test -- --ci
docker_build_sign:
runs-on: ubuntu-latest needs: build_test_matrix steps:
- uses: actions/checkout@v4
- name: Login to GHCR uses: docker/login-action@v3 with:
registry: ghcr. io username: ${{ github. actor }}
password: ${{ secrets. GITHUB_TOKEN }}
- name: Build image run:
docker build --pull --no-cache -t ghcr. io/org/app:${{ github. sha }}.
docker push ghcr. io/org/app:${{ github. sha }}
- name: Generate SBOM uses: anchore/syft-action@v0 with:
image: ghcr. io/org/app:${{ github. sha }}
format: cyclonedx-json output-file: sbom. json
- name: Cosign sign (OIDC)
uses: sigstore/cosign-installer@v3
- name: Sign image run:
cosign sign ghcr. io/org/app:${{ github. sha }} \
--yes \
--identity-token $ACTIONS_ID_TOKEN_REQUEST_TOKEN \
--rekor-url https://rekor. sigstore. dev
deploy_stage:
runs-on: ubuntu-latest needs: docker_build_sign environment:
name: stage url: https://stage. example. com steps:
- uses: actions/checkout@v4
- name: Assume cloud role via OIDC uses: aws-actions/configure-aws-credentials@v4 with:
role-to-assume: arn:aws:iam::123456789012:role/github-deployer aws-region: eu-central-1
- name: Helm deploy (canary 10%)
run:
helm upgrade --install app charts/app \
--set image. tag=${{ github. sha }} \
--set canary. enabled=true --set canary. traffic=10
- name: Smoke checks run:./scripts/smoke. sh
promote_prod:
runs-on: ubuntu-latest needs: deploy_stage environment:
name: production url: https://app. example. com concurrency: prod-release steps:
- name: Manual approval gate run: echo "Requires environment approvers in repo settings"
- name: Promote canary → 100% (blue-green)
run:
helm upgrade --install app charts/app \
--set image. tag=${{ github. sha }} \
--set canary. enabled=false
- name: Post-deploy checks & rollback on SLO breach run:./scripts/verify_or_rollback. sh
Բանալիներ
«permissions» -ը կրճատվում է կոմպոզիցիաներին, ներառում է «id-token: write» OIDC-ի համար։
Environments-ը approvers-ից և URL-ից, «concurency» -ը պաշտպանում է մրցավազքից։
Կանարեքային ստանդարտ և ավտոմատ արձագանք SLO-ով։
4. 3 Reusable workflow (զանգի օրինակ)
yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high
5) GitLab CI-ն կառուցվածքն ու պրակտիկան է։
5. 1 Հիմնական կառուցվածքը
`.gitlab-ci. yml 'արմատի մեջ; հիմնական էությունը 'stages', «jobs», «rules», «needs», «artifac.ru», «enviance ments», «manae»։
Reuse: «include:» (տեղական/remote ձևանմուշներ), child/parent pipelines բարդ մոնորեպոյի համար։
5. 2 Օրինակ ՝ մատրիցա, քաշ, ստորագրություն, շրջապատեր և approvals
yaml stages: [lint, test, build, security, deploy]
variables:
DOCKER_TLS_CERTDIR: "" # docker: dind acceleration
IMAGE_TAG: $CI_COMMIT_SHA
lint:
stage: lint image: node:20 script:
- npm ci
- npm run lint cache:
key: "npm-${CI_COMMIT_REF_SLUG}"
paths: [node_modules/]
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
test:
stage: test image: node:20 parallel:
matrix:
- NODE_VERSION: ["18", "20"]
script:
- nvm install $NODE_VERSION true
- npm ci
- npm test -- --ci artifacts:
when: always reports:
junit: report. xml
build_image:
stage: build image: docker:26. 1 services: [ "docker:26. 1-dind" ]
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG.
- docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG artifacts:
expire_in: 1 week paths: [ "sbom. json" ]
after_script:
- syft $CI_REGISTRY_IMAGE:$IMAGE_TAG -o cyclonedx-json > sbom. json
security_scans:
stage: security image: alpine:3. 20 script:
- trivy image --exit-code 0 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$IMAGE_TAG rules:
- if: '$CI_COMMIT_BRANCH == "main"'
deploy_stage:
stage: deploy image: bitnami/kubectl:1. 30 environment:
name: stage url: https://stage. example. com on_stop: stop_stage script:
- kubectl set image deploy/app app=$CI_REGISTRY_IMAGE:$IMAGE_TAG -n stage
-./scripts/smoke. sh needs: [build_image, security_scans]
when: manual allow_failure: false
stop_stage:
stage: deploy image: bitnami/kubectl:1. 30 environment:
name: stage action: stop script:
- kubectl rollout undo deploy/app -n stage
deploy_prod:
stage: deploy image: alpine/k8s:1. 30. 2 environment:
name: production url: https://app. example. com rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual allow_failure: false script:
-./scripts/canary_traffic. sh 10
-./scripts/verify_or_rollback. sh
Բանալիներ
`parallel. matrone-ը ընդօրինակում է մատրիցային հավաքումները։
«artifac.ru» + թեստերի հաշվետվություններ։
Environments-ից 'on _ stop', ձեռքով 'when: mants' approvals-ի համար։
DIND-ը պատկերի հավաքման համար (ավելի լավ է Kaniko/BuildKit-ը k8s-ranner)։
5. 3 Child pipelines և include մոնոպրեպոյի համար
yaml include:
- local:.gitlab/ci/includes/security. yml
- project: org/platform/pipelines file: /k8s/deploy. yml ref: v1
stages: [prepare, component_a, component_b, deploy]
component_a:
stage: component_a trigger:
include:.gitlab/ci/component_a. yml strategy: depend
component_b:
stage: component_b trigger:
include:.gitlab/ci/component_b. yml strategy: depend
6) Միապաղաղ և բազմաբնակարան
System-based ownership: CODEOWNERS-ը և scoped թեստերը հետքերով։
Incremental builds: Մենք որոշում ենք բարձրացված փաթեթները/գծապատկերները։ քեշը ճանապարհների բեկորներով և շարժական k-ֆայլերով։
Coric pipelines: child-pipelines/« workflow _ call »-ը սկսվում է միայն փոփոխված բաղադրիչների համար։
Տարբերակումը 'semver յուրաքանչյուր պրոֆիլում, changelog releam-փուլում։
7) Քեշինգը և արագացումը
Բովանդակություն-հասցեային քեշները (hms Dises/www.kfile)։
Առանձին քեշը կախվածության և արտեֆակտների համար։
Pre-warm runner images (toolchains, SDK).
Տեղական հայելիները (npm/pip/maven) և բեռնարկղային registry-kes։
8) Բյուջետային ռազմավարությունները և արձագանքները
Canary 'տոկոսների աստիճանական բարձրացում։ Avto-stop, երբ SLO-ն քայքայվում է։
Blue-Green: զուգահեռ ապակիներ, ակնթարթային անցում։
Shadow 'առանց հաճախորդի վրա ազդեցության կրկնօրինակումը։
Feature flags: rollout-ը դրոշի մակարդակում, ոչ թե ֆորումը։
Rollback: «մեկ կոճակի» հստակ ջութակները, արտեֆակտի տարբերակը պահվում է մետատվական խառնուրդում։
9) Ենթակառուցվածքը և GitOps-ը
IaC: Terraform/Ansible/Helm ղեկավարվում են առանձին ռեպոյում։ policy-as-code որպես դարպաս։
GitOps-2019: Argo CD/Flux-ը դիտում են ռեպո շրջակա միջավայրի մանիֆեստների հետ։ փոխակրիչը միայն ստեղծում է արտեֆակտը և թարմացնում է տարբերակները Git-ում։
Առավելությունները 'շրջապատի փոփոխության հստակ պատմություն, կուռքեր, Git-ի միջոցով հակադարձումներ։
10) CI/CD դիտարկումը
DORA-մետրիկները 'դոպլոների հաճախությունը, ժամանակը համայնքից մինչև երկարաժամկետ, մերժումների տոկոսը, MTTR-ը։
Telemetry: Job's հերթերի ժամանակը, քայլերի տևողությունը, hit-rate քեշը, flaky թեստերի հաճախությունը։
Անվտանգության լոգներ 'ով է նախաձեռնել, թե որ դարպասներն են անցել, ինչ բացառություններ են տրվել։
11) Հասանելիության կառավարումը և approvals-ը
Branch-ը հաստատեց և պարտադիր ստուգումներ։
Envi.ru-approvals: approvers անհատական ցուցակները stage/2019-ում։
JIT հասանելիությունը ձեռքի քայլերի համար, նստաշրջանների սուրհանդակը։
Պարտականությունների բաժանումը 'տարբեր դերեր «գրում է կոդը», «հաստատում», «արտադրում»։
12) Հաճախակի սխալներ (հակատիպեր)
Երկարատև ամպային բանալիները ռեպոյի գաղտնիքներում OIDC դերերի փոխարեն։
Տարբեր արտեֆակտների հավաքումը stage-ի և ոճի համար (խախտումը «build once»)։
"latest 'tegs և mutable պատկերներ։
Գաղտնիքների հրապարակումը քայլերի լոգարաններում (անլար www.king)։
Մեկ ընդհանուր public-runner պրոդ-դոպլոների համար։
Անվտանգության «դարպասի» (SFC/SCA/Policy) և post-deploy ստուգումների բացակայությունը։
13) Chek-Time-( 0-60 օր)
0-15 օր
Տեղադրել trunk-based, PR/MR կանոնները, պարտադիր ստատիկ ստուգումները։
Ներառել OIDC ֆեդեգրաֆիա ամպի համար։ նվազագույն «permissions»։
Runner 's: Հանրային 'CI-ի համար, մասնավոր' CD-ի համար։
16-30 օր
Ավելացնել SBSA-ը, պատկերների ստորագրությունը։ կլաստերի մեջ ստորագրության ստուգումն է։
Ներդրել canary/blue-green; Avto-rollback SLO-ով։
Կախվածության և արտեֆակտների քեշը, pre-warm պատկերները։
31-60 օր
Կիսել հավաքումը և առաքումը (GitOps), policy-as-code դարպասը։
Տեղադրել DORA-մետրիերը և ալերտները դելֆինների քայքայման համար։
Բոլոր ծառայությունների համար պրոտոնային (reusable/child)։
14) Հուսալիության գործնական խորհուրդներ
Աջակցեք փոքրիկ, արագ գլանափաթեթները (10-12 րոպե մինչև PR ազդանշանը)։
Սպանեք flaky թեստերը 'quarantine-2019 + զուգահեռ ֆիքսը։
Մի խառնեք CI-արտեֆակտները և releae-արտեֆակտները։ պահեք մետատվյալներին (commit, ժամանակ, SBSA, ստորագրություններ)։
Թույլ տվեք մշակողներին տեղական ջութակներ, որոնք նույնական են փոխակրիչի քայլերին (dev-parity)։
15) Վերարտադրողական ձևանմուշներ
15. 1 GitHub Actions - reusable workflow (պարզեցված)
yaml name: security-suite on:
workflow_call:
inputs:
severity_threshold:
type: string required: false default: high jobs:
sast_sca:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- run:./sec/sast. sh --threshold ${{ inputs. severity_threshold }}
- run:./sec/sca. sh --format cyclonedx-json --out sbom. json artifacts: # if using actions/upload-artifact
- sbom. json
15. 2 GitLab - միացնող deploy (պարզեցված)
yaml
.deployment_template:
image: alpine/k8s:1. 30 script:
- helm upgrade --install $APP charts/$APP --set image. tag=$IMAGE_TAG rules:
- if: '$CI_COMMIT_BRANCH == "main"'
16) Եզրակացություն
GitHub Actions-ը և GitLab CI-ը տալիս են հասուն մեխանիզմներ արագ և անվտանգ ցիկլի համար «www.prod կոդը»։ Հաջողության բանալին ստանդարտիզացումն ու անվտանգությունն է 'OIDC-ը մրցույթի փոխարեն, ստորագրությունը և SBSA-ը, որակի դարպասները, մեկ արտեֆակտը' խթանված, GitOps-առաքումը և դիտումը DORA-ի միջոցով։ Կառուցեք գլանափաթեթներ որպես ապրանք, չափեք, պարզեցրեք, արագացրեք, և ածխաջրածինները կդառնան ռուտիկ, ոչ թե իրադարձություն։