用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/doggy8088/subembed --skill npm-oidc-publish命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | npm-oidc-publish |
| description | 協助 subembed 專案進行基於 OIDC 信任發佈(Trusted Publishing)與 Rust 多平台二進位檔整合的自動化 npm 發佈技能。 |
本技能 (Skill) 專為 subembed 專案(一個包裝 Rust CLI 的輕量級 npm 套件)設計,用於指導與執行基於 GitHub Actions、OIDC 信任發佈 (Trusted Publishing) 的全自動二進位檔編譯與 npm 套件無密碼安全發佈。
當需要進行以下操作時,AI Agent 應立刻調用此技能:
0.1.1 升級到 0.1.2)。subembed 的核心特色是輕量化的包裝套件,其 npm 套件本身不含厚重的編譯代碼,而是透過 postinstall 腳本向 GitHub Release 下載對應作業系統的預編譯 Rust 二進位檔案。
因此,發佈時存在強烈的雙向依賴關係:
prepublishOnly 的安全檢查腳本(prepublish-check.cjs)會失敗,拒絕發佈,防止發佈一個損壞的 npm 套件。graph TD
A[本地推送版本標籤 vX.Y.Z] --> B[1. 觸發 release.yml 工作流]
B --> C[建立 GitHub Release]
C --> D[編譯 4 平台 Rust 執行檔]
D --> E[計算 .sha256 並上傳 8 個資產至 GitHub Release]
E --> F[2. 執行 publish-npm 任務]
F --> G[執行 npm install -g npm@latest 與 Node 24 環境]
G --> H[執行 prepublish-check.cjs]
H -->|透過 36 次 HEAD 請求,輪詢 Release Assets 存在性| I[安全校驗通過]
I --> J[OIDC 握手取得 npm 10 分鐘一次性 Token]
J --> K[成功無密碼發佈至 npmjs.com]
在建置此專案的 CI/CD 過程中,我們踩過了兩大深坑,並成功實施了頂級的工程優化。未來遇到類似錯誤時,必須以此最優方案為基準進行診斷:
npm publish --provenance時,頻繁出現以下錯誤:
npm error 404 Not Found - PUT https://registry.npmjs.org/subembed - Not found
[!WARNING] 這是一個極具誤導性的錯誤!它指涉套件
subembed在 npmjs.com 找不到(或命名空間被鎖),但實際上是因為舊版 npm CLI 的 OIDC 安全協議握手失敗,導致 npm 註冊表直接中斷連線,最終回傳 404 狀態碼。
Node.js 24。- name: Upgrade npm
run: npm install -g npm@latest
這樣做能確保使用最安全的 TLS 與 OIDC 客戶端代碼進行憑證交握。release.yml 在編譯 x86_64-apple-darwin (Intel Mac) 執行檔時,使用的是 runs-on: macos-13。由於 GitHub 政策調整,macos-13 runner 極度短缺,導致任務時常卡在 Starting... 或 Queued 超過 15~30 分鐘,嚴重損害 CI 敏捷度。macos-14 (Apple Silicon 實體機器)。
利用 Rust 強大的跨平台交叉編譯(Cross-compilation)能力,在 Apple Silicon 機器上原生編譯出支援 Intel 處理器的二進位檔:
- runner: macos-14
target: x86_64-apple-darwin
cargo build --release --locked 時,出現以下錯誤:
error: cannot update the lock file /home/runner/work/subembed/subembed/Cargo.lock because --locked was passed to prevent this
Cargo.toml 中的 version 欄位後,必須在本地端執行 cargo build 或 cargo check,以使 Cargo.lock 同步更新。接著將 Cargo.lock 與 Cargo.toml 一併提交並推送到 remote 端。release.yml)」與「發佈至 npm(npm-publish.yml)」拆分為兩個工作流(或使用 Reusable Workflows 呼叫):
job_workflow_ref)不易對齊,容易導致 OIDC 握手失敗或 403 拒絕發佈。prepublish-check.cjs 需要確認 4 平台二進位檔已上傳至 GitHub Release。若兩者分屬不同工作流,通常需依賴事件觸發(如 release: published),這容易遇到 GitHub API 更新延遲或資產尚未完整上傳的競態問題,導致發佈失敗。release.yml),並利用作業依賴關係(needs: build-and-upload)進行順序調度:
release.yml,避免複雜的多檔案權限授權錯誤。needs 依賴關係,確保 100% 編譯成功且資產完整上傳後才啟動發佈,徹底解決時序 race condition。Re-run failed jobs 單獨重試發佈作業,維護性極佳。[!IMPORTANT] 「雞生蛋、蛋生雞」難題: 在尚未將套件首次手動發佈至 npmjs.com 之前,您無法在 npm 後台為此套件設定 OIDC Trusted Publishing。 同時,若您直接用 CI 自動發佈,因為此時還沒有 OIDC 權限,發佈必然會被 npm 拒絕。
因此,首次發佈必須遵循以下三階段「冷啟動」流程:
當您本地推送第一個 Tag v0.1.0 時,.github/workflows/release.yml 中配置了智慧控制參數 (Trigger Parameters)。
在 Publish package 步驟中:
if: ${{ !startsWith(github.ref_name, 'v0.1.0') }}
v0.1.0 開頭時,自動發佈流程會全自動安全跳過,只建立 GitHub Release 並上傳二進位檔案,而不嘗試向 npm 發佈。當第一階段自動上傳 4 平台二進位檔至 GitHub Release 成功後,您可以在本地進行首次手動發佈:
npm login
npm publish
註:此時本地的 prepublishOnly 會執行 prepublish-check.cjs。由於第一階段的資產已存在於 GitHub Release,檢查會順利通過!doggy8088 (或您的組織帳號)subembedrelease.ymlpackage.json 的版本升級至 0.1.1(或更新版本)。v0.1.1:
git tag v0.1.1
git push origin v0.1.1
release.yml 會全自動編譯上傳資產,接著透過 OIDC 全自動完成 100% 免密碼的 npm 安全發佈!當專案已經完成「冷啟動」,後續發佈新版本(如 0.1.2)時,只需執行以下零配置步驟:
package.json 與 Cargo.toml 中,將 "version" 修改為 "0.1.2"。CHANGELOG.md 中紀錄變更。cargo build 以確保 Cargo.lock 被自動同步更新為新版本。git add package.json Cargo.toml Cargo.lock CHANGELOG.md
git commit -m "chore: bump version to 0.1.2"
git push origin main
git tag v0.1.2
git push origin v0.1.2
Release 工作流會自動開始編譯。publish-npm 任務將被觸發,透過 OIDC 全自動、無痛地將新版本釋出到 npmjs.com。prepublish-check.cjs 的等待極限,或者 OIDC 握手臨時失敗。Release 工作流執行頁面,點選右上角的 Re-run failed jobs 重新執行 publish-npm 任務。cannot update the lock file because --locked was passed 錯誤Cargo.toml 中的版本號,但在提交/推送前沒有在本地執行 cargo build 更新 Cargo.lock。cargo build,將變更後的 Cargo.lock 提交並 push 到主分支,然後重新 tag 發佈。[!NOTE] 本 Skill 定義了
subembed專案高安全、極速編譯的發佈基石。未來不論是更換 CI 伺服器或調整部署,皆應嚴格遵循 OIDC 無密碼安全性規範。