23c3043d341fe6fb609ca60ef60406a14eee402d

Author
TheEdgeOfRage <git@theedgeofrage.com>
Committer
TheEdgeOfRage <git@theedgeofrage.com>
Date

Message

Add logging

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+	}()