ci: publish templates to the control panel on main
Validate game templates / validate (push) Successful in 9m31s

Adds `gbrgames export`, which builds the games_published payload from
every game.yaml, and a CI step that posts it to the panel webhook after
validation on main. Unlike the node-agent notify, a failed publish fails
the run so stale templates in the panel never go unnoticed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
gregandClaude Opus 5.5 committed 2026-10-24 17:12:50 -04:00
1 parent 822b44e2e5
commit 5fb7736be2
3 files changed
+85 -1

No files matched your search

+58
View File
@@ -0,0 +1,58 @@
package main
import (
"encoding/json"
"errors"
"flag"
"fmt"
"os"
"path/filepath"
)
// runExport writes the games_published webhook payload: every game.yaml as JSON, ready for the panel.
func runExport(args []string) error {
fs := flag.NewFlagSet("export", flag.ExitOnError)
gamesDir := fs.String("games", "games", "directory holding one folder per game")
repo := fs.String("repo", "", "repository full name, e.g. gbreed-public/gbr-games")
commit := fs.String("commit", "", "commit SHA the templates come from")
out := fs.String("out", "", "file to write (default stdout)")
fs.Parse(args)
entries, err := os.ReadDir(*gamesDir)
if err != nil {
return err
}
games := []any{}
for _, e := range entries {
if !e.IsDir() {
continue
}
raw, err := os.ReadFile(filepath.Join(*gamesDir, e.Name(), "game.yaml"))
if err != nil {
return fmt.Errorf("%s: %w", e.Name(), err)
}
game, err := loadYAML(raw)
if err != nil {
return fmt.Errorf("%s/game.yaml: %w", e.Name(), err)
}
games = append(games, game)
}
if len(games) == 0 {
return errors.New("no games to export")
}
payload := map[string]any{
"repository": map[string]any{"full_name": *repo},
"after": *commit,
"games": games,
}
b, err := json.Marshal(payload)
if err != nil {
return err
}
if *out == "" {
_, err = os.Stdout.Write(b)
return err
}
return os.WriteFile(*out, b, 0o644)
}
+4 -1
View File
@@ -2,6 +2,7 @@
//
// go run ./cmd/gbrgames validate # check every games/<id>/game.yaml (+ test.yaml)
// go run ./cmd/gbrgames import export.json # write games/<id>/ from GET /api/v1/admin/games
// go run ./cmd/gbrgames export -out p.json # build the games_published payload CI sends to the panel
package main
import (
@@ -19,6 +20,8 @@ func main() {
err = runValidate(os.Args[2:])
case "import":
err = runImport(os.Args[2:])
case "export":
err = runExport(os.Args[2:])
default:
usage()
}
@@ -29,6 +32,6 @@ func main() {
}
func usage() {
fmt.Fprintln(os.Stderr, "usage: gbrgames validate [-games DIR] | import [-games DIR] [-all] EXPORT.json")
fmt.Fprintln(os.Stderr, "usage: gbrgames validate [-games DIR] | import [-games DIR] [-all] EXPORT.json | export [-repo R] [-commit SHA] [-out FILE]")
os.Exit(2)
}