CI/CD पाइपलाइनें: GitHub एक्शन, GitLab CI
CI/CD पाइपलाइनें: GitHub एक्शन, GitLab CI
1) सीआई/सीडी टास्क और प्लेटफ़ॉर्म स्पेस
सीआई/सीडी भंडार से उत्पादन वातावरण में परिवर्तन की निरंतर विधानसभा, परीक्षण और वितरण है। उद्देश्य:- रिलीज की गति और पूर्वानुमेयता (कम सीसा समय)।
- गुणवत्ता (ऑटो परीक्षण, स्थिर/गतिशील विश्लेषण)।
- आपूर्ति श्रृंखला सुरक्षा (कलाकृति हस्ताक्षर, अभिगम नियंत्
- विश्वसनीयता (कैनरी जमा, तेजी से रोलबैक)।
- अवलोकन (प्रत्येक चरण में ट्रेस और मैट्रिक्स)।
प्रमुख सिद्धांत: "पाइपलाइन के रूप में कोड," अपरिवर्तनीय कलाकृतियां ", एक बार निर्माण - कई चलाएं", "शिफ्ट-लेफ्ट सिक्योरिटी", "बाएं विशेषाधिकार", नियतात्मक विधानसभाएं।
2) कन्वेयर के वास्तुशिल्प पैटर्न
स्टेज-गेट: बिल्ड टेस्ट सिक्योरिटी पैकेज पोस्ट-डिस्प्लॉय चेक तैनात करें।
फैन-आउट/फैन-इन: परिणामों के साथ समानांतर मैट्रिक्स असेंबली (भाषाएं/प्लेटफॉर्म)।
पदोन्नति: एक ही कलाकृति को पर्यावरण (dev → stage → prod) के माध्यम से बढ़ावा दिया जाता है, और फिर से इकट्ठा नहीं किया जाता है।
ट्रंक-आधारित + लघु शाखाएँ: बहाव न्यूनतम, पीआर/एमआर पर स्वचालित जांच
पुन: प्रयोज्य कार्यप्रवाह GitLab: शामिल/बाल-पाइपलाइन)।
GitOps (वैकल्पिक): "असेंबली" और "डिलीवरी" (Argo CD/Flux मॉनिटर डिक्लेरेटिव रिपो वातावरण) का पृथक्करण।
3) आपूर्ति श्रृंखला सुरक्षा
पहचान: धावक से बादल तक ओआईडीसी महासंघ (लंबे समय तक जीवित रहने वाली कुंजी के बिना)।
रहस्य: केंद्रीकृत भंडारण, संदर्भ प्रतिबंध, लॉगिंग पर निषेध।
कलाकृतियों/कंटेनरों (cosign/Sigstore) पर हस्ताक्षर, प्रवेश नियंत्रण में हस्ताक्षर का सत्यापन।
SBOM (CycloneDX/SPDX) और SCA, SAST/DAST/कंटेनर स्कैन - "अनिवार्य गेट"।
राजनेता: IaC/घोषणापत्र के लिए OPA/कन्फेस्टेस्ट, "कोई नवीनतम नहीं", विशेषाधिकार प्राप्त कंटेनरों पर प्रतिबंध लगाना।
धावकों का अलगाव: एक निजी नेटवर्क में प्रोड-रनर, सार्वजनिक इंटरनेट से अलग आउटगोइंग एक्सेस।
4) GitHub क्रियाएँ - संरचना और व्यवहार
4. 1 कार्यप्रवाह संरचना
'.github/workflows/.yml' - ('ऑन: पुश, , शेड्यूल, ।
मानकीकरण के लिए पुन: प्रयोज्य वर्कफ़्लो (लिंटर, एससीए, कंटेनर असेंबली, परिनियोजन)।
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
कुंजियाँ:
- 'permission' को कम से कम किया जाता है, 'आईडी-टोकन: राइट' OIDC के लिए सक्षम है।
- अनुमोदन और यूआरएल के साथ वातावरण, 'संगामिति' रेसिंग से बचाता है।
- एसएलओ पर यातायात और स्वचालित रोलबैक का कैनरी समावेश।
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
कुंजियाँ:
- 'पर्लेल। मैट्रिक्स 'मैट्रिक्स असेंबली का अनुकरण करता है।
- 'कलाकृतियों' + परीक्षण रिपोर्ट।
- अनुमोदन के लिए 'ऑन _ स्टॉप', मैनुअल 'कब: मैनुअल' के साथ वातावरण।
- एक छवि बनाने के लिए DIND (बेहतर - 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 और पथ द्वारा स्कोप किए गए परीक्षण।
वृद्धिशील बिल्ड: प्रभावित पैकेजों/चार्ट की पहचान; पथ कुंजी और लॉक फ़ाइलों द्वारा कैश।
गतिशील पाइपलाइन: चाइल्ड-पाइपलाइन/' वर्कफ़्लो _ कॉल 'केवल बदले हुए घटकों के लिए चलते हैं।
वर्शनिंग: प्रत्येक मॉड्यूल के लिए सेवर, रिलीज स्टेज पर चेंजलॉग।
7) कैचिंग और त्वरण
सामग्री पता कैश (हैशफ़ाइल/लॉकफ़ाइल)।
निर्भरता और कलाकृतियों के लिए अलग कैश।
प्री-वार्म रनर इमेज (टूलचेन, एसडीके)।
स्थानीय पैकेट दर्पण (npm/pip/maven) और कंटेनर रजिस्ट्री कैश।
8) रिलीज रणनीति और रोलबैक
कैनरी: धीरे-धीरे यातायात का प्रतिशत बढ़ रहा है; एसएलओ गिरावट के दौरान ऑटो-स्टॉप।
ब्लू-ग्रीन: समानांतर स्टैक, तत्काल स्विचिंग।
छाया: ग्राहक को प्रभावित किए बिना डुप्लिकेट अनुरोध।
फ्लैग्स: फ्लैग स्तर पर रोलआउट, रिलीज स्तर नहीं।
रोलबैक: स्पष्ट एक-बटन स्क्रिप्ट, कलाकृति संस्करण रिलीज मेटाडेटा में संग्रहीत है।
9) बुनियादी ढांचा और GitOps
IaC: Terraform/Ansible/Helm को अलग-अलग रेपो में प्रबंधित किया जाता है; गेट के रूप में नीति-के-कोड।
GitOps-contour: Argo CD/Flux वातावरण के घोषणापत्र के साथ रेपो का निरीक्षण करते हैं; पाइपलाइन केवल एक कलाकृति बनाती है और गिट में संस्करण अपडेट करती है।
फायदे: गिट के माध्यम से पर्यावरण परिवर्तन, पहचान, मानक रोलबैक का स्पष्ट इतिहास।
10) सीआई/सीडी की अवलोकन क्षमता
DORA मैट्रिक्स: कमी दर, उत्पादन से उत्पादन तक का समय, विफलता दर, MTTR।
टेलीमेट्री: नौकरी की कतारों का समय, चरणों की अवधि, कैश की हिट-दर, परतदार परीक्षणों की आवृत्ति।
सुरक्षा लॉग: किसने रिलीज की शुरुआत की, कौन से द्वार पारित किए गए थे, जो अपवाद जारी किए गए थे।
11) पहुंच नियंत्रण और अनुमोदन
शाखा सुरक्षा और अनिवार्य जांच।
पर्यावरण-अनुमोदन: स्टेज/प्रोड पर अलग-अलग अनुमोदन सूची।
मैनुअल चरणों, सत्र लॉगिंग के लिए JIT पहुँच।
कर्तव्यों का पृथक्करण: "लिखते हैं कोड", "अनुमोदन", "रिलीज" के लिए विभिन्न भूमिकाएं।
12) बार-बार त्रुटियां (विरोधी पैटर्न)
OIDC भूमिकाओं के बजाय रेपो रहस्यों में लंबे समय तक रहने वाली क्लाउड कुंजी।
मंच और प्रोड के लिए विभिन्न कलाकृतियों को इकट्ठा करना ("एक बार निर्माण" का उल्लंघन)।
'लेटेस्ट' टैग और म्यूटेबल इमेजेज।
चरण लॉग में रहस्य प्रकाशित कर रहा है (गैर-अक्षम मास्किंग)।
उत्पादन तैनाती के लिए एक आम सार्वजनिक-धावक।
सुरक्षा "द्वार" (SAST/SCA/नीति) की कमी और पोस्ट-तैनाती की जाँच।
13) कार्यान्वयन चेकलिस्ट (0-60 दिन)
0-15 दिन
ट्रंक-आधारित, पीआर/एमआर नियम, अनिवार्य स्थिर जांच कॉन्फ़िगर करें।
क्लाउड में OIDC फेडरेशन सक्षम करें; न्यूनतम 'दोष'।
पोस्ट रनर: सार्वजनिक - सीआई के लिए, निजी - सीडी के लिए।
16-30 दिन
SBOM, छवि हस्ताक्षर जोड़ें; क्लस्टर - हस्ताक्षर सत्यापन।
कैनरी/ब्लू-ग्रीन दर्ज करें; एसएलओ द्वारा ऑटो-रोलबैक।
निर्भरता और कलाकृतियों का कैश, पूर्व-गर्म चित्र।
31-60 दिन
अलग असेंबली और डिलीवरी (GitOps), पॉलिसी-ए-कोड गेट।
पाइपलाइनों के क्षरण के लिए DORA मैट्रिक्स और अलर्ट स्थापित करें।
सभी सेवाओं के लिए साँचा पाइपलाइन (पुन: प्रयोज्य/बच्चा)।
14) व्यावहारिक विश्वसनीयता युक्तियाँ
छोटी, तेज पाइपलाइनों का समर्थन करें (पीआर सिग्नल से 10-12 मिनट पहले)।
परतदार परीक्षण मारें: संगरोध टैग + समानांतर फिक्स।
सीआई कलाकृतियों को मिलाएं और कलाकृतियों को जारी न करें; स्टोर मेटाडेटा (प्रतिबद्ध, समय, एसबीओएम, हस्ताक्षर)।
डेवलपर्स स्थानीय स्क्रिप्ट पाइपलाइन चरणों के समान दें (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 क्रियाएं और GitLab CI एक तेज और सुरक्षित कोड प्रोड लूप के लिए परिपक्व तंत्र प्रदान करते हैं। सफलता की कुंजी मानकीकरण और सुरक्षा है: चाबियों, हस्ताक्षर और SBOM के बजाय OIDC, गुणवत्ता द्वार, पदोन्नति के साथ एक एकल कलाकृति, GitOps वितरण और DORA के माध्यम से अवलोकन। एक उत्पाद के रूप में पाइपलाइनों का निर्माण: माप, सरल, गति बढ़ाएं - और रिलीज एक कोर बन जाएगा, एक घटना नहीं।