From dcbe3d1f9b0c1a4720bd2b9170d302c8ba672f83 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 21 Feb 2020 22:32:23 +0000 Subject: feat(ops/besadii): Use post-receive hook input to trigger builds Parses the input passed to besadii from git to extract ref updates and trigger builds. --- ops/besadii/main.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) (limited to 'ops/besadii') diff --git a/ops/besadii/main.go b/ops/besadii/main.go index 4bb5c59a1c..b09e1b929c 100644 --- a/ops/besadii/main.go +++ b/ops/besadii/main.go @@ -9,6 +9,7 @@ package main import ( + "bufio" "bytes" "encoding/json" "fmt" @@ -16,8 +17,18 @@ import ( "log" "net/http" "os" + "strings" ) +// Represents an updated reference as passed to besadii by git +// +// https://git-scm.com/docs/githooks#pre-receive +type refUpdate struct { + name string + old string + new string +} + // Represents a builds.sr.ht build object as described on // https://man.sr.ht/builds.sr.ht/api.md type Build struct { @@ -110,15 +121,50 @@ func triggerBuild(token, branch, commit string) { respBody, err := ioutil.ReadAll(resp.Body) log.Printf("received non-success response from builds.sr.ht: %s (%v)[%s]", respBody, resp.Status, err) } else { - log.Println("triggered builds.sr.ht job for commit", commit) + log.Printf("triggered builds.sr.ht job for branch '%s' at commit '%s'", branch, commit) } } +func parseRefUpdates() ([]refUpdate, error) { + var updates []refUpdate + + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + line := scanner.Text() + fragments := strings.Split(line, " ") + + if len(fragments) != 3 { + return nil, fmt.Errorf("invalid ref update: '%s'", line) + } + + updates = append(updates, refUpdate{ + old: fragments[0], + new: fragments[1], + name: fragments[2], + }) + } + + if err := scanner.Err(); err != nil { + return nil, err + } + + return updates, nil +} + func main() { - triggerBuild("master", "c5806a44a728d5a46878f54de7b695321a38559c") token, err := ioutil.ReadFile("/etc/secrets/srht-token") if err != nil { log.Fatalln("[ERROR] sourcehot token could not be read") } + updates, err := parseRefUpdates() + if err != nil { + log.Fatalln("[ERROR] could not parse updated refs:", err) + } + + log.Printf("triggering builds for %v refs", len(updates)) + + for _, update := range updates { + triggerBuild(string(token), update.name, update.new) + } } -- cgit 1.4.1