GH GambleHub

CI/CD konveyerləri: GitHub Actions, GitLab CI

CI/CD konveyerləri: GitHub Actions, GitLab CI

1) CI/CD vəzifəsi və platformada yer

CI/CD fasiləsiz montaj, test və resepsiyondan iş mühitinə dəyişikliklərin çatdırılmasıdır. Məqsədlər:
  • Buraxılışların sürəti və proqnozlaşdırılması (qısa vaxt).
  • Keyfiyyət (avtostestlər, statik/dinamik analiz).
  • Təchizat zəncirinin təhlükəsizliyi (artefaktların imzası, giriş nəzarəti).
  • Etibarlılıq (kanarya deploları, sürətli geri dönüş).
  • Müşahidə (hər mərhələdə izləmə və metrika).

Açar prinsiplər: «pipeline as code», immutable artefaktlar, «build once - run many», «shift-left security», «least privilege», determinated montajlar.

2) Konveyerlərin memarlıq nümunələri

Stage-gate: build → test → security → package → deploy → post-deploy checks.
Fan-out/Fan-in: nəticələrin birləşməsi ilə paralel matris montajları (dillər/platformalar).
Promotion: Eyni artefakt çevrələr vasitəsilə irəliləyir (dev → stage → prod), dəyişdirilmir.
Trunk-based + qısa filiallar: sürüklənmənin minimuma endirilməsi, PR/MR üçün avtomatlaşdırılmış yoxlamalar.
Reusable: təkrar istifadə workflow/şablonları (Actions: reusable workflows; GitLab: includes/child-pipelines).
GitOps (isteğe bağlı): «montaj» və «çatdırılma» bölməsi (Argo CD/Flux deklarativ repo mühitləri izləyir).

3) Təchizat zəncirinin təhlükəsizliyi (supply chain)

Identifikasiya: OIDC-federasiya runner 'a-dan buluda (uzun ömürlü açarlar olmadan).
Sirlər: mərkəzləşdirilmiş saxlama, kontekstin məhdudlaşdırılması, girişdə çıxış qadağası.
Artefaktların/konteynerlərin imzası (cosign/Sigstore), admission-kontrolda imzanın yoxlanılması.
SBOM (CycloneDX/SPDX) və SCA, SAST/DAST/Konteyner Scan - «məcburi qapılar».
Siyasətlər: IaC/manifestlər üçün OPA/Conftest, «no latest», imtiyazlı konteynerlərin qadağan edilməsi.
Runner izolyasiyası: Prod-runners private network, ictimai internet çıxış ayrılması.

4) GitHub Actions - struktur və təcrübələr

4. 1 workflows strukturu

`.github/workflows/.yml` — триггеры (`on: push, pull_request, schedule, workflow_call`).
standartlaşdırma üçün Reusable workflows (linter, SCA, konteyner montaj, deploy).

4. 2 Nümunə: OIDC və şəkil imzası ilə çox mərhələli paypline

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' minimuma endirilib, 'id-token: write' OIDC üçün aktivdir.
  • approvers və URL ilə Environments, 'concurrency' yarış qoruyur.
  • Trafikin kanaryaya daxil edilməsi və SLO avtomatik geri çəkilməsi.

4. 3 Reusable workflow (çağırış nümunəsi)

yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high

5) GitLab CI - struktur və təcrübələr

5. 1 Əsas struktur

`.gitlab-ci. yml 'kökündə; əsas varlıqlar: 'stages', 'jobs', 'rules', 'needs', 'artifacts', 'environments', 'manual'.
Reuse: 'include:' (lokal/remote şablonları), mürəkkəb monorepolar üçün child/parent pipelines.

5. 2 Nümunə: matris, cache, imza, mühit və 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 montajları təqlid edir.
  • 'artifacts' + test hesabatları.
  • Environments with 'on _ stop', əl ilə 'when: manual' approvals üçün.
  • DIND (daha yaxşı - Kaniko/BuildKit k8s-ranner).

5. 3 Child pipelines və monorepo üçün 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) Monorepozitoriya və çoxservislilik

Directory-based ownership: CODEOWNERS və yollarda scoped testlər.
Incremental builds: təsirlənmiş paketlər/çartlar müəyyən; yol açarları və lock faylları ilə cache.
Dynamic pipelines: child-pipelines/' workflow _ call 'yalnız dəyişdirilmiş komponentlər üçün çalışır.
Version: hər modul üçün semver, release mərhələsində changelog.

7) Caching və sürətləndirmə

Məzmun ünvan caches (hashFiles/lockfile).
Asılılıq və artefaktlar üçün ayrı cache.
Pre-warm runner images (toolchains, SDK).
Yerli güzgü paketi (npm/pip/maven) və konteyner registry-cache.

8) Reliz strategiyaları və geri dönüş

Canary: trafik faizinin tədricən artırılması; SLO deqradasiyası zamanı avtomatik stop.
Blue-Green: paralel yığınlar, ani keçid.
Shadow: müştəriyə təsir etmədən sorğuların dublyajı.
Feature flags: release deyil, bayraq səviyyəsində rollout.
Rollback: «bir düymə» ilə aydın skriptlər, artefaktın versiyası buraxılışın meta məlumatlarında saxlanılır.

9) Infrastruktur və GitOps

IaC: Terraform/Ansible/Helm ayrı repo idarə; qapı kimi policy-as-code.
GitOps-kontur: Argo CD/Flux mühit manifestləri ilə repo müşahidə; konveyer yalnız artefakt yaradır və Git versiyalarını yeniləyir.
Faydaları: ətraf mühitin dəyişməsinin aydın tarixi, idempotentlik, Git vasitəsilə standart geri dönüşlər.

10) CI/CD müşahidə

DORA metrləri: deploların tezliyi, kommitdən prodakşna qədər olan vaxt, uğursuzluq faizi, MTTR.
Telemetry: job's növbə vaxtı, mərhələ müddəti, hit-rate cache, flaky test tezliyi.
Təhlükəsizlik qeydləri: buraxılışı kim başlatdı, hansı qapı keçdi, hansı istisnalar verildi.

11) Access Management və approvals

Branch protection və məcburi yoxlamalar.
Environment-approvals: stage/prod-da ayrı-ayrı approvers siyahıları.
Əl addımları üçün JIT giriş, sessiyaların qeydiyyatı.
Vəzifələrin ayrılması: «kodu yazır», «təsdiq edir», «buraxır» üçün müxtəlif rollar.

12) Tez-tez səhvlər (anti-nümunələr)

OIDC rolları əvəzinə repo gizli uzun ömürlü bulud açarları.
Stage və prod üçün müxtəlif artefaktların yığılması («build once» pozuntusu).
'latest' etiketlər və mutable-şəkillər.
Addımlardakı sirlərin yayımlanması (masking).
Prod deploys üçün bir ümumi public runner.
Təhlükəsizlik «qapısı» yoxdur (SAST/SCA/Policy) və post-deploy yoxlamalar.

13) Giriş çek siyahısı (0-60 gün)

0-15 gün

trunk-based, PR/MR qaydaları, məcburi statik yoxlamalar.
Buluta OIDC federasiyasını daxil edin; minimum 'permissions'.
Runner 'ləri dağıtın: açıq - CI üçün, şəxsi - CD üçün.

16-30 gün

SBOM əlavə, image imza; klasterdə - imzanın yoxlanılması.
canary/blue-green daxil edin; SLO avto-rollback.
Asılılıq və artefaktların cache, pre-warm şəkillər.

31-60 gün

Montaj və çatdırılma bölmək (GitOps), policy-as-code qapıları.
Paylaynların deqradasiyası üçün DORA metrikləri və alertləri qurun.
Bütün xidmətlər üçün paylaynları (reusable/child) şablonlaşdırın.

14) Etibarlılıq praktiki məsləhətləri

Kiçik, sürətli paylaynları saxlayın (PR siqnalına 10-12 dəqiqə).
Flaky testlərini öldürün: quarantine etiketləri + paralel fiks.
CI-artefaktları və release-artefaktları qarışdırmayın; meta məlumatları (commit, time, SBOM, imzalar) saxlayın.
Tərtibatçılara konveyer addımlarına bənzər yerli skriptlər verin (dev-prod parity).

15) Yenidən istifadə üçün şablonlar

15. 1 GitHub Actions - security reusable workflow (sadələşdirilmiş)

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 şablonu (sadələşdirilmiş)

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) Nəticə

GitHub Actions və GitLab CI sürətli və təhlükəsiz «kod → prod» dövrü üçün yetkin mexanizmlər təmin edir. Uğurun açarı standartlaşdırma və təhlükəsizlikdir: açar əvəzinə OIDC, imza və SBOM, keyfiyyət qapısı, promosyon ilə vahid artefakt, GitOps-çatdırılma və DORA vasitəsilə müşahidə. Bir məhsul kimi paylaynlar qurun: ölçün, sadələşdirin, sürətləndirin - və buraxılışlar bir hadisə deyil, rutin olacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.