रिलीज़-चक्र रनबुक
स्थानीय गेट से लेकर हस्ताक्षरित GitHub Release और वैकल्पिक npm प्रकाशन डिस्पैच तक का संपूर्ण रिलीज़ वर्कफ़्लो।
यह रनबुक apothem के vX.Y.Z रिलीज़ को एक स्वच्छ working tree से
सत्यापित वितरण सतहों तक चलाता है। यह प्रक्रिया उस अनुरक्षक के लिए लिखी गई
है जो gh, git, और रिलीज़-टियर शेल का उपयोग करता है; यह एक सत्यापित
Release पेज, एक भरे हुए CHANGELOG, और एक इंस्टॉल-पथ स्मोक के साथ समाप्त
होती है जो पुष्टि करता है कि प्रत्येक उपयोगकर्ता-सामना करने वाली सतह
कैनोनिकल इंस्टॉल कमांड का उत्तर देती है।
रिलीज़ का आकार एकल-टैग, दो-चरण है। main पर एक हस्ताक्षरित रिलीज़ टैग
.github/workflows/release.yml को ट्रिगर करता है, जो अपने पूर्ण आर्टिफ़ैक्ट
सेट के साथ GitHub Release को बनाता, हस्ताक्षरित करता, अटेस्ट करता, और
प्रकाशित करता है — sdist, wheel, CycloneDX SBOM, Sigstore cosign बंडल,
SLSA-3 प्रोवेनेंस, और प्लेटफ़ॉर्म रनटाइम आर्काइव। वैकल्पिक दूसरा चरण
publish-npm.yml का एक मैन्युअल डिस्पैच है, जो
scripts/release/check-release-ready.sh के हरा होने के बाद
@ahmed-g-gad/apothem को npmjs.com पर प्रकाशित करता है। संस्करण-युक्त
CHANGELOG अनुभाग टैग कमिट के साथ लिखा जाता है; ऑपरेटर दोनों चरणों के उतरने
के बाद इंस्टॉल-पथ स्मोक चलाता है।
1. पूर्वापेक्षाएँ
अनुरक्षक टैगिंग से पहले निम्नलिखित की पुष्टि करता है:
-
Working tree. स्वच्छ (
git statusकुछ भी लंबित नहीं दिखाता)। रिलीज़ के लिए सभी फ़ीचर कार्यmainपर है। -
CI हरा। नवीनतम
maingh run list --branch=main --limit=1 --json conclusion --jq '.[0].conclusion'successलौटाता है। -
उपकरण।
gh(GitHub CLI) संस्करण 2.40 या नवीनतर,ahmed-g-gadके विरुद्ध प्रमाणित;git2.40 या नवीनतर जिसमें GPG हस्ताक्षर सबकी लोड हो;@ahmed-g-gad/apothemके लिए npm विश्वसनीय-प्रकाशक बंधन सक्रिय है (प्रकाशक-खाता-सेटअप रनबुक के अनुसार सत्यापित)। -
संस्करण एंकर संरेखित।
pyproject.tomlपर घोषित संस्करण स्ट्रिंगvउपसर्ग के बिना नियोजित टैग से मेल खाती है। सत्यापित करें:grep '^version' pyproject.tomlअपेक्षित आउटपुट (
vX.Y.Zरिलीज़ के लिए; प्लेसहोल्डर इन-फ़्लाइट रिलीज़ टैग का प्रतिनिधित्व करते हैं):version = "X.Y.Z" -
CHANGELOG अनुभाग तैयार।
CHANGELOG.mdमें Keep-a-Changelog हेडिंग के अंतर्गत एक संस्करण-युक्त अनुभाग है। अनुरक्षक उसी कमिट में दिनांक और रिलीज़ बुलेट को अपडेट करता है जो टैग को उतारता है।
2. टैग और ट्रिगर
2.1 रिलीज़ कमिट लिखें
रिलीज़ कमिट दो परिवर्तन उतारता है:
- रिलीज़ की वास्तविक UTC दिनांक के साथ दिनांकित
CHANGELOG.mdसंस्करण अनुभाग। pyproject.tomlसंस्करण नए संस्करण में उठाया गया (केवल तब जबmainपर पूर्व कमिट पहले से पिछले-संस्करण पिन को धारण करता है और एक ताज़ा वृद्धि आवश्यक है; कमिट टैग समय से कुछ दिन पहले संस्करण-वृद्धि चक्र के दौरान भी उतर सकता है)।
उदाहरण कमिट:
git checkout main
git pull --ff-only origin main
# Author CHANGELOG and pyproject.toml edits via Edit tool, then:
git add CHANGELOG.md pyproject.toml
git commit -S -m "chore(release): cut vX.Y.Z"
git push origin main-S फ़्लैग कमिट को GPG कुंजी से हस्ताक्षरित करता है। पुश मानक CI मैट्रिक्स
(lint, test, build) को ट्रिगर करता है; टैगिंग से पहले हरे की प्रतीक्षा करें।
2.2 टैग पर हस्ताक्षर करें और पुश करें
git tag -a -s vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z-a -s संयोजन एक एनोटेटेड, GPG-हस्ताक्षरित टैग बनाता है। पुश
.github/workflows/release.yml को ट्रिगर करता है, जो बनाता, हस्ताक्षरित
करता, अटेस्ट करता, और प्रकाशित करता है।
2.3 पुष्टि करें कि रिलीज़ वर्कफ़्लो पूर्ण हुआ
gh run watch $(gh run list --workflow=release.yml --limit=1 --json databaseId --jq '.[0].databaseId')वर्कफ़्लो बिल्ड (sdist + wheel), SBOM जनरेशन (CycloneDX),
कीलेस cosign हस्ताक्षरण, SLSA-3 प्रोवेनेंस जनरेशन और सत्यापन, प्लेटफ़ॉर्म
आर्काइव बिल्ड (darwin / linux / windows), एक समेकित SHA256SUMS मैनिफ़ेस्ट
के साथ आर्काइव हस्ताक्षरण, और अंतिम GitHub Release प्रकाशन चलाता है।
अनुरक्षक एसेट-अपलोड पुष्टियों के लिए publish GitHub Release जॉब लॉग को
स्कैन करता है।
2.4 npm प्रकाशन डिस्पैच करें (वैकल्पिक चरण)
GitHub Release और तैयारी गेट के हरा होने के बाद:
bash scripts/release/check-release-ready.sh vX.Y.Z
gh workflow run publish-npm.yml --field tag=vX.Y.Zसंकेत मिलने पर npmjs एनवायरनमेंट डिप्लॉयमेंट को स्वीकृत करें। वर्कफ़्लो
npm Trusted Publishing (OIDC) के माध्यम से @ahmed-g-gad/[email protected] को
npmjs.com पर प्रकाशित करता है; रिपॉज़िटरी में कोई रजिस्ट्री टोकन संग्रहीत
नहीं है।
3. वितरण सतहें
प्रत्येक सतह के पास एक सत्यापन कमांड है जो "क्या रिलीज़ यहाँ उतरा?" का उत्तर देता है:
| # | सतह | आर्टिफ़ैक्ट | सत्यापन |
|---|---|---|---|
| 1 | GitHub Release (Python वितरण) | apothem-X.Y.Z.tar.gz (sdist) + apothem-X.Y.Z-py3-none-any.whl | gh release view vX.Y.Z --json assets --jq '.assets[].name' में दोनों फ़ाइलनाम शामिल हैं |
| 2 | GitHub Release (SBOM) | sbom.cdx.json | पंक्ति 1 के समान; एसेट सूची में CycloneDX SBOM शामिल है |
| 3 | GitHub Release (हस्ताक्षर) | प्रति dist आर्टिफ़ैक्ट *.cosign.bundle; प्रति आर्काइव *.sig; SHA256SUMS + SHA256SUMS.sig | cosign verify-blob --bundle <artifact>.cosign.bundle <artifact> 0 के साथ बाहर निकलता है (वर्कफ़्लो पहचान फ़्लैग के साथ) |
| 4 | GitHub Release (प्रोवेनेंस) | provenance.intoto.jsonl | bash scripts/release/verify-provenance.sh vX.Y.Z 0 के साथ बाहर निकलता है |
| 5 | GitHub Release (प्लेटफ़ॉर्म आर्काइव) | apothem-vX.Y.Z-darwin.tar.gz, apothem-vX.Y.Z-linux.tar.gz, apothem-vX.Y.Z-windows.zip | एसेट सूची में प्रत्येक आर्काइव और SHA256SUMS शामिल हैं |
| 6 | npmjs.com | @ahmed-g-gad/[email protected] | npm view @ahmed-g-gad/apothem version X.Y.Z लौटाता है; npx @ahmed-g-gad/[email protected] --version apothem X.Y.Z प्रिंट करता है |
| 7 | Pages (स्क्रिप्ट इंस्टॉलर) | दस्तावेज़ साइट पर install.sh / install.ps1 | curl -fsSL https://apothem.ahmedgad.com/install.sh | head -n 1 स्क्रिप्ट हेडर लौटाता है |
GitHub Release कैनोनिकल आर्टिफ़ैक्ट सतह है; npm पैकेज और स्क्रिप्ट इंस्टॉलर उसके ऊपर परत किए गए इंस्टॉल पथ हैं। npm प्रकाशन जानबूझकर अंतिम चरण है।
4. CHANGELOG अनुशासन
CHANGELOG.md Keep-a-Changelog परंपरा के अंतर्गत प्रति रिलीज़ एक अनुभाग
रखता है। रिलीज़ कमिट का CHANGELOG संपादन:
- पुष्टि करता है कि संस्करण अनुभाग
## [X.Y.Z] — YYYY-MM-DDहेडिंग का उपयोग करता है। - पुष्टि करता है कि मानक हेडिंग — Added, Changed, Deprecated, Removed, Fixed, Security — जहाँ लागू हो वहाँ उपयोग की जाती हैं। खाली हेडिंग रेंडर की गई फ़ाइल से हटा दी जाती हैं।
- क्षमताओं को कैप्चर करता है, कार्यान्वयन को नहीं। केवल डोमेन भाषा; कोई योजना-आंतरिक संदर्भ नहीं; कोई कमिट हैश नहीं; कोई योजना या फ़ेज़ पहचानकर्ता नहीं।
एक CHANGELOG अनुभाग जो अनुरक्षक की समीक्षा से बच गया, घोषणा कथन के लिए रिलीज़-नोट्स एंकर के रूप में पढ़ा जाता है।
5. इंस्टॉल-पथ स्मोक
दोनों चरण पूर्ण होने के बाद, अनुरक्षक स्मोक चलाता है। स्मोक वह कैनोनिकल सत्यापन है कि उपयोगकर्ता-सामना करने वाले इंस्टॉल कमांड उत्तर देते हैं।
5.1 Claude Code प्लगइन
/plugin marketplace add ahmed-g-gad/apothem
/plugin install apothem@apothemअपेक्षित: प्लगइन इंस्टॉल होता है और apothem कमांड Claude Code के भीतर
उपलब्ध हैं।
5.2 Node.js (npx)
npx @ahmed-g-gad/[email protected] --versionअपेक्षित आउटपुट: apothem X.Y.Z।
5.3 एक-शॉट स्क्रिप्ट इंस्टॉलर (POSIX)
curl -fsSL https://apothem.ahmedgad.com/install.sh | sh
apothem --versionअपेक्षित आउटपुट: apothem X.Y.Z।
5.4 एक-शॉट स्क्रिप्ट इंस्टॉलर (Windows)
irm https://apothem.ahmedgad.com/install.ps1 | iex
apothem --versionअपेक्षित आउटपुट: apothem X.Y.Z।
5.5 आर्टिफ़ैक्ट सत्यापन (आपूर्ति-श्रृंखला साक्ष्य)
gh release download vX.Y.Z --pattern 'apothem-X.Y.Z*' --pattern '*.cosign.bundle'
cosign verify-blob \
--bundle apothem-X.Y.Z-py3-none-any.whl.cosign.bundle \
--certificate-identity-regexp 'github.com/ahmed-g-gad/apothem' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
apothem-X.Y.Z-py3-none-any.whl
bash scripts/release/verify-provenance.sh vX.Y.Zअपेक्षित: दोनों सत्यापन 0 के साथ बाहर निकलते हैं।
स्मोक प्रति सतह एक PASS / FAIL पंक्ति उत्पन्न करता है; पंक्तियों को अनुरक्षक के रिलीज़ लॉग में रिकॉर्ड करें।
6. विफलता पुनर्प्राप्ति
रिलीज़ वर्कफ़्लो में रिलीज़ इंजन और npm प्रकाशक के लिए प्रलेखित विफलता मोड हैं:
| विफलता | निदान | पुनर्प्राप्ति |
|---|---|---|
| टैग पुश अस्वीकृत (हस्ताक्षर विफलता) | git push origin vX.Y.Z एक GPG-संबंधित संदेश के साथ error: failed to push some refs लौटाता है | सत्यापित करें कि GPG सबकी लोड है (gpg --list-secret-keys --keyid-format=long); कीरिंग ठीक करने के बाद -s के साथ स्थानीय रूप से पुनः-टैग करें; पुनः-पुश करें |
release.yml जॉब एक ही चरण पर विफल | gh run view <run-id> --log विफल जॉब (build / sbom / sign / provenance / archive / publish) का नाम बताता है | केवल विफल जॉब को gh run rerun <run-id> --failed के माध्यम से पुनः चलाएँ; यदि विफलता दोहराई जाती है, पुनः-टैगिंग से पहले जॉब के इनपुट को उसके स्रोत पर ठीक करें |
| SLSA प्रोवेनेंस सत्यापन विफल | verify SLSA provenance artifact जॉब गैर-शून्य के साथ बाहर निकलता है | सब्जेक्ट-डाइजेस्ट बेमेल के लिए प्रोवेनेंस आर्टिफ़ैक्ट का निरीक्षण करें; उसी टैग से पुनर्निर्माण करें — प्रोवेनेंस सटीक आर्टिफ़ैक्ट डाइजेस्ट से बंधा होता है, इसलिए किसी भी आर्टिफ़ैक्ट पुनर्जनन के लिए पूर्ण वर्कफ़्लो रीरन आवश्यक है |
| npmjs.com प्रकाशन अस्वीकृत | npm जॉब npm publish के दौरान गैर-शून्य के साथ बाहर निकलता है; PUT के दौरान एक रजिस्ट्री 404 एक प्राधिकरण / विश्वसनीय-प्रकाशक बेमेल है, इस बात का प्रमाण नहीं कि पैकेज कोड गायब है | सत्यापित करें कि @ahmed-g-gad/apothem के लिए npm Trusted Publishing स्वामी ahmed-g-gad, रिपॉज़िटरी apothem, वर्कफ़्लो publish-npm.yml, और अनुमत क्रिया npm publish का नाम बताता है; पुष्टि करें कि जॉब वर्कफ़्लो में पिन किए गए Node संस्करण और npm CLI OIDC फ़्लोर के साथ चलता है |
| टैग दिखाई देता है पर एसेट गायब | gh release view vX.Y.Z एक स्टब रिलीज़ लौटाता है | रिलीज़ वर्कफ़्लो का publish जॉब पुनः चलाएँ; यदि स्टब बना रहता है, रिलीज़ पेज हटाएँ (gh release delete vX.Y.Z --cleanup-tag) और उसी SHA से पुनः-टैग करें |
यदि एक पुनर्प्राप्ति चक्र एक नैदानिक पास के भीतर एक सतह को उतारने में विफल रहता है, तो सतह को रिलीज़ नोट्स में खुले इश्यू के लिंक के साथ एक ज्ञात-विफलता के रूप में लॉग किया जाता है; जब तक टूटी हुई सतह पैच रिलीज़ में ठीक की जा रही है, तब तक डाउनस्ट्रीम उपयोगकर्ताओं को काम करने वाली सतहों की ओर इंगित किया जाता है।
7. क्रॉस-रेफ़रेंस
- प्रकाशक सेटअप। प्रकाशक-खाता-सेटअप रनबुक npm विश्वसनीय-प्रकाशक बंधन और GitHub-पक्ष पूर्वापेक्षाएँ स्थापित करता है जिन्हें यह रनबुक मानता है।
- पुनर्प्राप्ति प्रवाह। रिलीज़-पुनर्प्राप्ति रनबुक
(
site/content/docs/runbooks/release-recovery.mdx) रिलीज़ कटओवर के दौरान क्रॉस-स्टेज विफलता पथ को नियंत्रित करता है, न कि §6 में नामित प्रति-सतह रिलीज़ विफलताओं को। - Pages सक्षमीकरण।
publish-static-site.ymlवर्कफ़्लो प्रोजेक्ट वेबसाइट को कस्टम डोमेन पर सत्यापित और डिप्लॉय करता है; Pages-सक्षमीकरण रनबुक (site/content/docs/runbooks/pages-enablement.mdx) वह अपस्ट्रीम प्रक्रिया है जिसने सबसे पहले कस्टम डोमेन स्थापित किया। - संस्करण नीति।
site/content/docs/governance/release-engineering-policy.mdxSemVer + हस्ताक्षरण + अप्रचलन नीति रखता है जिसका यह रनबुक सम्मान करता है।