23c3043d341fe6fb609ca60ef60406a14eee402d
- Author
- TheEdgeOfRage <git@theedgeofrage.com>
- Committer
- TheEdgeOfRage <git@theedgeofrage.com>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/main.go b/main.go
2index 79f59a656d5a5f410f372c4dc120e2bcd40f1f77..f670878f0ac565f7acab4788487cc491cdb4dabb 100644
3--- a/main.go
4+++ b/main.go
5@@ -7,7 +7,7 @@ import (
6 "errors"
7 "fmt"
8 "io"
9- "log"
10+ "log/slog"
11 "net/http"
12 "os"
13 "os/exec"
14@@ -31,16 +31,23 @@ type buildRequest struct {
15 }
16
17 func main() {
18+ slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, nil)))
19+
20 config, err := loadConfig()
21 if err != nil {
22- log.Fatal(err)
23+ slog.Error("load configuration", "error", err)
24+ os.Exit(1)
25 }
26
27 jobs := make(chan buildRequest, 100)
28 go runWorker(config, jobs)
29
30 http.HandleFunc("POST /build", buildHandler(config, jobs))
31- log.Fatal(http.ListenAndServe(":8080", nil))
32+ slog.Info("worker started", "address", ":8080", "registry", config.registry, "buildkit_address", config.buildkitAddress)
33+ if err := http.ListenAndServe(":8080", nil); err != nil {
34+ slog.Error("serve HTTP", "error", err)
35+ os.Exit(1)
36+ }
37 }
38
39 func loadConfig() (config, error) {
40@@ -101,29 +108,38 @@ func buildHandler(config config, jobs chan<- buildRequest) http.HandlerFunc {
41 []byte(request.Header.Get("Authorization")),
42 append([]byte("Bearer "), config.token...),
43 ) != 1 {
44+ slog.Warn("build request rejected", "reason", "unauthorized", "remote_address", request.RemoteAddr)
45 http.Error(writer, "unauthorized", http.StatusUnauthorized)
46 return
47 }
48
49 request.Body = http.MaxBytesReader(writer, request.Body, maxRequestBodySize)
50- defer request.Body.Close()
51+ defer func() {
52+ if err := request.Body.Close(); err != nil {
53+ slog.Warn("close build request", "error", err)
54+ }
55+ }()
56
57 var buildRequest buildRequest
58 decoder := json.NewDecoder(request.Body)
59 decoder.DisallowUnknownFields()
60 if err := decoder.Decode(&buildRequest); err != nil || !validBuildRequest(buildRequest) {
61+ slog.Warn("build request rejected", "reason", "invalid request", "remote_address", request.RemoteAddr)
62 http.Error(writer, "invalid build request", http.StatusBadRequest)
63 return
64 }
65 if err := ensureSingleJSONValue(decoder); err != nil {
66+ slog.Warn("build request rejected", "reason", "invalid request", "remote_address", request.RemoteAddr)
67 http.Error(writer, "invalid build request", http.StatusBadRequest)
68 return
69 }
70
71 select {
72 case jobs <- buildRequest:
73+ slog.Info("build queued", "repository", buildRequest.Repository, "sha", buildRequest.SHA)
74 writer.WriteHeader(http.StatusAccepted)
75 default:
76+ slog.Warn("build request rejected", "reason", "queue full", "repository", buildRequest.Repository, "sha", buildRequest.SHA)
77 http.Error(writer, "build queue is full", http.StatusServiceUnavailable)
78 }
79 }
80@@ -143,9 +159,13 @@ func ensureSingleJSONValue(decoder *json.Decoder) error {
81
82 func runWorker(config config, jobs <-chan buildRequest) {
83 for request := range jobs {
84+ image := config.registry + "/" + request.Repository
85+ slog.Info("build started", "repository", request.Repository, "sha", request.SHA, "image", image)
86 if err := build(context.Background(), config, request); err != nil {
87- log.Printf("build %s at %s failed: %v", request.Repository, request.SHA, err)
88+ slog.Error("build failed", "repository", request.Repository, "sha", request.SHA, "image", image, "error", err)
89+ continue
90 }
91+ slog.Info("build completed", "repository", request.Repository, "sha", request.SHA, "image", image)
92 }
93 }
94
95@@ -159,7 +179,11 @@ func build(ctx context.Context, config config, request buildRequest) error {
96 if err != nil {
97 return fmt.Errorf("create build context: %w", err)
98 }
99- defer os.RemoveAll(contextPath)
100+ defer func() {
101+ if err := os.RemoveAll(contextPath); err != nil {
102+ slog.Warn("remove build context", "path", contextPath, "error", err)
103+ }
104+ }()