Form to Wipe — GitHub Actions Deployment
本指南涵盖了Form to Wipe的GitHub Actions实现。每个wipe请求都是一个Pull Request。分支保护规则强制请求者无法合并自己的PR。当批准者合并它时,工作流执行擦除命令并将结果作为PR注释发布。整个历史记录存储在git中——永久、可搜索和防篡改。无需基础设施。
工作原理
1. 请求者使用Wipe Request模板开启Issue
2. 请求者创建分支并创建引用该issue的PR
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网关URL前缀 |
GitHub秘密永远不会在工作流输出中被记录或暴露。运行时检索的令牌通过 add-mask 进行掩盖。
步骤 3 — 分支保护规则
这是最关键的一步。分支保护是强制没有人能批准自己的wipe请求的原因。
转到 Settings → Branches → Add branch protection rule
分支名称模式:
main(或您的默认分支)启用以下设置:
设置 必需 Require a pull request before merging ✅ Require approvals — set to 1 ✅ Dismiss stale reviews when new commits are pushed ✅ Require review from Code Owners 推荐 Restrict who can dismiss pull request reviews 推荐 Do not allow bypassing the above settings ✅ 关键
"不允许绕过" 防止存储库管理员合并自己的请求。如果没有此设置,管理员可以完全绕过批准。
步骤 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。
提交Wipe请求
作为请求者
开启Issue 使用Device Wipe Request模板。完全按照标签填写所有字段。记下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执行此操作,但请验证)
- 批准并 合并 使用merge commit(不是squash,不是rebase——merge commit保留完整历史记录)
- 工作流在合并时自动运行
- 检查PR注释中的结果
审计跟踪
每个合并的wipe请求PR都是包含以下内容的永久审计记录:
| 字段 | 来源 |
|---|---|
| Who requested | PR author |
| Who approved | Merged by |
| Which devices | PR body / request file |
| Which tenant | PR body |
| When approved | Merge timestamp |
| Outcome | Workflow PR comment |
要搜索过去的wipe:
# 按标签列出所有合并的wipe PR
gh pr list --label wipe-request --state merged
# 按设备ID搜索
gh pr list --state merged --search "device 42"
安全考虑
- Jamf Platform API凭证存储为存储库秘密——不在工作流代码或请求正文中
- 分支保护在平台级别防止自我批准
CODEOWNERS确保只有指定的管理员可以批准wipe请求- 工作流在运行时验证请求者≠批准者作为第二次检查
- 工作流结果注释追加到PR中,事后无法更改
requests/目录累积了每个已执行wipe的永久、不可变记录
与n8n相比的限制
| 特性 | GitHub Actions | n8n |
|---|---|---|
| 接口 | GitHub Issue + PR | Slack模态 |
| 实时批准UX | ⚠️ 异步PR审查 | ✅ Slack DM |
| 批准超时 | ❌ 手动关闭 | ✅ 可配置 |
| 审计跟踪 | ✅ Git历史记录(不可变) | Slack频道 |
| 所需基础设施 | 无 | n8n实例 |
| 多租户 | ✅ 每个请求文件 | ✅ 每个下拉菜单 |
| 成本 | 免费(公开)/ Actions分钟数 | n8n许可证 |