<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Package on Tarragon</title><link>https://tarrragon.github.io/blog/tags/package/</link><description>Recent content in Package on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 06 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/package/index.xml" rel="self" type="application/rss+xml"/><item><title>Package / Library Release CI/CD</title><link>https://tarrragon.github.io/blog/ci/package-library-release/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/package-library-release/</guid><description>&lt;p>Package / Library Release CI/CD 的核心責任是把可重用套件安全發佈到分發平台，並維持版本語意與相容承諾。它和應用部署不同，重點在版本管理、相容邊界、發佈簽章與撤版策略。&lt;/p>
&lt;h2 id="場域定位">場域定位&lt;/h2>
&lt;p>套件發佈常見於 NPM、PyPI、Maven、Crates 等生態。發布後會被多個下游專案依賴，因此每次 release 都是公共契約變更。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>面向&lt;/th>
 &lt;th>Package release 常見責任&lt;/th>
 &lt;th>判讀訊號&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Build&lt;/td>
 &lt;td>package artifact、metadata、lock input&lt;/td>
 &lt;td>產物是否可重現&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Validation&lt;/td>
 &lt;td>API/ABI 相容性、smoke test、publish dry-run&lt;/td>
 &lt;td>破壞性變更是否被識別&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Versioning&lt;/td>
 &lt;td>semver、pre-release、changelog&lt;/td>
 &lt;td>版本語意是否與變更一致&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Publish&lt;/td>
 &lt;td>registry token、scope、provenance&lt;/td>
 &lt;td>發版是否可追溯且權限正確&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Recovery&lt;/td>
 &lt;td>yank/deprecate/hotfix release&lt;/td>
 &lt;td>事故時是否可快速止損&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="release-發布類型分類">Release 發布類型分類&lt;/h2>
&lt;p>「發版」在中文討論裡常被當成單一動作，但實際上有五條互不重疊的通道，每條的觸發條件、產物形式、下游取用方式都不一樣。下游使用者讀 README 時若沒分清楚自己在走哪條通道，很容易踩到「文件寫了安裝指令，但對應通道還沒被建立」的情況。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>類型&lt;/th>
 &lt;th>產物形式&lt;/th>
 &lt;th>下游取用方式&lt;/th>
 &lt;th>典型觸發&lt;/th>
 &lt;th>代表生態&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Source release&lt;/td>
 &lt;td>git tag + tarball&lt;/td>
 &lt;td>&lt;code>git clone&lt;/code> 或 &lt;code>go install&lt;/code> 後編譯&lt;/td>
 &lt;td>tag push&lt;/td>
 &lt;td>Go module、許多 OSS 函式庫&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Registry publish&lt;/td>
 &lt;td>套件清單登錄&lt;/td>
 &lt;td>&lt;code>npm install&lt;/code> / &lt;code>pip install&lt;/code> 等&lt;/td>
 &lt;td>&lt;code>publish&lt;/code> 指令&lt;/td>
 &lt;td>npm、PyPI、crates.io、Maven&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Binary release&lt;/td>
 &lt;td>預編譯多平台執行檔，掛在 GitHub Release&lt;/td>
 &lt;td>下載 binary 或 installer script&lt;/td>
 &lt;td>tag push&lt;/td>
 &lt;td>cargo-dist、goreleaser 工具鏈&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Container image&lt;/td>
 &lt;td>OCI image&lt;/td>
 &lt;td>&lt;code>docker pull&lt;/code> / k8s manifest&lt;/td>
 &lt;td>tag 或 commit&lt;/td>
 &lt;td>Docker Hub、GHCR、ECR&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>OS package&lt;/td>
 &lt;td>&lt;code>.deb&lt;/code> / &lt;code>.rpm&lt;/code> / Homebrew formula&lt;/td>
 &lt;td>套件管理器 install&lt;/td>
 &lt;td>上游同步&lt;/td>
 &lt;td>apt、yum、Homebrew、winget&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這五類常常組合出現（例如同時推 source、registry、binary release）。組合愈多、上游維護成本愈高，但下游能用的入口也愈廣。判讀訊號：&lt;/p>
&lt;ul>
&lt;li>README 寫的是 &lt;code>pip install x&lt;/code> → 屬 registry，去 PyPI 確認版本&lt;/li>
&lt;li>README 寫的是 &lt;code>curl ... /releases/latest/download/...sh | sh&lt;/code> → 屬 binary release + installer，去 GitHub Releases 確認 asset 存在&lt;/li>
&lt;li>README 寫的是 &lt;code>git clone&lt;/code> 後 &lt;code>make&lt;/code> → 只走 source，沒任何打包通道&lt;/li>
&lt;li>README 寫的是 &lt;code>docker pull ghcr.io/...&lt;/code> → 屬 container image，去 registry 確認 tag&lt;/li>
&lt;/ul>
&lt;h2 id="常見注意事項">常見注意事項&lt;/h2>
&lt;ul>
&lt;li>發版前要明確區分 breaking / feature / fix，避免版本語意錯置。&lt;/li>
&lt;li>發版流程應固定化（tag 規則、changelog 來源、artifact provenance）。&lt;/li>
&lt;li>對外 SDK 要維持 contract 測試，避免下游升級破壞。&lt;/li>
&lt;li>套件來源與 token 權限要最小化，並定期輪替。&lt;/li>
&lt;li>README 安裝段落寫的通道，發版前要實際跑過一次 — 「workflow 寫好」不代表「通道已上線」。&lt;/li>
&lt;/ul>
&lt;h2 id="安裝路徑分層">安裝路徑分層&lt;/h2>
&lt;p>Package release 的文件建議同時提供兩條安裝路徑，讓不同風險場景有對應入口。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>路徑類型&lt;/th>
 &lt;th>目標讀者&lt;/th>
 &lt;th>流程&lt;/th>
 &lt;th>風險控制&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>快速路徑&lt;/td>
 &lt;td>本機快速試用、低風險場景&lt;/td>
 &lt;td>一行安裝命令（例如 `curl &amp;hellip;&lt;/td>
 &lt;td>sh`）&lt;/td>
 &lt;td>速度優先，依賴上游發布品質&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>可審計路徑&lt;/td>
 &lt;td>生產環境、受管設備、合規場景&lt;/td>
 &lt;td>下載產物 → 驗證 checksum/provenance → 執行&lt;/td>
 &lt;td>可追溯、可驗證、可稽核&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這個分層能避免單一路徑綁死全部使用者。上游維護者要確保兩條路徑都可用，且文件清楚標示使用時機。可審計路徑的具體範例可直接沿用 &lt;a href="binary-release-and-installer/">Binary release 與 installer 模式&lt;/a> 的最小安全基線。&lt;/p></description><content:encoded><![CDATA[<p>Package / Library Release CI/CD 的核心責任是把可重用套件安全發佈到分發平台，並維持版本語意與相容承諾。它和應用部署不同，重點在版本管理、相容邊界、發佈簽章與撤版策略。</p>
<h2 id="場域定位">場域定位</h2>
<p>套件發佈常見於 NPM、PyPI、Maven、Crates 等生態。發布後會被多個下游專案依賴，因此每次 release 都是公共契約變更。</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>Package release 常見責任</th>
          <th>判讀訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Build</td>
          <td>package artifact、metadata、lock input</td>
          <td>產物是否可重現</td>
      </tr>
      <tr>
          <td>Validation</td>
          <td>API/ABI 相容性、smoke test、publish dry-run</td>
          <td>破壞性變更是否被識別</td>
      </tr>
      <tr>
          <td>Versioning</td>
          <td>semver、pre-release、changelog</td>
          <td>版本語意是否與變更一致</td>
      </tr>
      <tr>
          <td>Publish</td>
          <td>registry token、scope、provenance</td>
          <td>發版是否可追溯且權限正確</td>
      </tr>
      <tr>
          <td>Recovery</td>
          <td>yank/deprecate/hotfix release</td>
          <td>事故時是否可快速止損</td>
      </tr>
  </tbody>
</table>
<h2 id="release-發布類型分類">Release 發布類型分類</h2>
<p>「發版」在中文討論裡常被當成單一動作，但實際上有五條互不重疊的通道，每條的觸發條件、產物形式、下游取用方式都不一樣。下游使用者讀 README 時若沒分清楚自己在走哪條通道，很容易踩到「文件寫了安裝指令，但對應通道還沒被建立」的情況。</p>
<table>
  <thead>
      <tr>
          <th>類型</th>
          <th>產物形式</th>
          <th>下游取用方式</th>
          <th>典型觸發</th>
          <th>代表生態</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Source release</td>
          <td>git tag + tarball</td>
          <td><code>git clone</code> 或 <code>go install</code> 後編譯</td>
          <td>tag push</td>
          <td>Go module、許多 OSS 函式庫</td>
      </tr>
      <tr>
          <td>Registry publish</td>
          <td>套件清單登錄</td>
          <td><code>npm install</code> / <code>pip install</code> 等</td>
          <td><code>publish</code> 指令</td>
          <td>npm、PyPI、crates.io、Maven</td>
      </tr>
      <tr>
          <td>Binary release</td>
          <td>預編譯多平台執行檔，掛在 GitHub Release</td>
          <td>下載 binary 或 installer script</td>
          <td>tag push</td>
          <td>cargo-dist、goreleaser 工具鏈</td>
      </tr>
      <tr>
          <td>Container image</td>
          <td>OCI image</td>
          <td><code>docker pull</code> / k8s manifest</td>
          <td>tag 或 commit</td>
          <td>Docker Hub、GHCR、ECR</td>
      </tr>
      <tr>
          <td>OS package</td>
          <td><code>.deb</code> / <code>.rpm</code> / Homebrew formula</td>
          <td>套件管理器 install</td>
          <td>上游同步</td>
          <td>apt、yum、Homebrew、winget</td>
      </tr>
  </tbody>
</table>
<p>這五類常常組合出現（例如同時推 source、registry、binary release）。組合愈多、上游維護成本愈高，但下游能用的入口也愈廣。判讀訊號：</p>
<ul>
<li>README 寫的是 <code>pip install x</code> → 屬 registry，去 PyPI 確認版本</li>
<li>README 寫的是 <code>curl ... /releases/latest/download/...sh | sh</code> → 屬 binary release + installer，去 GitHub Releases 確認 asset 存在</li>
<li>README 寫的是 <code>git clone</code> 後 <code>make</code> → 只走 source，沒任何打包通道</li>
<li>README 寫的是 <code>docker pull ghcr.io/...</code> → 屬 container image，去 registry 確認 tag</li>
</ul>
<h2 id="常見注意事項">常見注意事項</h2>
<ul>
<li>發版前要明確區分 breaking / feature / fix，避免版本語意錯置。</li>
<li>發版流程應固定化（tag 規則、changelog 來源、artifact provenance）。</li>
<li>對外 SDK 要維持 contract 測試，避免下游升級破壞。</li>
<li>套件來源與 token 權限要最小化，並定期輪替。</li>
<li>README 安裝段落寫的通道，發版前要實際跑過一次 — 「workflow 寫好」不代表「通道已上線」。</li>
</ul>
<h2 id="安裝路徑分層">安裝路徑分層</h2>
<p>Package release 的文件建議同時提供兩條安裝路徑，讓不同風險場景有對應入口。</p>
<table>
  <thead>
      <tr>
          <th>路徑類型</th>
          <th>目標讀者</th>
          <th>流程</th>
          <th>風險控制</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>快速路徑</td>
          <td>本機快速試用、低風險場景</td>
          <td>一行安裝命令（例如 `curl &hellip;</td>
          <td>sh`）</td>
          <td>速度優先，依賴上游發布品質</td>
      </tr>
      <tr>
          <td>可審計路徑</td>
          <td>生產環境、受管設備、合規場景</td>
          <td>下載產物 → 驗證 checksum/provenance → 執行</td>
          <td>可追溯、可驗證、可稽核</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p>這個分層能避免單一路徑綁死全部使用者。上游維護者要確保兩條路徑都可用，且文件清楚標示使用時機。可審計路徑的具體範例可直接沿用 <a href="binary-release-and-installer/">Binary release 與 installer 模式</a> 的最小安全基線。</p>
<h2 id="學習路線">學習路線</h2>
<table>
  <thead>
      <tr>
          <th>章節</th>
          <th>主題</th>
          <th>核心責任</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="binary-release-and-installer/">Binary release 與 installer 模式</a></td>
          <td>Tag-driven binary release</td>
          <td>GitHub Release + cargo-dist / goreleaser 的發版鏈路</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>想理解 binary release + installer 模式（curl &hellip; | sh）：讀 <a href="binary-release-and-installer/">Binary release 與 installer 模式</a>。</li>
<li>供應鏈與產物可信度：讀 <a href="/blog/backend/knowledge-cards/artifact-provenance/" data-link-title="Artifact Provenance" data-link-desc="說明交付物的來源、完整性與簽章關聯如何建立信任">Artifact Provenance</a>。</li>
<li>版本契約：讀 <a href="/blog/backend/knowledge-cards/api-contract/" data-link-title="API Contract" data-link-desc="說明 request / response 邊界如何維持相容與可驗證">API Contract</a> 與 <a href="/blog/backend/knowledge-cards/contract/" data-link-title="Boundary Contract" data-link-desc="說明跨邊界約定如何維持相容與可驗證">Contract</a>。</li>
<li>失敗處理：讀 <a href="../github-actions-failure-flow/">CI 失敗到修復發布流程</a>。</li>
</ul>
]]></content:encoded></item></channel></rss>