خطوط أنابيب CI/CD: إجراءات GitHub، GitLab CI
خطوط أنابيب CI/CD: إجراءات GitHub، GitLab CI
1) CI/CD Task and Platform Space
CI/CD هو التجميع المستمر، والاختبار، وإيصال التغييرات من المستودع إلى بيئات الإنتاج. الأهداف:- سرعة الإطلاقات وإمكانية التنبؤ بها (مهلة زمنية قصيرة).
- الجودة (اختبارات تلقائية، تحليل ثابت/ديناميكي).
- أمن سلسلة الإمداد (توقيع القطع الأثرية، ومراقبة الدخول).
- الموثوقية (رواسب الكناري، التراجع السريع).
- إمكانية الرصد (التتبع والمقاييس في كل مرحلة).
المبادئ الرئيسية: «خط الأنابيب كرمز،» القطع الأثرية غير القابلة للتغيير «، بناء مرة واحدة - تشغيل العديد»، «أمن التحول إلى اليسار»، «الامتياز الأيسر»، التجمعات الحتمية.
2) الأنماط المعمارية للناقلات
بوابة المرحلة: بناء → اختبار → حزمة → الأمنية → نشر → عمليات التفتيش بعد النشر.
Fan-out/Fan-in: مجموعات مصفوفة متوازية (لغات/منصات) مع توليف النتائج.
الترويج: يتم الترويج لنفس القطعة الأثرية من خلال البيئة (مرحلة → التطوير → حث)، وليس إعادة تجميعها.
الفروع القائمة على الجذع + القصيرة: تقليل الانجراف، الشيكات الآلية على العلاقات العامة/السيد.
قابلة لإعادة الاستخدام: تدفقات العمل القابلة لإعادة الاستخدام GitLab: تشمل/خطوط أنابيب الأطفال).
GitOps (اختياري): فصل «التجميع» و «التسليم» (أرغو CD/Flux يرصد بيئات إعادة الشراء الإعلانية).
3) أمن سلسلة التوريد
تحديد الهوية: اتحاد OIDC من عداء إلى سحابة (بدون مفاتيح طويلة العمر).
الأسرار: التخزين المركزي، وتقييد السياق، وحظر قطع الأشجار.
توقيع القطع الأثرية/الحاويات (cosign/Sigstore)، التحقق من التوقيع في مراقبة الدخول.
SBOM (CycloneDX/SPDX) و SCA و SAST/DAST/Countainer Scan - «بوابة إلزامية».
السياسيون: OPA/Conftest for IaC/manifestos' لا أحدث "، يحظر الحاويات المميزة.
عزل العدائين: المتسابقون في شبكة خاصة، منفصلون عن الإنترنت العام.
4) إجراءات GitHub - الهيكل والممارسات
4. هيكل سير العمل 1
".github/workflows/.yml' - триггеры ('on: push، 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: write "ممكنة لـ 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 الهيكل الأساسي
جيتلاب سي. yml' at the root; الكيانات الرئيسية: 'مراحل'، 'وظائف'، 'قواعد'، 'احتياجات'، 'قطع أثرية'، 'بيئات'، 'دليل'.
إعادة الاستخدام: «تشمل:» (الأنماط المحلية/البعيدة)، خطوط أنابيب الأطفال/الوالدين للأحادي المعقد.
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
المفاتيح:
- «بارالي». مصفوفة 'محاكاة تجميعات المصفوفة.
- «القطع الأثرية» + تقارير الاختبار.
- البيئات مع «on _ stop»، دليل «when: manual» للموافقات.
- DIND لبناء صورة (أفضل - Kaniko/BuildKit في عداء 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 والاختبارات المحددة النطاق حسب المسار.
المباني الإضافية: تحديد المجموعات/الخرائط المتأثرة ؛ مخبأ بمفاتيح المسار وملفات القفل.
خطوط الأنابيب الديناميكية: تعمل خطوط أنابيب الأطفال/« سير العمل _ المكالمة »فقط للمكونات المتغيرة.
Versioning: semver لكل وحدة، changelog في مرحلة الإصدار.
7) التخزين المؤقت والتسريع
مخابئ عنوان المحتوى (hashFiles/lockfile).
مخبأ منفصل للتبعيات والتحف.
صور العداء قبل الدفء (سلاسل الأدوات، SDK).
مرايا العبوات المحلية (npm/pip/maven) ومخبأ تسجيل الحاويات.
8) استراتيجيات الإصدار والتراجع
الكناري: زيادة تدريجية في النسبة المئوية لحركة المرور ؛ التوقف التلقائي أثناء تدهور SLO.
الأزرق الأخضر: أكوام متوازية، تبديل فوري.
الظل: طلبات مكررة دون التأثير على العميل.
أعلام الميزة: الطرح على مستوى العلم، وليس مستوى الإصدار.
التراجع: نصوص واضحة بزر واحد، يتم تخزين نسخة القطع الأثرية في البيانات الوصفية للإصدار.
9) البنية التحتية و GitOps
IaC: Terraform/Ansible/Helm تدار في repos منفصلة ؛ سياسة الرمز كبوابة.
GitOps-contour: Argo CD/Flux يراقب إعادة الشراء مع بيانات البيئات ؛ يقوم خط الأنابيب فقط بإنشاء قطعة أثرية وتحديث الإصدارات في Git.
المزايا: تاريخ واضح للتغيرات البيئية، الغباء، التراجع القياسي عبر Git.
10) إمكانية رصد CI/CD
مقاييس DORA: معدل الاستنفاد، الوقت من الالتزام إلى الإنتاج، معدل الفشل، MTTR.
القياس عن بعد: وقت طوابير الوظائف، ومدة المراحل، ومعدل إصابة المخبأ، وتواتر الاختبارات غير المستقرة.
سجلات الأمن: من بدأ الإفراج، وما هي البوابات التي تم تمريرها، وما هي الاستثناءات التي صدرت.
11) مراقبة الدخول والموافقات
حماية الفرع والتحقق الإلزامي.
الموافقات البيئية: قوائم موافقات منفصلة على خشبة المسرح/الدفع.
الوصول إلى IT للخطوات اليدوية، تسجيل الجلسات.
فصل الواجبات: أدوار مختلفة لـ «يكتب الكود»، «يوافق»، «الإصدارات».
12) الأخطاء المتكررة (الأنماط المضادة)
مفاتيح سحابية طويلة العمر في أسرار إعادة الشراء بدلاً من أدوار OIDC.
تجميع قطع أثرية مختلفة للمرحلة والحث (انتهاك «البناء مرة واحدة»).
«أنسب» العلامات والصور القابلة للتغيير.
نشر الأسرار في سجلات الخطوات (إخفاء غير معطل).
عداء عام واحد لنشر الإنتاج.
عدم وجود «بوابات» أمنية (SAST/SCA/Policy) وفحوصات ما بعد النشر.
13) قائمة التنفيذ المرجعية (0-60 يومًا)
0-15 أيام
قم بتهيئة قواعد العلاقات العامة/MR القائمة على الجذع، والفحوصات الثابتة الإلزامية.
تمكين اتحاد OIDC من السحابة ؛ الحد الأدنى من «الامتيازات».
متسابقو البريد: عام - لـ CI، خاص - للقرص المضغوط.
16-30 يومًا
يضاف SBOM، توقيع الصورة ؛ المجموعة - التحقق من التوقيع.
أدخل الكناري/الأزرق الأخضر ؛ التراجع التلقائي من قبل SLO.
مخبأ التبعيات والقطع الأثرية، صور ما قبل الدفء.
31-60 يومًا
تجميع وتسليم منفصلين (GitOps)، بوابة السياسة كرمز.
تحديد مقاييس وتنبيهات DORA لتدهور خطوط الأنابيب.
خطوط أنابيب نموذجية (قابلة لإعادة الاستخدام/الطفل) لجميع الخدمات.
14) نصائح موثوقية عملية
دعم خطوط الأنابيب الصغيرة والسريعة (10-12 دقيقة قبل إشارة العلاقات العامة).
اقتل الاختبارات غير المستقرة: علامات الحجر الصحي + الإصلاح الموازي.
لا تخلط القطع الأثرية من CI وتطلق القطع الأثرية ؛ البيانات الوصفية للتخزين (الالتزام، الوقت، SBOM، التوقيعات).
امنح المطورين نصوصًا محلية مطابقة لخطوات خط الأنابيب (تكافؤ dev-prod).
15) قوالب لإعادة الاستخدام
15. 1 إجراءات GitHub - سير العمل الأمني القابل لإعادة الاستخدام (مبسط)
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)
توفر GitHub Actions و GitLab CI آليات ناضجة لحلقة → رمز سريعة وآمنة. مفتاح النجاح هو التوحيد والأمن: OIDC بدلاً من المفاتيح والتوقيع و SBOM، وبوابات عالية الجودة، وقطعة أثرية واحدة مع الترويج، وتسليم GitOps وإمكانية الملاحظة من خلال DORA. قم ببناء خطوط الأنابيب كمنتج: قياس وتبسيط وتسريع - وستصبح الإصدارات عملاً روتينيًا وليس حدثًا.