Қубурҳои CI/CD: Амалҳои Git
Қубурҳои CI/CD: Амалҳои Git
1) Вазифаи CI/CD ва фазои платформа
CI/CD васл, озмоиш ва таҳвили пайваста аз анбор ба муҳити истеҳсолӣ мебошад. Вазифаҳо:- Суръат ва пешгӯии релизҳо (вақти кӯтоҳи сурб).
- Сифат (санҷишҳои худкор, таҳлили статикӣ/динамикӣ).
- Амнияти занҷираи таъминот (имзои артефакт, назорати дастрасӣ).
- Эътимоднокӣ (конҳои канарӣ, суръати тез).
- Мушоҳида (пайгирӣ ва ченакҳо дар ҳар марҳила).
Принсипҳои асосӣ: "қубур ҳамчун рамз", артефактҳои тағйирнопазир, "як бор созед - бисёриҳоро иҷро кунед", "бехатарии чап", "имтиёзи чап", маҷлисҳои детерминистӣ.
2) Намунаҳои меъмории конвейерҳо
Марҳилаи дарвоза: build test ī security package packets → ҷойгир кардан → чекҳои пас аз ҷойгиркунӣ.
Фан-берун/Фан-дар: маҷмӯаҳои параллелии матритса (забонҳо/платформаҳо) бо ҳамоҳангсозии натиҷаҳо.
Таблиғ: ҳамон артефакт тавассути муҳити зист тарғиб карда мешавад (dev → stage → prod) ва аз нав насб карда намешавад.
Шохаҳои ба магистрал асосёфта + шохаҳои кӯтоҳ: ҳадди аққал кам кардан, санҷишҳои автоматӣ дар PR/MR.
Истифодаи такрорӣ: ҷараёнҳои аз нав истифодашавандаи Gitlab: дохил/қубурҳои кӯдакон).
Gitops (ихтиёрӣ): ҷудокунии "васлкунӣ" ва "таҳвил" (Argo CD/Flux муҳити декларативии репо).
3) Амнияти занҷираи таъминот
Муайянсозӣ: Федератсияи OIDC аз даванда то абр (бе калидҳои дароз).
Асрҳо: нигаҳдории мутамарказ, маҳдудияти контекст, манъи воридшавӣ.
Имзои артефактҳо/контейнерҳо (cosign/Sigstore), санҷиши имзо дар назорати қабул.
SBOM (Cyclone .DX/SPDX) ва SCA, SAST/DAST/Container Scan - "дарвозаи ҳатмӣ".
Сиёсатмадорон: OPA/Confest for IAC/манифест, "охирин нест", манъ кардани контейнерҳои имтиёзнок.
Ҷудокунии давандагон: проекторҳо дар шабакаи хусусӣ, дастрасии алоҳида аз Интернети ҷамъиятӣ.
4) Амалҳои GIT Hub - Сохтор ва амалия
4. 1 сохтори ҷараёни корӣ
'.github/workwows/.yml' - триггеры ('оид: тела, pull_request, ҷадвал, workflow_call').
Ҷараёни кории такрорӣ барои стандартизатсия (линтер, SCA, монтажи контейнер, ҷойгиркунӣ).
4. 2 Мисол: лӯлаи бисёрқабата бо 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: навиштан' барои OIDC фаъол аст.
- Муҳитҳо бо тасдиқҳо ва URL, 'мувофиқат' аз мусобиқа муҳофизат мекунанд.
- Фарогирии канарӣ ва гардиши автоматӣ аз SLO.
4. 3 Ҷараёни кории такрорӣ (мисоли занг)
yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high
5) Gitlab CI - Сохтор ва амалия
5. 1 Сохтори асосӣ
'.gitlab-ci. yml 'дар реша; сохторҳои асосӣ: "марҳилаҳо", "корҳо", "қоидаҳо", "эҳтиёҷот", "артефактҳо", "муҳитҳо", "дастур".
Истифодаи дубора: 'дохил кунед:' (намунаҳои маҳаллӣ/дурдаст), қубурҳои кӯдакон/волидайн барои монорепосҳои мураккаб.
5. 2 Мисол: матритса, кэш, имзо, муҳит ва тасдиқ
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
Калидҳо:
- 'параллел. матритса 'василаҳои матритсаро тақлид мекунад.
- 'artifacts' + ҳисоботҳои санҷишӣ.
- Муҳитҳо бо 'on _ stop', дастур 'кай: дастур' барои тасдиқ.
- DIND барои сохтани образ (беҳтар - Kaniko/Build. Kit дар давандаи k8s).
5. 3 Қубурҳои кӯдакон ва барои монорепос дохил мешаванд
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) Монорепоситарӣ ва бисёрсоҳавӣ
Моликияти ба феҳрист асосёфта: CODEOWNERS ва санҷишҳои васеъ бо роҳ.
Сохтани афзоянда: муайян кардани бастаҳо/диаграммаҳои зарардида; кэш аз рӯи калидҳои роҳ ва қулф кардани файлҳо.
Қубурҳои динамикӣ: қубурҳои кӯдакон/' ҷараёни кор _ занг 'танҳо барои ҷузъҳои ивазшуда кор мекунанд.
Версия: semver барои ҳар як модул, changelog дар марҳилаи озодкунӣ.
7) Кэшкунӣ ва суръатбахшӣ
Кэши суроғаҳои мундариҷа (hash-Files/lockfile).
Кэши алоҳида барои вобастагӣ ва артефактҳо.
Тасвирҳои пеш аз гарм даванда (асбобҳо, SDK).
Оинаҳои бастаҳои маҳаллӣ (npm/pip/maven) ва кэши бақайдгирии контейнерҳо.
8) Стратегияҳо ва бозгаштро озод кунед
Канария: тадриҷан зиёд шудани фоизи трафик; худкор дар вақти таназзули SLO.
Кабуд-Сабз: стекҳои параллелӣ, гузариши фаврӣ.
Соя: дархостҳои такрорӣ бидуни таъсир ба муштарӣ.
Парчамҳои хусусият: паҳнкунӣ дар сатҳи парчам, на сатҳи озод.
Rollback: скриптҳои як тугмаро тоза кунед, нусхаи артефакт дар метамаълумоти озод нигоҳ дошта мешавад.
9) Инфраструктура ва GIT
IAC: Terraform/Ansible/Helm дар репоҳои алоҳида идора карда мешаванд; сиёсат-ас-код ҳамчун дарвоза.
Gitops-contour: Argo CD/Flux репоро бо манифести муҳит мушоҳида мекунад; лӯла танҳо артефакт эҷод мекунад ва версияҳоро дар Git нав мекунад.
Афзалиятҳо: таърихи равшани тағирёбии муҳити зист, аблаҳӣ, рахнаи стандартӣ тавассути Git.
10) Риояи CI/CD
Нишондиҳандаҳои DORA: сатҳи фарсудашавӣ, вақт аз ӯҳдадорӣ ба истеҳсолот, сатҳи нокомӣ, MTTR.
Телеметрия: вақти навбатҳои корӣ, давомнокии марҳилаҳо, суръати кэш, басомади санҷишҳои номуайян.
Гузоришҳои амниятӣ: кӣ озодкуниро оғоз кард, дарвозаҳо гузаштанд, ба истиснои онҳо.
11) Назорат ва тасдиқи дастрасӣ
Муҳофизати филиал ва санҷишҳои ҳатмӣ.
Тасдиқи муҳити зист: рӯйхати тасдиқи алоҳида дар саҳна/прод.
Дастрасии JIT барои қадамҳои дастӣ, сабти сеанс.
Тақсимоти вазифаҳо: нақшҳои гуногун барои "менависад код", "тасдиқ мекунад", "релизҳо".
12) Хатогиҳои зуд-зуд (зидди намунаҳо)
Калидҳои абрии дарозмуддат дар сирри репо ба ҷои нақшҳои OIDC.
Ҷамъ кардани артефактҳои гуногун барои саҳна ва прод (вайрон кардани "як бор сохтан").
'latest' tags ва тасвирҳои mutable.
Нашри асрори гузоришҳои қадам (ниқоби ғайрифаъол).
Як давандаи маъмули ҷамъиятӣ барои ҷойгиркунии истеҳсолот.
Набудани "дарвозаҳо" -и амният (SAST/SCA/Policy) ва чекҳои пас аз ҷойгиркунӣ.
13) Рӯйхати санҷиши амалисозӣ (0-60 рӯз)
0-15 рӯз
Танзими қоидаҳои магистралӣ, PR/MR, санҷишҳои ҳатмии статикӣ.
Фаъол кардани федератсияи OIDC ба абр; минималии 'permissions'.
Давандагони почта: оммавӣ - барои CI, хусусӣ - барои CD.
16-30 рӯз
Илова кардани SBOM, имзои тасвир; Кластер - Санҷиши имзо.
Канария/кабуд-сабзро ворид кунед; худкор аз ҷониби SLO.
Кэши вобастагӣ ва артефактҳо, тасвирҳои пеш аз гарм.
31-60 рӯз
Васлкунӣ ва таҳвили ҷудогона (GITOPS), дарвозаи сиёсат ҳамчун код.
Таъсис додани ченакҳои DORA ва огоҳиҳо дар бораи таназзули қубурҳо.
Қубурҳои қолабӣ (аз нав истифодашаванда/кӯдак) барои ҳама хизматрасониҳо.
14) Маслиҳатҳои эътимоднокии амалӣ
Қубурҳои хурд ва зудро дастгирӣ кунед (10-12 дақиқа пеш аз сигнали PR).
Озмоишҳои номуайянро кушед: барчаспҳои карантин + ислоҳи параллелӣ.
Артефактҳои CI-ро омехта накунед ва артефактҳоро раҳо накунед; метамаълумотро нигоҳ доред (содир, вақт, SBOM, имзоҳо).
Ба таҳиягарон скриптҳои маҳаллиро бо қадамҳои қубур якхела диҳед (паритети dev-prod).
15) Қолибҳо барои истифодаи такрорӣ
15. 1 Амалҳои GIT Hub - ҷараёни кории такрории амният (соддакардашуда)
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 - ҷойгиркунии қолабҳоро дар бар мегирад (соддакардашуда)
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) Хулоса
Амалҳои Git- Hub ва Git- Lab CI механизмҳои баркамолро барои коди зуд ва бехатар дар ҳалқаи prod таъмин мекунанд. Калиди муваффақият стандартизатсия ва амният аст: OIDC ба ҷои калидҳо, имзоҳо ва SBOM, дарвозаҳои сифат, як артефакт бо таблиғ, таҳвил ва мушоҳидаҳо тавассути DORA. Сохтани қубурҳо ҳамчун маҳсулот: Андозагирӣ, содда кардан, суръат бахшидан - ва релизҳо кори душвор хоҳад буд, на ҳодиса.