版本發佈¶
發佈由推送(push)git 標籤觸發。標籤名稱決定發佈渠道。
標籤命名慣例¶
| 標籤格式 | 渠道 | GitHub Release 類型 |
|---|---|---|
v1.2.3-alpha.1 |
alpha | Pre-release |
v1.2.3-beta.1 |
beta | Pre-release |
v1.2.3-rc.1 |
rc | Pre-release |
v1.2.3 |
stable | Latest release |
建立發佈¶
# Alpha
git tag v1.2.3-alpha.1 && git push origin v1.2.3-alpha.1
# Beta
git tag v1.2.3-beta.1 && git push origin v1.2.3-beta.1
# Release candidate
git tag v1.2.3-rc.1 && git push origin v1.2.3-rc.1
# Stable
git tag v1.2.3 && git push origin v1.2.3
CI 工作流程(build-dmg.yml,名為「Build Provisa Packages」)會在任何 v* 標籤上觸發,並執行以下大部分可並行執行的工作:
- Resolve release metadata — 從標籤後綴偵測渠道,推導 PEP 440 版本及資源名稱
- Download / package Trino plugins — 拉取 Calcite Trino 連接器並打包成 tarball
- Pull core / obs / demo Docker images — 保存服務映像的 tarball(arm64,另加 amd64 core 供 Windows 容器層使用)
- Build macOS Core / Obs / Demo DMGs — 在
macos-14(Apple Silicon)上執行,離線環境(airgapped) - Build Linux AppImage — core,離線環境
- Build Windows Core installer — 原生、內嵌 Python、免 Docker
- Build Windows Container-tier installer — WSL2 + Trino,按需擷取映像(免 VirtualBox/OVA)
- Build JDBC driver — Maven shaded JAR
- Build and test Python client,然後 Publish to PyPI
- Publish GitHub Release — 上載全部資源,為 alpha/beta/rc 設定 pre-release 標記
發佈資源¶
每次發佈都會發佈以下資源,全部附加到 GitHub Release(wheel 亦會同步發佈至 PyPI):
| 資源 | 平台/用途 |
|---|---|
Provisa-<tag>-macOS.dmg |
macOS Core(Apple Silicon,離線環境) |
Provisa-Runtime-<tag>-macOS.dmg |
macOS 原生 Python runtime(與 Core 一併掛載) |
Provisa-Obs-<tag>-macOS.dmg |
macOS 可觀測性擴充功能 |
Provisa-Demo-<tag>-macOS.dmg |
macOS 示範擴充功能(需要 Obs) |
Provisa-<tag>-linux-x86_64.AppImage |
Linux x86_64 core(離線環境) |
Provisa-<tag>-windows-x64.exe |
Windows x64 原生安裝程式(內嵌 Python,免 Docker) |
Provisa-Container-<tag>-windows-x64.exe |
Windows x64 容器層升級(WSL2 + Trino) |
provisa-jdbc-<tag>.jar |
JDBC 驅動程式 — Tableau、PowerBI、DBeaver |
provisa_client-<pep440>-py3-none-any.whl |
Python 客戶端(同時發佈於 PyPI) |
provisa-core-images-<tag>.tar.gz |
Core Services 映像 tarball(arm64,離線環境) |
provisa-core-images-amd64-<tag>.zip |
Core Services 映像(amd64,Windows 容器層/離線環境) |
provisa-obs-images-<tag>.tar.gz |
Observability Stack 映像(選用) |
provisa-demo-images-<tag>.tar.gz |
Demo Data Pack 映像(選用) |
provisa-trino-plugins-<tag>.tar.gz |
Coordination Engine 連接器(SharePoint、Splunk、File) |
Python 客戶端版本會自動轉換為 PEP 440 格式:
v0.1.0-alpha.1 → 0.1.0a1,v0.1.0-beta.1 → 0.1.0b1,v0.1.0-rc.1 → 0.1.0rc1。
PyPI 發佈設定(一次性)¶
.github/workflows/build-dmg.yml 中的 publish-pypi(provisa-client)及 publish-provisa-pypi(provisa)工作透過 PyPI 可信任發佈(trusted publishing)進行發佈:由工作的 GitHub OIDC 權杖(id-token: write)完成身分驗證,不會讀取任何 API 權杖。請在 pypi.org 上將本存放庫及 build-dmg.yml 註冊為每個專案的可信任發佈者(Your projects → Manage → Publishing)。此後每次打標籤都會自動發佈。
簽署與供應鏈¶
發佈工作流程建置時,每個發佈構件所帶有的內容:
| 構件 | 簽章 |
|---|---|
PyPI 上的 provisa 及 provisa-client |
每個檔案一份經 Sigstore 簽署的 PEP 740 證明(attestations: true),可在 pypi.org 上驗證 |
PyPI 上的 provisa-pg-ext、provisa-duckdb-ext |
每個檔案一份經 Sigstore 簽署的 PEP 740 證明 |
JDBC 驅動程式 .jar |
Sigstore 建置來源證明(actions/attest-build-provenance) |
macOS .dmg 安裝程式 |
Developer ID 程式碼簽章及 Apple 公證 |
Windows .exe 安裝程式 |
未簽署 |
Linux .AppImage |
未簽署 |
任何作業系統上的已簽署安裝方式都是 pip install provisa:帶有 Sigstore 證明的 PyPI 套件。需要在 Linux 或 Windows 上取得已簽署構件的審閱者,請使用 pip 安裝。設定了程式碼簽署憑證時,Windows 建置會以 Authenticode 簽署(WINDOWS_CERT_PFX_BASE64、WINDOWS_CERT_PFX_PASSWORD、WINDOWS_CERT_TIMESTAMP_URL,由 packaging/windows/build-sfx.ps1 讀取);目前並未設定,因此以未簽署形式發佈。
相依套件與 CVE 關卡:
- Python 相依套件在
uv.lock中以雜湊鎖定;CI 以uv sync --frozen安裝它們。 CVE Audit工作流程(.github/workflows/cve-audit.yml)在每次推送至main、每個提取要求以及每週,對鎖定的集合執行pip-audit。- 發佈時,
provisa及provisa-client的建置各自產生一份 CycloneDX SBOM,並對所發佈的內容執行pip-audit。JDBC 驅動程式以grype --fail-on medium掃描。任何發現都會令工作失敗,而發佈不會發佈任何內容:PyPI 上傳及 GitHub 發佈都會等待這些工作。SBOM 及 CVE 報告會附加至每個發佈。 - 桌面安裝程式在發佈執行器上從原始碼建置
provisawheel,並在建置時以pip解析其相依套件,而不是從uv.lock解析;發佈 CVE 關卡掃描的是鎖定的集合,而不是安裝程式所內附的相依套件。 - 有一項已記錄的例外被忽略:PYSEC-2026-4114 / CVE-2026-49265(伺服器端 oauthlib PKCE;Provisa 只在用戶端使用 oauthlib)。
packaging/pypi/requirements-embedded.lock是provisa[embedded]的雜湊固定解析結果,供離線(airgap)鏡像使用(參見packaging/pypi/MIRROR-CHECKLIST.md)。它是手動重新產生的,而不是每次發佈都產生。
所需的存放庫密鑰¶
請在 Settings → Secrets → Actions 中設定以下項目:
| 密鑰 | 所需用途 | 說明 |
|---|---|---|
APPLE_CERT_P12_BASE64 |
簽署建置 | Base64 編碼的 .p12 憑證檔案(見下文) |
APPLE_CERT_P12_PASSWORD |
簽署建置 | 從 Keychain Access 匯出 .p12 時設定的密碼 |
APPLE_DEVELOPER_ID |
簽署建置 | 完整憑證名稱:Developer ID Application: Your Name (TEAMID) |
APPLE_NOTARYTOOL_APPLE_ID |
公證建置 | Apple ID 電郵地址 |
APPLE_NOTARYTOOL_PASSWORD |
公證建置 | 來自 appleid.apple.com 的應用程式專用密碼(並非你的登入密碼) |
APPLE_NOTARYTOOL_TEAM_ID |
公證建置 | 10 個字元的 Apple Team ID |
沒有這些密鑰的建置仍可成功完成,但會產生未簽署/未公證的 DMG(使用者將會看到 Gatekeeper 警告)。
匯出 .p12 憑證¶
- 開啟 Keychain Access → 登入鑰匙圈 → My Certificates
- 尋找 Developer ID Application: Your Name (TEAMID) — 展開以確認私密金鑰嵌套於其下
- 同時選取憑證及其私密金鑰 → 按右鍵 → Export 2 Items → 儲存為
.p12→ 設定一個強密碼 - 進行 Base64 編碼並複製到剪貼簿:
- 將其貼上作為
APPLE_CERT_P12_BASE64的值;將APPLE_CERT_P12_PASSWORD設定為步驟 3 中的密碼
尋找你的憑證名稱¶
複製引號中的完整字串——這就是 APPLE_DEVELOPER_ID 的值。
刪除錯誤的標籤¶
然後在介面中刪除對應的 GitHub Release,再重新打標籤。