צינורות CI/CD: GitHub Actions, GitLab CI
צינורות CI/CD: GitHub Actions, GitLab CI
1) משימת CI/CD וחלל פלטפורמה
CI/CD הוא ההרכבה, הבדיקות וההעברה של שינויים מהמאגר לסביבות הייצור. מטרות:- מהירות וניבוי של שחרור (זמן עופרת קצר).
- איכות (בדיקות אוטומטיות, ניתוח סטטי/דינמי).
- אבטחת שרשרת אספקה (חתימת חפץ, בקרת גישה).
- אמינות (מרבצי קנרית, רולבק מהיר).
- יכולת תצפית (עקבות ומדדים בכל שלב).
עקרונות מפתח: "צינור כקוד", "חפצים בלתי ניתנים לשינוי", לבנות פעם אחת - לרוץ הרבה "," משמרת ביטחון "," זכות שמאל ", אסיפות דטרמיניסטיות.
2) תבניות אדריכליות של מסועים
שלב-שער: לבנות * test _ tash ackage * presploys = = בדיקות לאחר פריסה.
Funder-out/Funder-in: matrix assemblies (שפות/פלטפורמות) עם קונקטינציה של תוצאות.
קידום: אותו חפץ מקודם דרך הסביבה (dev stage _ prod), ולא הורכב מחדש.
ענפים קצרים מבוססי תא מטען: מזעור סחיפה, בדיקות אוטומטיות על יחסי ציבור/מר
ניתן לשימוש חוזר: זורמים מחדש GitLab: כולל/צינורות-ילד).
GitOps (אופציונלי): הפרדה של ”הרכבה” ו ”משלוח” (Argo CD/Flux Monitor Repo sability).
3) אבטחת שרשרת אספקה
זיהוי: פדרציית OIDC מבריחה לענן (ללא מפתחות שנמשכו זמן רב).
סודות: אחסון מרכזי, הגבלת הקשר, איסור על כריתת עצים.
חתימה של חפצים/מיכלים (cosign/Sigstore), אימות חתימה בבקרת כניסה.
SBOM (CyclonDX/SPDX) ו ־ SCA, SAST/DAST/Container Scan - ”שער חובה”.
פוליטיקאים: OPA/Confest for ICC/Empisos, ”אין חדש”, האוסר על מכולות חסויות.
בידוד רצים: רצים ברשת פרטית, גישה יוצאת נפרדת מהאינטרנט הציבורי.
4) GitHub פעולות - מבנה ומנהגים
4. 1 מבנה זורם עבודה
'Gatheub/workflows/.yml' -' em 'even (' על: לדחוף, 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
מפתחות:
- ”פרימות” הן מזעריות, 'id-token: write' מתאפשר OIDC.
- סביבות עם אישורים וכתובת, 'קונקורסי' מגן מפני מירוצים.
- הכללה קנרית של תנועה וחזרה אוטומטית על SLO.
4. 3 זרם עבודה שניתן להשתמש בו מחדש (קריאה לדוגמה)
yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high
5) GittLabe 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
מפתחות:
- 'Parallel. מטריקס 'מדמה אסיפות מטריצה.
- 'Artifacts' + דוחות בדיקה.
- סביבות עם ”on _ stop”, ידני ”כאשר: ידני” עבור אישורים.
- DIND לבניית תמונה (טוב יותר - Kaniko/StreeKit ברץ 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 ומבחנים מבוססי מסלול.
בניות מצטברות: לזהות חבילות/תרשימים מושפעים; מטמון על ידי מפתחות נתיב ונעילה קבצים.
צינורות דינמיים: צינורות ילדים/' workflow _ call' לרוץ רק עבור רכיבים משתנים.
Versioning: סמבר לכל מודול, changelog בשלב השחרור.
7) מטמון ותאוצה
כתובת תוכן מטמונים (HashFiles/lockfile).
מטמון נפרד לתלות וחפצים.
תמונות רצים טרום חמות (שרשרות כלים, SDK).
מראות חבילות מקומיות (npm/pip/maven) ומטמון רישום מכולות.
8) שחרור אסטרטגיות וחזרה
קנרית: בהדרגה גדל אחוז התנועה; עצירה אוטומטית במהלך השחתת SLO.
כחול-ירוק: ערימות מקבילות, החלפה מיידית.
צל: לשכפל בקשות מבלי להשפיע על הלקוח.
דגלי תכונה: להתגלגל ברמת דגל, לא לשחרר רמה.
רולבק: ברור תסריטים על כפתור אחד, גרסת החפץ מאוחסן metadata שחרור.
9) תשתיות וגיטופס
IC: Terraform/Ansible/Helm מנוהלים בשינויים נפרדים; מדיניות כקוד כשער.
GitOps-contour: Argo CD/Flux מתבונן refo עם מניפולציות של סביבות; הצינור יוצר רק חפץ ומעדכן גרסאות בגיט.
יתרונות: היסטוריה ברורה של שינויי סביבה, אידמפוטנטיות, גלגולים סטנדרטיים דרך Git.
10) יכולת תצפית של CI/CD
מדדי דורה: שיעור דלדול, זמן מהתחייבות לייצור, שיעור כישלון, MTTR.
טלמטריה: זמן תורים של עבודה, משך שלבים, קצב פגיעה של המטמון, תדירות של בדיקות רפרוף.
יומני אבטחה: מי יזם את השחרור, אילו שערים עברו, אילו חריגים הוצאו.
11) בקרת גישה ואישורים
הגנה על הסניף ובדיקות חובה.
אישור סביבה: רשימת אישורים נפרדת על במה/פרוד.
גישת JIT לצעדים ידניים, רישום הפעלה.
הפרדת חובות: תפקידים שונים ל ”כותב קוד”, ”מאשר”, ”משחרר”.
12) שגיאות תכופות (אנטי דפוסים)
מפתחות ענן ארוכי חיים בסודות ריפו במקום תפקידי OIDC.
אספת חפצים שונים לבמה ודרבן (הפרה של ”לבנות פעם אחת”).
התגים הכי ישנים ותמונות ניתנות לשינוי.
פרסום סודות ביומני שלב (מסווה לא נכים).
רץ ציבורי משותף לפריסת ייצור.
היעדר ”שערים” (SAST/SCA/Policy) ובדיקות שלאחר פריסה.
13) רשימת מימושים (0-60 יום)
0-15 ימים
הגדרת כללי יחסי ציבור, בדיקות סטטיות מחייבות.
אפשר פדרציית OIDC לענן; מינימום 'קישורים'.
רצי דואר: לציבור - למודיעים, פרטי - לדיסק.
16-30 ימים
הוסף SBOM, חתימת תמונה; אשכול - אימות חתימה.
הזן קנרית/כחול-ירוק; גלגול אוטומטי על ידי SLO.
מטמון של תלויות וחפצים, תמונות טרום חמות.
31-60 ימים
הרכבה ומשלוח נפרדים (GitOps), שער מדיניות-כקוד.
הקמת מדדי דורה והתראות להשפלת צינורות.
צינורות תבנית (replate/child) לכל השירותים.
14) עצות מהימנות מעשיות
תמיכה בקווי צינורות קטנים ומהירים (10-12 דקות לפני אות יחסי הציבור).
להרוג בדיקות מקושקשות: תגי הסגר + תיקון מקביל.
אין לערבב חפצי מודיע ולשחרר חפצים; חנות metadata (להתחייב, זמן, SBOM, חתימות).
תן למפתחים תסריטים מקומיים הזהים לצעדי צינור (dev-prod tests).
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 ו GittLab CI מספקים מנגנונים בוגרים עבור קוד מהיר ומאובטח. המפתח להצלחה הוא סטנדרטיזציה וביטחון: OIDC במקום מפתחות, חתימה ו-SBOM, שערי איכות, חפץ יחיד עם קידום, משלוח GitOps ויכולת תצפית דרך דורה. לבנות צינורות כמוצר: למדוד, לפשט, להאיץ - ולשחרר יהפוך למטלה, לא לאירוע.