This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
जीटहब कार्यों के साथ आधुनिक प्रकाशन रणनीति
Thursday, 04 December 2025
बुनियादी सिद्धांत यह एकgile विकास के लिए महत्वपूर्ण है।
यह गाइड मैं उत्पादन में प्रयोग करता हूँ जारी करने की रणनीतियों को शामिल करता है। GitHub क्रियाएँ इस रिपोजिटरी में कार्यप्रवाह
एक नज़र में जारी करने की रणनीति
विस्तृत विवरण में डुबोने से पहले
| रणनीति | सबसे अच्छा | जटिलता के लिए | |||||||
|---|---|---|---|---|---|---|---|---|---|
| टैग-आधारित अनुप्रयोग | |||||||||
| शाखा निरंतर तैनाती | कम | स्टार्टअप | , | तेजी से | |||||
| जीटफ्लो | विनियमित जारीियां, बहुविध संस्करणों | उच्च | उद्यम | МSK4 | अनुपालन | ||||
| ट्रंक-आधारित + विशेषता झण्डा उच्च-velocity टीमें | Medium | Big tech,mature startups | |||||||
| मोनोरेपो बहु-- पैकेज | पुस्तकालयों, साझा कोडबेस | मध्यम | प्लेटफार्म टीमें |
कहाँ क्या काम करता है
स्टार्टअप & लघु टीम: टैग के साथ आरंभ करें।
उद्यमअनुपालन के लिए प्रायः GitFlow या इसी प्रकार की आवश्यकता होती है।
एकल विकासकर्ता: टैग-आधारित आदर्श है।
प्लेटफॉर्म/लाइब्रेरी टीमप्रति पैकेज में स्वतंत्र संस्करणिंग के साथ एकल रेपो रणनीति की आवश्यकता है
टैग-आधारित तैनाती
सरलतम और सबसे विश्वसनीय रणनीति
पर्यावरण लक्ष्य
on:
push:
tags:
- 'release-*' # Production
- 'local-*' # Dev environment
- 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
यह क्यों काम करता हैसरल मानसिक मॉडल
# 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
बहु-- पैकेज संस्करण
कई प्रकाशन योग्य पैकेजों के साथ मोनोरीपोज़ के लिए
# 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
संस्करण को निकालें और इसे पूरे में उपयोग करें:
- 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 }}
स्वचालित संस्करणिंग के लिए मिनर जीट टैग से संस्करण गणना करता है
<PackageReference Include="MinVer" Version="6.0.0" PrivateAssets="all" />
<PropertyGroup>
<MinVerTagPrefix>umamiv</MinVerTagPrefix>
</PropertyGroup>
शाखा-आधारित तैनाती
जब कोड विशिष्ट शाखाओं पर उतरता है तो स्वचालित रूप से लागू करें
on:
push:
branches: [main] # → Production
# branches: [develop] # → Staging
प्रॉस: कोई म्यानुअल चरण नहीं त्रुटि: अनियमित विनियोजन संभव है, कम स्पष्ट इतिहास
मैं एक हाइब्रिड दृष्टिकोण का उपयोग करता हूँ - शाखा धकेलने पर बनाता है | ( | आईसी सत्यापन |), | लेकिन सिर्फ टैगों पर प्रकाशित करें |
on:
push:
tags: ['scheduler-*']
branches: [main, local]
jobs:
build:
# Always build
publish:
if: startsWith(github.ref, 'refs/tags/') # Only publish on tags
Watchtower के साथ स्वचालित अद्यतन
स्वचालित विनियोजनों के लिए वॉचटोवर स्वचालित रूप से नई छवियाँ निकालता है
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
विनियोजन प्रवाह: पुश टैग | → | GitHub कार्य निर्माण करता है |→ | रजिस्ट्री में पुश करता है
गुणवत्ता द्वार
सभी कार्यप्रवाह में गेट शामिल होना चाहिए
- name: Run tests
run: dotnet test --configuration Release
- name: Build
run: dotnet build --configuration Release
# Tests or build fail → workflow stops → no publish
बहुआयामी के लिए-फ्रेमवर्क पैकेजों के लिए
- run: dotnet build -c Release --framework net8.0
- run: dotnet build -c Release --framework net9.0
ओआईडीसी के साथ पासवर्डहीन प्रकाशन
आधुनिक दृष्टिकोण - घुमाने के लिए कोई रहस्य नहीं
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 }}
GitHub अपने OIDC टोकन को एक छोटा '-' जीवित NuGet API कुंजी के लिए बांटता है
आपूर्ति श्रृंखला सुरक्षा
पुरातत्व प्रमाणन प्रमाणित करें कि आपके वास्तु CI में निर्मित हैं
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
यह प्राप्त करता है SLSA स्तर 2स्तर के लिए . उपयोग पुनः उपयोग योग्य कार्यप्रवाह.
पूर्वावलोकन वातावरण
समूहों को विलयन से पहले परिवर्तनों की पूर्वावलोकन करने के लिए भागीदारों की आवश्यकता है
उद्यम दृष्टिकोण शाखा
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.
स्टार्टअप - अपने स्थानीय मशीन का सुरंगन करें
# Cloudflare Tunnel (free)
cloudflared tunnel run --url http://localhost:5000 my-preview
# → https://my-preview.cfargotunnel.com
या उपयोग करें ताररक्षक अपने dev मशीन में आंतरिक टीम पहुँच के लिए VPN.
व्यावहारिक सुझाव
टैग साफ करेंगिट टैग हमेशा के लिए चिपका रहता है
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पुस्तकालयों के लिए
ठ̧à¥à¤: Store in GitHub SecretsCommentकोड में कभी नहीं
DOCKER_HUB_ACCESS_TOKENNUGET_API_KEY( या OIDC का उपयोग करेंNPM_TOKEN
मोनोरेपो विकासविकास के दौरान परियोजना संदर्भ का उपयोग करें
<ProjectReference Include="..\MyLib\MyLib.csproj" />
<!-- <PackageReference Include="MyLib" Version="1.0.0" /> -->
Kubernetes में जा रहा है
समान सिद्धांत
डोकर कम्पोज़ करें |----------------|------------| वॉचटोवर आरगोसीडी / फ्लक्स | डॉकर | कंटेनर पुनः आरंभ करने के लिए मैनुअल रोलरबैक
सारांश
- सरल प्रारंभ करें: टैग-आधारित तैनाती अधिकांश आवश्यकताओं को पूरा करती है
- आवश्यकता पड़ने पर जटिलता जोड़ें: शाखा
- स्वचालित गुणवत्ता द्वार: प्रकाशन से पहले परीक्षाएं पास होनी चाहिए
- रोलबैक सक्षम करें: Timestamped टैग या GitOps इतिहास
- अपने पाइपलाइन को सुरक्षित करें: गोपनीयता के लिए OIDC
- अपने संदर्भ को मिलाएँSolo dev
यहाँ दिखाया गया कार्यप्रवाह इस रिपोजिटरी में चलता है - जाँच .github/workflows/ पूर्ण कार्यान्वयन के लिए
याद रखें: त्वरित