Form to Wipe — GitHub Actions 部署
本指南涵蓋 Form to Wipe 的 GitHub Actions 實現。每個清除請求都是一個 Pull Request。分支保護規則強制請求者無法合併自己的 PR。當核准者合併它時,工作流程執行清除指令並將結果作為 PR 註解發佈。整個歷史記錄存在 git 中 — 永久、可搜尋且防篡改。無需基礎設施。
運作方式
1. 請求者使用清除請求範本開啟 Issue
2. 請求者建立分支和 PR 引用該 Issue
3. 同事(不是請求者)審查並合併 PR
4. GitHub Actions 執行:解析 PR 正文、解析裝置 ID、傳送清除指令
5. 結果作為 PR 註解發佈
6. 合併的 PR 是您的稽核日誌
先決條件
- GitHub 儲存庫(公開或具有 Actions 分鐘的私人)
- Jamf Platform API OAuth2 用戶端,具有清除特權(參見 Form to Wipe)
- 您 GitHub 組織中的指定核准者團隊
設定
步驟 1 — Fork 或 Clone 儲存庫
git clone https://github.com/YOUR_ORG/FTW-Form-to-Wipe.git
cd FTW-Form-to-Wipe
或將 github-workflow/ 目錄內容複製到您自己的儲存庫根目錄。
步驟 2 — 儲存庫機密
移至 Settings → Secrets and variables → Actions → New repository secret 並新增:
| 機密 | 值 |
|---|---|
JAMF_CLIENT_ID |
您的 Jamf Platform API 用戶端 ID |
JAMF_CLIENT_SECRET |
您的 Jamf Platform API 用戶端機密 |
JAMF_TOKEN_URL |
權杖端點,例如 https://YOUR_INSTANCE.jamfcloud.com/api/oauth/token |
JAMF_REGION |
us、eu 或 apac — 決定 API Gateway URL 前置詞 |
GitHub 機密永遠不會記錄或在工作流程輸出中公開。在執行時檢索的權杖通過 add-mask 被掩蓋。
步驟 3 — 分支保護規則
這是最關鍵的步驟。分支保護是強制沒有人可以核准自己的清除請求的方式。
移至 Settings → Branches → Add branch protection rule
分支名稱模式:
main(或您的預設分支)啟用以下設定:
設定 必需 需要 Pull Request 後才能合併 ✅ 需要核准 — 設定為 1 ✅ 推送新提交時關閉陳舊審查 ✅ 需要 Code Owners 的審查 建議 限制可以關閉 Pull Request 審查的人員 建議 不允許繞過上述設定 ✅ 關鍵
"不允許繞過" 防止儲存庫管理員合併自己的請求。沒有此設定,管理員可以完全繞過核准。
步驟 4 — CODEOWNERS(建議)
建立 .github/CODEOWNERS 以要求來自特定團隊的審查,用於 requests/ 目錄中的任何檔案:
# .github/CODEOWNERS
requests/ @your-org/jamf-admins
這表示任何涉及 requests/ 的 PR 自動需要來自 jamf-admins 團隊的審查。團隊成員仍然無法核准自己的 PR。
步驟 5 — 建立請求目錄
mkdir requests
echo "# Wipe Requests\n\nMerged PRs in this directory represent executed device wipes." > requests/README.md
git add requests/
git commit -m "Add requests directory"
git push
工作流程在 pull_request → closed 事件上觸發,用於任何涉及 requests/**.md 的 PR。
提交清除請求
作為請求者
開啟 Issue 使用裝置清除請求範本。準確填入所有標籤為的欄位。注意 Issue 編號(例如
#42)。建立分支:
git checkout -b wipe/issue-42-device-wipe建立請求檔案:
cat > requests/wipe-$(date +%Y%m%d-%H%M%S).md << 'EOF' **Tenant Name:** Production **Tenant ID:** aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee **Device Type:** computer **Device IDs:** 42,87 **Reason:** Employee offboarding — devices not returned **Find My PIN:** EOF git add requests/ git commit -m "Wipe request for devices 42, 87 - fixes #42" git push -u origin wipe/issue-42-device-wipe開啟 Pull Request — 標題:
Device Wipe Request — fixes #42。要求同事進行審查。
作為核准者
- 審查 PR — 驗證裝置 ID 和原因是否合法
- 確認您不是 PR 作者(GitHub 強制執行此操作,但請驗證)
- 核准並合併使用合併提交(不是壓縮、不是重新定位 — 合併提交保留完整歷史記錄)
- 工作流程在合併時自動執行
- 檢查 PR 註解以查看結果
稽核軌跡
每個合併的清除請求 PR 是一個永久稽核記錄,包含:
| 欄位 | 來源 |
|---|---|
| 誰要求 | PR 作者 |
| 誰核准 | 合併者 |
| 哪些裝置 | PR 正文 / 請求檔案 |
| 哪個租戶 | PR 正文 |
| 何時核准 | 合併時間戳記 |
| 結果 | Workflow PR 註解 |
要搜尋過去的清除:
# 按標籤列出所有合併的清除 PR
gh pr list --label wipe-request --state merged
# 按裝置 ID 搜尋
gh pr list --state merged --search "device 42"
安全考量
- Jamf Platform API 憑證存在作為儲存庫機密 — 永遠不在工作流程程式碼或請求正文中
- 分支保護在平台層級防止自我核准
CODEOWNERS確保只有指定的管理員可以核准清除請求- 工作流程在執行時驗證請求者 ≠ 核准者作為第二檢查
- Workflow 結果註解附加到 PR 且事後無法更改
requests/目錄累積了每個已執行清除的永久、不可改變的記錄
與 n8n 的限制
| 功能 | GitHub Actions | n8n |
|---|---|---|
| 介面 | GitHub Issue + PR | Slack 模式 |
| 即時核准 UX | ⚠️ 非同步 PR 審查 | ✅ Slack DM |
| 核准超時 | ❌ 手動關閉 | ✅ 可設定 |
| 稽核軌跡 | ✅ Git 歷史(不可改變) | Slack 通道 |
| 需要基礎設施 | 無 | n8n 實例 |
| 多租戶 | ✅ 每個請求檔案 | ✅ 每個下拉清單 |
| 成本 | 免費(公開)/ Actions 分鐘數 | n8n 許可證 |