CI/CD konweýerleri: GitHub Actions, GitLab CI
CI/CD konweýerleri: GitHub Actions, GitLab CI
1) CI/CD wezipesi we platformada orny
CI/CD - bu üýtgemeleri yzygiderli ýygnamak, synagdan geçirmek we repozitoriýadan iş gurşawyna eltmek. Maksatlar:- Çykyşlaryň tizligi we öňünden aýdylyşy (gysga lead time).
- Hili (awtotestler, statiki/dinamiki derňew).
- Üpjünçilik zynjyrynyň howpsuzlygy (artefaktlaryň goly, elýeterlilige gözegçilik).
- Ygtybarlylyk (kanar deplolary, çalt yza gaýdyp gelmek).
- Syn edilmegi (her tapgyrda trasirleme we metrika).
Esasy ýörelgeler: "pipeline as code", imutable artefaktlar, "build once - run many", "shift-left security", "least privilege", determinirlenen gurnamalar.
2) Konweýerleriň binagärlik patternleri
Stage-gate: build → test → security → package → deploy → post-deploy checks.
Fan-out/Fan-in: netijeleri birleşdirmek bilen paralel matrisa ýygnaklary (diller/platformalar).
Promotion: şol bir artefakt gurşawyň üsti bilen hereket edýär (dev → stage → prod).
Trunk-based + gysga şahalar: süýşmegi azaltmak, PR/MR üçin awtomatlaşdyrylan barlaglar.
Reusable: gaýtadan ulanylýan workflow/şablonlar (Actions: reusable workflows; GitLab: includes/child-pipelines).
GitOps (goşmaça): "ýygnamak" we "eltip bermek" bölünişi (Argo CD/Flux deklaratiw gurşaw reposyna gözegçilik edýär).
3) Üpjünçilik zynjyrynyň howpsuzlygy (supply chain)
Tanamak: OIDC federasiýasy runner 'a-dan buluta (uzak ömürli açarlarsyz).
Syrlar: merkezleşdirilen ammar, kontekstiň çäklendirilmegi, girelgä çykarylmagynyň gadagan edilmegi.
Artefaktlaryň/konteýnerleriň (cosign/Sigstore) goly, admission-gözegçilikdäki goly barlamak.
SBOM (CycloneDX/SPDX) we SCA, SAST/DAST/Kontainer Scan - "hökmany derwezeler".
Syýasatlar: IaC/manifestler üçin OPA/Conftest, "no latest", artykmaç konteýnerleriň gadagan edilmegi.
Runner 'ow izolýasiýasy: prod-ranners hususy torda, köpçüligiň internetinden çykýan elýeterliligi aýyrmak.
4) GitHub Actions - gurluş we amallar
4. 1 workflows
`.github/workflows/.yml` — триггеры (`on: push, pull_request, schedule, workflow_call`).
Standartlaşdyrmak üçin reusable workflows (linter, SCA, konteýner ýygnamak, deploy).
4. 2 Mysal: OIDC we şekiliň goly bolan köp basgançakly paýpline
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
Açarlar:
- 'permissions' iň pes derejä düşürildi, 'id-token: write' OIDC üçin.
- Approvers we URL-den Environments, 'concurrency' ýaryşlardan goraýar.
- Traffigiň kanareik açylmagy we SLO boýunça awtomatiki yza gaýdyp gelmek.
4. 3 Reusable workflow
yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high
5) GitLab CI - gurluş we amallar
5. 1 Esasy gurluşy
`.gitlab-ci. yml 'kökünde; Esasy zatlar: 'stages', 'jobs', 'rules', 'needs', 'artifacts', 'environments', 'manual'.
Reuse: 'include:' (lokal/remote şablonlary), çylşyrymly monorepolar üçin child/parent pipelines.
5. 2 Mysal: matrisa, kesh, gol, gurşaw we 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
Açarlar:
- `parallel. matrix 'matrix gurnamalaryna öýkünýär.
- 'artifacts' + synag hasabatlary.
- Environments c 'on _ stop', eli 'when: manual' approvals.
- DIND (has gowusy - Kaniko/BuildKit k8s-rannerde).
5. 3 Child pipelines we include monorepo üçin
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) Monorepozitoriýa we köp serwisizlik
Directory-based ownership: CODEOWNERS we ýollar boýunça skoped synaglary.
Incremental builds: täsir eden paketleri/tertipleri kesgitleýäris; ýol açarlary we lock faýllary boýunça keş.
Dynamic pipelines: child-pipelines/' workflow _ call 'diňe üýtgedilen komponentler üçin açylýar.
Wersiýalaşdyrmak: her modul üçin semver, release tapgyrynda changelog.
7) Kesmek we çaltlaşdyrmak
Adres kesişleri (hashFiles/lockfile).
Endikler we artefaktlar üçin aýratyn kesh.
Pre-warm runner images (toolchains, SDK).
Paketleriň ýerli aýnalary (npm/pip/maven) we konteýner registry-kesh.
8) Goýberiş strategiýalary we yzyna gaýtarmak
Canary: traffigiň göterimini kem-kemden artdyrmak; SLO zaýalananda awto-stop.
Blue-Green: paralel akymlar, derrew geçiş.
Shadow: müşderä täsir etmezden haýyşlary köpeltmek.
Feature flags: rollout -dan çykmak däl-de, baýdak derejesinde.
Rollback: "bir düwmäniň" aýdyň skriptleri, artefaktyň wersiýasy neşiriň meta-maglumatlarynda saklanýar.
9) infrastruktura we GitOps
IaC: Terraform/Ansible/Helm aýratyn repoda dolandyrylýar; policy-as-code derweze hökmünde.
GitOps-kontur: Argo CD/Flux daşky gurşawyň manifestleri bilen repo synlaýar; konweýer diňe artefakt döredýär we Git-daky wersiýalary täzeleýär.
Peýdalary: daşky gurşawyň üýtgemeginiň aýdyň taryhy, idempotentlik, Git arkaly adaty yza gaýdyp gelmek.
10) CI/CD syn edilişi
DORA-metrikler: deplolaryň ýygylygy, kommitden önümçilige çenli wagt, şowsuzlyklaryň göterimi, MTTR.
Telemetry: nobatlaryň wagty, tapgyrlaryň dowamlylygy, keş hit-rate, flaky-synaglaryň ýygylygy.
Howpsuzlyk ýazgylary: kim goýbermäge başlady, haýsy derwezeler geçdi, haýsy kadadan çykmalar berildi.
11) Elýeterliligi dolandyrmak we approvals
Branch protection we hökmany barlaglar.
Environment-approvals: stage/prod.
El bilen ädimler üçin JIT elýeterliligi, sessiýalary ýazga almak.
Borçlaryň bölünişi: "kody ýazýar", "tassyklaýar", "goýberýär" üçin dürli rollar.
12) Ýygy-ýygydan ýalňyşlyklar (anti-patternler)
OIDC rollarynyň ýerine repo syrlarynda uzak ömürli bulut açarlary.
Stage we prod üçin dürli artefaktlary ýygnamak ("build once" -ni bozmak).
'latest' bellikleri we mutable-şekiller.
Ädimlerdäki syrlary çap etmek (masking).
Prod-deploys üçin bir umumy public-runner.
Howpsuzlyk "derwezesi" (SAST/SCA/Policy) we post-deploy barlaglary ýok.
13) Giriş çek-sanawy (0-60 gün)
0-15 gün
Trunk-based, PR/MR düzgünleri, hökmany statiki barlaglary sazla.
Buluta OIDC federasiýasyny goşmak; iň az 'permissions'.
Runner 'leri ýaýratmak: jemgyýetçilik - CI üçin, hususy - CD üçin.
16-30 gün
SBOM goşmak, şekilleriň goly; klasterde - goly barlamak.
canary/blue-green giriň; SLO boýunça awto-rollback.
Endikler we artefaktlar üçin keş, şekiller üçin deslapky warm.
31-60 gün
GitOps (GitOps), policy-as-code derwezesini bölüň.
DORA-metrikleri we paýlaýnlaryň zaýalanmagy boýunça aladalary ýola goýmak.
Ähli hyzmatlar üçin payplaynlary (reusable/child) şablon et.
14) Ygtybarlylyk boýunça amaly maslahatlar
Kiçijik, çalt paýlanmalary saklaň (PR signalyndan 10-12 minut öň).
Flaky-synaglary öldüriň: quarantine-bellikler + paralel fix.
CI-artefaktlary we release-artefaktlary garyşdyrmaň; meta maglumatlary (commit, time, SBOM, gollar) saklaň.
Işläp düzüjilere konweýer ädimlerine (dev-prod parity) meňzeş ýerli skriptleri beriň.
15) Gaýtadan ulanmak üçin şablonlar
15. 1 GitHub Actions - security 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 şablony (ýönekeýleşdirilen)
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) Netijenama
GitHub Actions we GitLab CI çalt we howpsuz "kod → prod" aýlawy üçin ýetişen mehanizmleri üpjün edýär. Üstünligiň açary - standartlaşdyrma we howpsuzlyk: Açarlaryň ýerine OIDC, gol we SBOM, hil derwezesi, mahabat bilen bir artefakt, GitOps-eltip bermek we DORA arkaly syn etmek. Önüm hökmünde paýlaýjylary guruň: ölçäň, ýönekeýleşdiriň, çaltlaşdyryň - we goýberişler waka däl-de, adaty ýagdaýa öwrüler.