Home

gitpecker @main - refs - log -
-
https://git.jolheiser.com/gitpecker.git
Woodpecker addon for generic git forge and OIDC
gitpecker / main.go
- raw -
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
package main

import (
	"fmt"
	"log/slog"
	"os"
	"strings"

	"go.woodpecker-ci.org/woodpecker/v3/server/forge/addon"
)

type config struct {
	// Woodpecker
	repoDir string
	url     string

	// OIDC
	clientID         string
	clientSecret     string
	clientSecretFile string
	clientProvider   string
	clientRedirect   string

	// Misc
	logFilePath string
	logJSON     bool
}

func main() {
	cfg := &config{
		repoDir:          mustEnv("repos"),
		url:              mustEnv("url"),
		clientID:         mustEnv("client_id"),
		clientSecret:     env("client_secret"),
		clientSecretFile: env("client_secret_file"),
		clientProvider:   mustEnv("provider"),
		clientRedirect:   mustEnv("redirect"),
		logFilePath:      env("log_file"),
		logJSON:          env("log_json") == "1",
	}

	if cfg.clientSecretFile != "" {
		content, err := os.ReadFile(cfg.clientSecretFile)
		if err != nil {
			panic(err)
		}
		cfg.clientSecret = strings.TrimSpace(string(content))
	}
	if cfg.clientSecret == "" {
		panic("client secret is required")
	}

	logLevel := slog.LevelInfo
	switch env("log_level") {
	case "debug":
		logLevel = slog.LevelDebug
	case "warn", "warning":
		logLevel = slog.LevelWarn
	case "error":
		logLevel = slog.LevelError
	}

	logOutput := os.Stderr
	if cfg.logFilePath != "" {
		fi, err := os.Create(cfg.logFilePath)
		if err != nil {
			panic(err)
		}
		defer fi.Close()
		logOutput = fi
	}

	logOpts := &slog.HandlerOptions{Level: logLevel}
	var logger slog.Handler
	if cfg.logJSON {
		logger = slog.NewJSONHandler(logOutput, logOpts)
	} else {
		logger = slog.NewTextHandler(logOutput, logOpts)
	}
	slog.SetDefault(slog.New(logger))

	defer func() {
		if r := recover(); r != nil {
			slog.Info("addon forge panic", slog.Any("message", r))
		}
	}()
	addon.Serve(cfg)
	slog.Debug("bye bye")
}

func env(stem string) string {
	name := fmt.Sprintf("GITPECKER_%s", strings.ToUpper(stem))
	return os.Getenv(name)
}

func mustEnv(stem string) string {
	name := fmt.Sprintf("GITPECKER_%s", strings.ToUpper(stem))
	val, ok := os.LookupEnv(name)
	if !ok {
		panic(fmt.Sprintf("%q is a required environment variable", name))
	}
	return val
}