Jamf Concepts
指南

指南

Form to Wipe — GitHub Actions Deployment

~3 min read
这对您有帮助吗?

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 useuapac — 确定API网关URL前缀

GitHub秘密永远不会在工作流输出中被记录或暴露。运行时检索的令牌通过 add-mask 进行掩盖。

步骤 3 — 分支保护规则

这是最关键的一步。分支保护是强制没有人能批准自己的wipe请求的原因。

  1. 转到 Settings → Branches → Add branch protection rule

  2. 分支名称模式:main(或您的默认分支)

  3. 启用以下设置:

    设置 必需
    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请求

作为请求者

  1. 开启Issue 使用Device Wipe Request模板。完全按照标签填写所有字段。记下issue编号(例如 #42)。

  2. 创建分支:

    git checkout -b wipe/issue-42-device-wipe
    
  3. 创建请求文件:

    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
    
  4. 开启Pull Request — 标题:Device Wipe Request — fixes #42。请求队友的审查。

作为批准者

  1. 审查PR — 验证设备ID和理由是否合法
  2. 确认您不是PR作者(GitHub执行此操作,但请验证)
  3. 批准并 合并 使用merge commit(不是squash,不是rebase——merge commit保留完整历史记录)
  4. 工作流在合并时自动运行
  5. 检查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许可证
这对您有帮助吗?