# आज के ज़माने में GiBOGONONONONONONT

<!--category-- DevOps, CI/CD, GitHub Actions -->
<datetime class="hidden">2025-12-04T12:00</datetime>

**कोर सिद्धांत: तेजी से और दर्दरहित छोड़ दो, और आप और अधिक बार छोड़ देंगे.** जब गाड़ी चलाते वक्‍त बदलाव होते हैं, तो कई बार तो आप छोटे - छोटे बदलाव करते हैं ।

यह गाइड मैं उत्पादन में उपयोग की उपलब्ध योजनाओं को कवर करता है, सरल टैग- आधारित कर्मचारी वितरण के लिए। सभी उदाहरण वास्तविक से आते हैं। [Git क्रियाएँ](https://docs.github.com/en/actions) इस भंडार में काम करते हैं.

[TOC]

## ग्लैडियेटर की रेल - व्यवस्था

Voning विवरण में जोड़ने से पहले, यहाँ है कि कैसे आम नीतियाँ तुलना करते हैं:

[ पेज 11 पर तसवीर]
|----------|----------|------------|-----------|
| **टैग आधारित** WAV अनुप्रयोग, स्पष्ट रिलीज कम्‌स स्टार्टअप, सोलो devs, प्रौढ़ टीमों
| **शाखा आधारित** एमिलिंग रिपरेशन लॉशन कम प्रारंभ होता है, तेज-ग्रेसन टीम
| **GiFestivalVoiceName** सनकिम्पेड रिलीज, बहुत से संस्करण हेलीफाइड, पालन-clowns
| **ट्रक आधारित + विशेषता फ्लैग** [ चित्र का श्रेय]
| **मोनोरे- मल्टी- पैकेज** जन्नती लाइब्रेरी, कोड अतिसंपारकारी मध्यम प्लेटफॉर्म टीम, ओएसएस परियोजना

### कहाँ कार्य करता है

**प्रारंभ होता है व छोटा टीम**: टैग आधारित या शाखा आधारित तैनाती के साथ प्रारंभ करें. इसे हमेशा आसान रखें - आप सहज रूप से आगे जोड़ सकते हैं. सुविधा के साथ आधारित विकास लोकप्रिय है लेकिन छोटे टीमों के लिए gixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

**छोटे - छोटे रंग**: अकसर कम - से - कम कुल वातावरण में, एक - दूसरे को खुश करने के लिए ज़रूरी होता है कि एक - दूसरे को सहयोग दें और एक - दूसरे को सहयोग दें ।

**सोलो डेवलपर**: टैग आधारित मूल्य है. एक टैग दबाएँ, तैनाती हो जाता है. कोई समारोह, कोई खड़ा नहीं.

**प्लेटफॉर्म/ लाइब्रेरी टोली**: हर पैकेज के स्वतंत्र संस्करण के साथ एकलीकरण की ज़रूरत होती है ।

## टैग- बेस्ड बीजीय

सबसे आसान और सबसे भरोसेमंद रणनीति ।

### एनवायरनमेंट लक्ष्य

```yaml
on:
  push:
    tags:
      - 'release-*'  # Production
      - 'local-*'    # Dev environment
```

```yaml
- name: Build Docker image
  run: |
    TAG_NAME=${GITHUB_REF#refs/tags/}
    if [[ "$TAG_NAME" == local-* ]]; then
      docker build -t myapp:local .
    else
      docker build -t myapp:latest -t myapp:$(date +%s) .
    fi
```

**क्यों यह काम करता है**: एक सरल मानसिक मॉडल, स्पष्ट प्रदर्शन, समय के गुज़रते टैग के माध्यम से आसान रोलबैक।

```bash
# Deploy to production
git tag release-v2024.12.01 && git push origin release-v2024.12.01

# Deploy to dev
git tag local-feature-test && git push origin local-feature-test
```

### बहु- पैकेज संस्करण

एकलानेक पैकेजों के साथ एकलाने योग्य पैकेजों के लिए, टैग उपसर्ग का उपयोग करें जो कि पैकेज को रिहा करने के लिए:

```yaml
# Different workflows, different tag patterns
# umami-net.yml
on:
  push:
    tags: ['umamiv*.*.*']  # e.g., umamiv1.0.5

# fetchextension.yml
on:
  push:
    tags: ['fetchextension-v*.*.*']  # e.g., fetchextension-v1.2.0
```

संस्करण निकालें तथा इसे पूरे मे इस्तेमाल करें:

```yaml
- name: Extract version
  run: echo "VERSION=${GITHUB_REF#refs/tags/umamiv}" >> $GITHUB_OUTPUT

- name: Build & Pack
  run: |
    dotnet build -c Release -p:Version=${{ steps.version.outputs.VERSION }}
    dotnet pack -c Release -p:PackageVersion=${{ steps.version.outputs.VERSION }}
```

स्वचालित संस्करण के लिए, [न्यून.](https://github.com/adamralph/minver) Git टैगों में से संस्करणों की गणना करता है:

```xml
<PackageReference Include="MinVer" Version="6.0.0" PrivateAssets="all" />
<PropertyGroup>
  <MinVerTagPrefix>umamiv</MinVerTagPrefix>
</PropertyGroup>
```

## शाखा- बेस्ड dpropy

विशिष्ट शाखाओं में कोड देशों पर जब कोड छोटा हो तो स्वचालित रूप से उपलब्ध हों. स्टार्टअप तथा तेज- किलोमीटर की टीमों में सामान्य.

```yaml
on:
  push:
    branches: [main]      # → Production
    # branches: [develop] # → Staging
```

**छैतिज पैमाना**: कोई हस्तचालित कदम नहीं, सम्मिलित करने पर तैनात करता है
**कॉन्न्स**: दुर्घटनाकारी तैनाती संभव, कम सुस्पष्ट इतिहास

मैं एक Dudbe के पास - शाखा धक्का पर निर्माण का उपयोग करें (CII सत्यापन), लेकिन केवल टैग पर प्रकाशित:

```yaml
on:
  push:
    tags: ['scheduler-*']
    branches: [main, local]

jobs:
  build:
    # Always build
  publish:
    if: startsWith(github.ref, 'refs/tags/')  # Only publish on tags
```

## प्रहरीदुर्ग के साथ स्वतः अद्यतन करें

खुद की तैनाती के लिए, [प्रहरीदुर्ग](https://containrrr.dev/watchtower/) नई छवियों को स्वचालित खींच रहा है:

```yaml
services:
  app:
    image: myapp:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 300  # Check every 5 minutes
```

**न्यायिक प्रवाह**: दबाएँ टैग नीचेोक्‍त काम को बल देता है ।

## विशेषता गेट

अगर आप तैनात बग को तैनात करते हैं तो तेज तैनात करना बेकार है. हर काम का फूल में शामिल होना चाहिए:

```yaml
- name: Run tests
  run: dotnet test --configuration Release

- name: Build
  run: dotnet build --configuration Release

# Tests or build fail → workflow stops → no publish
```

बहु कार्य पैकेजों के लिए सभी लक्ष्य बिल्ड करें:

```yaml
- run: dotnet build -c Release --framework net8.0
- run: dotnet build -c Release --framework net9.0
```

## ओसीसी के साथ सुरक्षित प्रकाशक

आज के पास जाने के लिए कोई रहस्य नहीं है, कोई कुंजी नहीं जो छेद करने के लिए है:

```yaml
permissions:
  id-token: write
  contents: read

- uses: NuGet/login@v1
  with:
    user: 'myusername'

- run: dotnet nuget push *.nupkg --api-key ${{ steps.login.outputs.NUGET_API_KEY }}
```

GiHhb इसके ओएमसी चिह्न के लिए एक छोटे से एनू लेग कुंजी के लिए. Nue.org पर भरोसा करें यह सक्षम करने के लिए.

## सिनेइन्स सुरक्षा प्रदान करता है

[आर्टिकल टिप्पणी](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations) यह साबित करने के लिए कि आपके माल को सीआई में बनाया गया था, न कि उस में हेर - फेर किया गया ।

```yaml
permissions:
  id-token: write
  attestations: write

- uses: docker/build-push-action@v6
  id: push
  with:
    push: true
    tags: myapp:latest

- uses: actions/attest-build-provenance@v2
  with:
    subject-name: index.docker.io/myuser/myapp
    subject-digest: ${{ steps.push.outputs.digest }}
    push-to-registry: true
```

प्रमाण पत्र के साथ जांचता है: `gh attestation verify oci://index.docker.io/myuser/myapp:latest --owner myuser`

यह हासिल होता है [एसएलएसए स्तर २](https://slsa.dev/spec/v1.0/levels).. स्तर 3, उपयोग के लिए [रीus कार्य प्रवाहित होता है](https://docs.github.com/en/actions/sharing-automations/reusing-workflows).

## पूर्वावलोकन वातावरण

सम्मिलित करने से पहले टीमों को स्तम्भों की आवश्यकता होती है.

**छोटे - छोटे रास्ते** - शाखा आधारित पूर्वावलोकन वातावरण:

```yaml
on:
  pull_request:
    types: [opened, synchronize]

- run: |
    BRANCH=$(echo ${{ github.head_ref }} | sed 's/[^a-zA-Z0-9]/-/g')
    docker build -t myapp:preview-$BRANCH .
    # Deploy to k8s namespace, cloud platform, etc.
```

**आरंभ/सोलो पास** - Tann अपने स्थानीय मशीन:

```bash
# Cloudflare Tunnel (free)
cloudflared tunnel run --url http://localhost:5000 my-preview
# → https://my-preview.cfargotunnel.com
```

या प्रयोग [तारी](https://www.wireguard.com/) आंतरिक टीम के लिए WPN आपके dev मशीन में पहुँच.

## व्यावहारिक सुझाव

**टैग साफ- सफाई**: Git टैग हमेशा के आसपास रहना.

```bash
git tag -d old-test-tag                      # Delete local
git push origin :refs/tags/old-test-tag      # Delete remote
```

**अधिवेशनों का नाम**: अटल रहिए ।

- `release-YYYY.MM.DD` उत्पादन के लिए
- `local-feature-name` लेखक के लिए
- `packagev1.2.3` लाइब्रेरी के लिए

**गुप्त**: में भंडारित करें [GiHest गुप्त](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions)कोड में कभी नहीं. आवश्यक रहस्य विशेष:

- `DOCKER_HUB_ACCESS_TOKEN`
- `NUGET_API_KEY` (या आईपीएससी इस्तेमाल करें)
- `NPM_TOKEN`

**मोनो- धातु विकास**: विकास के दौरान परियोजना संदर्भों का प्रयोग करें, तैनात सत्यापन के लिए पैकेज संदर्भों के संदर्भों को स्विच करें:

```xml
<ProjectReference Include="..\MyLib\MyLib.csproj" />
<!-- <PackageReference Include="MyLib" Version="1.0.0" /> -->
```

## % 1 कि. बा.

एक ही सिद्धांत, विविध औज़ार:

डॉक डॉकर लिखा कुबर्स
|----------------|------------|
इससे मुझे बहुत मदद मिली । ” [आरगोसीडी](https://argo-cd.readthedocs.io/) / [फ्लक्स](https://fluxcd.io/docs/) |
offpler- क़िस्म.yml वातावरण नेबुर्ग
समाहित अंशों को पुनः प्रारंभ करें
घड़ो मैनुअल रोलबैक GiMO रोलबैक

## सारांश

1. **सरल प्रारंभ करें**: टैग आधारित तैनातिंग ज़्यादातर आवश्यकताओं को ढकता है
2. **जब ज़रूरत हो तो जटिलता जोड़ें**: शाखा आधारित, बहु- अधिष्ठापन, लेखक
3. **गुण फाटकों को स्वचालित करें (t)**प्रकाशित करने से पहले परीक्षण को पास करना होगा
4. **रोलबैक सक्षम करें**: समयबद्ध टैग या GiBS इतिहास
5. **अपने तने को सुरक्षित रखें**: रहस्य के लिए, साबित करने के लिए सबूत
6. **अपने संदर्भ का मिलान करें**: सोलो डेव सीएस प्रारंभ

इस भंडार - जाँच में कार्य फ्लो यहाँ दिखाया गया है `.github/workflows/` पूर्ण कार्यान्वयन के लिए.

**याद रखें**: बिजली, भरोसेमंद तैनातियों के विकास की बुनियाद होती है ।