Form to Wipe — Implementación de GitHub Actions
Esta guía cubre la implementación de GitHub Actions de Form to Wipe. Cada solicitud de borrado es un Pull Request. Las reglas de protección de rama garantizan que el solicitante no pueda fusionar su propio PR. Cuando un aprobador lo fusiona, el flujo de trabajo ejecuta el comando de borrado y publica los resultados como un comentario de PR. Todo el historial vive en git — permanente, buscable y a prueba de manipulaciones. No se requiere infraestructura.
Cómo funciona
1. El solicitante abre un Issue usando la plantilla de Solicitud de borrado
2. El solicitante crea una rama y PR referenciando el issue
3. Un compañero de equipo (no el solicitante) revisa y fusiona el PR
4. GitHub Actions se ejecuta: analiza el cuerpo del PR, resuelve IDs de dispositivos, envía comandos de borrado
5. Los resultados se publican como un comentario de PR
6. El PR fusionado es su registro de auditoría
Requisitos previos
- Repositorio de GitHub (público o privado con minutos de Actions)
- Cliente OAuth2 de la Jamf Platform API con privilegios de borrado (ver Form to Wipe)
- Un equipo de aprobadores designado en su organización de GitHub
Configuración
Paso 1 — Clonar o fork el repositorio
git clone https://github.com/YOUR_ORG/FTW-Form-to-Wipe.git
cd FTW-Form-to-Wipe
O copie el contenido del directorio github-workflow/ a la raíz de su propio repositorio.
Paso 2 — Secretos del repositorio
Vaya a Settings → Secrets and variables → Actions → New repository secret y agregue:
| Secreto | Valor |
|---|---|
JAMF_CLIENT_ID |
Su ID de cliente de la Jamf Platform API |
JAMF_CLIENT_SECRET |
Su secreto de cliente de la Jamf Platform API |
JAMF_TOKEN_URL |
Punto final del token, ej. https://YOUR_INSTANCE.jamfcloud.com/api/oauth/token |
JAMF_REGION |
us, eu, o apac — determina el prefijo de URL de API Gateway |
Los secretos de GitHub nunca se registran ni se exponen en la salida del flujo de trabajo. El token recuperado en tiempo de ejecución se enmascara mediante add-mask.
Paso 3 — Reglas de protección de rama
Este es el paso más crítico. La protección de rama es lo que garantiza que nadie pueda aprobar su propia solicitud de borrado.
Vaya a Settings → Branches → Add branch protection rule
Patrón de nombre de rama:
main(o su rama predeterminada)Habilite la siguiente configuración:
Configuración Requerido Requiere un pull request antes de fusionar ✅ Requerir aprobaciones — establecer en 1 ✅ Descartar revisiones antiguas cuando se envían nuevas confirmaciones ✅ Requerir revisión de propietarios de código Recomendado Restringir quién puede descartar revisiones de pull request Recomendado No permitir el bypass de la configuración anterior ✅ Crítico
"No permitir bypass" evita que los administradores del repositorio fusionen sus propias solicitudes. Sin esta configuración, los administradores pueden omitir la aprobación por completo.
Paso 4 — CODEOWNERS (Recomendado)
Cree .github/CODEOWNERS para requerir revisión de un equipo específico para cualquier archivo en el directorio requests/:
# .github/CODEOWNERS
requests/ @your-org/jamf-admins
Esto significa que cualquier PR que toque requests/ requiere automáticamente una revisión del equipo jamf-admins. Los miembros del equipo aún no pueden aprobar sus propios PRs.
Paso 5 — Cree el directorio de solicitudes
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
El flujo de trabajo se activa en eventos pull_request → closed para cualquier PR que toque requests/**.md.
Envío de una solicitud de borrado
Como solicitante
Abra un Issue usando la plantilla de Solicitud de Borrado de Dispositivo. Complete todos los campos exactamente como se etiquetan. Tenga en cuenta el número del issue (ej.
#42).Cree una rama:
git checkout -b wipe/issue-42-device-wipeCree el archivo de solicitud:
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-wipeAbra un Pull Request — título:
Device Wipe Request — fixes #42. Solicite revisión de un compañero.
Como aprobador
- Revise el PR — verifique que los IDs de dispositivos y el motivo sean legítimos
- Confirme que no es el autor del PR (GitHub lo aplica, pero verifique)
- Apruebe y Fusione usando un merge commit (no squash, no rebase — merge commit preserva el historial completo)
- El flujo de trabajo se ejecuta automáticamente en la fusión
- Verifique los comentarios del PR para los resultados
Registro de auditoría
Cada PR de solicitud de borrado fusionado es un registro de auditoría permanente que contiene:
| Campo | Origen |
|---|---|
| Quién solicitó | Autor de PR |
| Quién aprobó | Fusionado por |
| Qué dispositivos | Cuerpo de PR / archivo de solicitud |
| Qué inquilino | Cuerpo de PR |
| Cuándo se aprobó | Marca de tiempo de fusión |
| Resultado | Comentario de PR del flujo de trabajo |
Para buscar borrados anteriores:
# Enumera todos los PRs de solicitud de borrado fusionados por etiqueta
gh pr list --label wipe-request --state merged
# Busca por ID de dispositivo
gh pr list --state merged --search "device 42"
Consideraciones de seguridad
- Las credenciales de la Jamf Platform API viven como secretos del repositorio — nunca en código de flujo de trabajo o cuerpos de solicitud
- La protección de rama evita la autoaprobación a nivel de plataforma
CODEOWNERSasegura que solo los administradores designados puedan aprobar solicitudes de borrado- El flujo de trabajo valida solicitante ≠ aprobador en tiempo de ejecución como una segunda verificación
- Los comentarios de resultado del flujo de trabajo se adjuntan al PR y no se pueden alterar después del hecho
- El directorio
requests/acumula un registro permanente e inmutable de cada borrado ejecutado
Limitaciones vs. n8n
| Característica | GitHub Actions | n8n |
|---|---|---|
| Interfaz | GitHub Issue + PR | Modal de Slack |
| UX de aprobación en tiempo real | ⚠️ Revisión asincrónica de PR | ✅ DM de Slack |
| Tiempo de espera de aprobación | ❌ Cierre manual | ✅ Configurable |
| Registro de auditoría | ✅ Historial de Git (inmutable) | Canal de Slack |
| Infraestructura requerida | Ninguno | Instancia n8n |
| Multi-inquilino | ✅ Por archivo de solicitud | ✅ Por lista desplegable |
| Costo | Gratis (público) / Minutos de Actions | Licencia n8n |