Publicación y releases
Cómo se construye una release completa y qué ficheros contiene.
Secuencia
Dibujando el diagrama…
sequenceDiagram autonumber participant P as publish.yml participant GH as GitHub Releases participant S as site.yml participant GP as GitHub Pages participant CF as Cloudflare Pages participant V as verify_live.py P->>P: re-verify final set, seal, sign, tar.gz, metadata P->>P: verify_release.py on the exact files to publish P->>GH: create DRAFT release with every asset P->>GH: check the asset count, then publish P->>S: request site deployment S->>GH: download the release and history S->>S: verify_release.py, build catalog and stats, record verification S->>GP: deploy S->>CF: deploy mirror (preflight first) S->>V: verify the public URL V->>GP: package, every rule file, catalog, links V-->>S: PASS or FAIL logged in the transparency log
Descripción del diagrama
Tras las comprobaciones finales, publish.yml construye el archivo y los metadatos, vuelve a verificar los artefactos, crea una release en borrador, adjunta todos los ficheros y solo entonces la hace pública. Después site.yml construye el catálogo desde la release publicada, la verifica otra vez, despliega GitHub Pages y verifica la URL pública con los bytes reales. El espejo de Cloudflare se despliega cuando su credencial funciona.
Código Mermaid
sequenceDiagram
autonumber
participant P as publish.yml
participant GH as GitHub Releases
participant S as site.yml
participant GP as GitHub Pages
participant CF as Cloudflare Pages
participant V as verify_live.py
P->>P: re-verify final set, seal, sign, tar.gz, metadata
P->>P: verify_release.py on the exact files to publish
P->>GH: create DRAFT release with every asset
P->>GH: check the asset count, then publish
P->>S: request site deployment
S->>GH: download the release and history
S->>S: verify_release.py, build catalog and stats, record verification
S->>GP: deploy
S->>CF: deploy mirror (preflight first)
S->>V: verify the public URL
V->>GP: package, every rule file, catalog, links
V-->>S: PASS or FAIL logged in the transparency logpublish.ymlcomprueba antes (precheck) que el candidato difiere de la última release; si es idéntico no pide aprobación ni publica.- Vuelve a verificar el conjunto final (clasificación y evidencia dinámica) antes de firmar.
- Firma el checkpoint, sella y firma el manifiesto, escribe la prueba de inclusión, empaqueta y genera los metadatos.
- Comprueba los artefactos exactos antes de que nada sea público, crea la release como borrador, adjunta todos los ficheros y solo entonces la hace pública.
Ficheros de una release
| Fichero | Contenido | Obligatorio |
|---|---|---|
rules-release.tar.gz | Las reglas (rules/) y manifest.json. | sí |
manifest.json | Lista de ficheros con SHA-256, fuentes, rules_root, cabeza del registro y estadísticas. | sí |
manifest.sigstore.json | Firma Sigstore del manifiesto. | sí |
inclusion-proof.json | Prueba Merkle de inclusión de la entrada de la release. | sí |
checkpoint.txt | Checkpoint del registro. | sí |
checkpoint.sigstore.json | Firma Sigstore del checkpoint. | sí |
release.json | Metadatos: cifras, fuentes, cambios, paquete. | no |
changes.json, CHANGELOG.md | Ficheros añadidos, modificados y quitados respecto a la anterior. | no |
consistency.json | Prueba de consistencia con el registro de la release anterior. | no (si hay anterior) |
Ejemplo real: manifest.json de la última release (resumido):
{
"schema": 1,
"created_at": "2026-10-18T17:36:07.186971+00:00",
"sources": [
{
"commit": "3ce6640c26046da8e6d8094af3eaaee3ee84e648",
"id": "nextron",
"kind": "rules",
"license_check": {
"detail": "DRL-1.1: allowed-with-attribution",
"ok": true,
"redistribution": "allowed-with-attribution",
"sha256": "8a959b2413d0c83ca1b3ce9153076c649abf2e4bbfebbb493fb24c2074a1eb8a",
"spdx_reported": "NOASSERTION"
},
"repository": "Neo23x0/signature-base"
},
{
"commit": "0f93570194a80d2f2032869055808b0ddcdfb360",
"id": "community",
"kind": "rules",
"license_check": {
"detail": "GPL-2.0: allowed-with-license-notice",
"ok": true,
"redistribution": "allowed-with-license-notice",
"sha256": "c03cea027b4b40e4402fabd08557736727ec3d5bc54ad64ab6472de432198cad",
"spdx_reported": "GPL-2.0"
},
"repository": "Yara-Rules/rules"
},
{
"commit": "649cd3bb08e1c4ecc1524cc016c7aa27a75d2193",
"id": "yara-x",
"kind": "engine",
"repository": "VirusTotal/yara-x"
}
],
"files": [
{
"bytes": 27570,
"path": "rules/community/antidebug_antivm/antidebug_antivm.yar",
"sha256": "f3ee419817136b14253a1b9b1b1d0f36de7cb61b35539b2f9c643c102f0c701d",
"source": "community"
},
"... 1173 more entries ..."
],
"rules_root": "16d082395ef1ec53d0ad25d5840d83e7f5f3a75a283ce66f8fa75da106790ec5",
"log": {
"origin": "macguard-rules-log v1",
"root": "1bab9bb9364b3a42f76835ae138bffad33eaa3694d0021afd208f5fd54e63d96",
"size": 75
},
"stats": {
"expanded_bytes": 7861571,
"files": 1174,
"yara_rules": 9958
},
"validation": {
"checked": 1174,
"engine": "yara"
},
"status": "PUBLISHED"
}Claves del manifiesto: created_at, files, log, rejected, rules_root, schema, sources, stats, status, validation.
Reglas de publicación
- Cada release es el conjunto completo, no un parche. Una corrección es una release nueva; las etiquetas no se reutilizan.
- Sin cambio efectivo no hay release.
- Cambios solo de la web o de la documentación no crean releases de reglas.
- Las releases inmutables de GitHub no están activadas (ajuste de seguridad del repositorio que requiere la autorización de una persona); el flujo borrador → pública ya es el que ese ajuste exige.