Skip to content

Commit 9fb9431

Browse files
Swopxvzf
authored andcommitted
feat: add yaml config file for server
1 parent 2f2f0a9 commit 9fb9431

File tree

8 files changed

+214
-12
lines changed

8 files changed

+214
-12
lines changed

Makefile

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
DEBUG ?= false
2+
LEASE_SERVICE_PORT ?= 9000
3+
4+
GOOS := $(shell go env GOOS)
5+
GOARCH := $(shell go env GOARCH)
16

27
default: clean lint test build
38

@@ -13,9 +18,11 @@ clean: ## cleanup test cover output
1318
rm -rf cover.out
1419

1520
test: ## run unit tests
16-
go test -race -cover $(shell go list ./...)
21+
go test -race -cover ./...
1722

1823
.PHONY: build
24+
build: ## build the application (server & cli)
25+
goreleaser build --snapshot --clean --single-target
1926

20-
build:
21-
goreleaser build --snapshot --rm-dist --single-target
27+
run-server: build ## run the server with an example config
28+
./dist/server_${GOOS}_${GOARCH}/server -config=hack/example-server-config.yaml -log-json=false -log-debug=$(DEBUG) -port=$(LEASE_SERVICE_PORT)

cmd/server/main.go

+27-5
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,43 @@
11
package main
22

33
import (
4+
"flag"
5+
"os"
6+
"strconv"
7+
8+
"github.com/ankorstore/gh-action-mq-lease-service/internal/config"
49
"github.com/ankorstore/gh-action-mq-lease-service/internal/lease"
510
"github.com/ankorstore/gh-action-mq-lease-service/internal/server/handlers"
611
"github.com/ankorstore/gh-action-mq-lease-service/internal/version"
712
"github.com/ankorstore/gh-action-mq-lease-service/pkg/util/logger"
813
"github.com/gofiber/fiber/v2"
914
)
1015

11-
const (
12-
LISTEN = ":9999"
16+
var (
17+
serverPort uint
18+
configPath string
1319
)
1420

21+
func init() {
22+
flag.UintVar(&serverPort, "port", 9000, "server listening port")
23+
flag.StringVar(&configPath, "config", "./config.yaml", "Configuration path")
24+
25+
// Register logging flags
26+
logger.InitFlags()
27+
}
28+
1529
func main() {
30+
flag.Parse()
1631

32+
// Logger
1733
log := logger.New(version.Version{})
18-
app := fiber.New()
19-
app.Use(logger.FiberMiddleware(log))
34+
35+
// Config
36+
cfg, err := config.LoadServerConfig(configPath)
37+
if err != nil {
38+
log.Error().Msg("Failed loading configuration")
39+
os.Exit(1)
40+
}
2041

2142
orchestrator := lease.NewLeaseProviderOrchestrator()
2243

@@ -25,7 +46,8 @@ func main() {
2546

2647
app.Get("/:owner/:repo/:baseRef", handlers.ProviderDetails(orchestrator))
2748

28-
if err := app.Listen(LISTEN); err != nil {
49+
if err := app.Listen(":" + strconv.Itoa(int(serverPort))); err != nil {
2950
log.Err(err).Msg("Fiber server failed")
51+
defer os.Exit(1)
3052
}
3153
}

go.mod

+10-2
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,29 @@ module github.com/ankorstore/gh-action-mq-lease-service
33
go 1.19
44

55
require (
6+
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46
7+
github.com/go-playground/validator/v10 v10.11.2
68
github.com/gofiber/fiber/v2 v2.42.0
9+
github.com/google/go-cmp v0.5.9
710
github.com/google/go-github/v50 v50.0.0
811
github.com/rs/zerolog v1.29.0
912
github.com/stretchr/testify v1.8.1
1013
golang.org/x/oauth2 v0.5.0
14+
gopkg.in/yaml.v3 v3.0.1
1115
k8s.io/utils v0.0.0-20230209194617-a36077c30491
1216
)
1317

1418
require (
1519
github.com/andybalholm/brotli v1.0.4 // indirect
1620
github.com/davecgh/go-spew v1.1.1 // indirect
21+
github.com/go-playground/locales v0.14.1 // indirect
22+
github.com/go-playground/universal-translator v0.18.1 // indirect
1723
github.com/golang/protobuf v1.5.2 // indirect
1824
github.com/google/go-querystring v1.1.0 // indirect
1925
github.com/google/uuid v1.3.0 // indirect
2026
github.com/klauspost/compress v1.15.9 // indirect
27+
github.com/kr/text v0.2.0 // indirect
28+
github.com/leodido/go-urn v1.2.1 // indirect
2129
github.com/mattn/go-colorable v0.1.13 // indirect
2230
github.com/mattn/go-isatty v0.0.17 // indirect
2331
github.com/mattn/go-runewidth v0.0.14 // indirect
@@ -30,10 +38,10 @@ require (
3038
github.com/valyala/bytebufferpool v1.0.0 // indirect
3139
github.com/valyala/fasthttp v1.44.0 // indirect
3240
github.com/valyala/tcplisten v1.0.0 // indirect
33-
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
41+
golang.org/x/crypto v0.5.0 // indirect
3442
golang.org/x/net v0.6.0 // indirect
3543
golang.org/x/sys v0.5.0 // indirect
44+
golang.org/x/text v0.7.0 // indirect
3645
google.golang.org/appengine v1.6.7 // indirect
3746
google.golang.org/protobuf v1.28.0 // indirect
38-
gopkg.in/yaml.v3 v3.0.1 // indirect
3947
)

go.sum

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
22
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
33
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
4+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
45
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
56
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
67
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0=
9+
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU=
10+
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
11+
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
12+
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
13+
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
14+
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
15+
github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
16+
github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
717
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
818
github.com/gofiber/fiber/v2 v2.42.0 h1:Fnp7ybWvS+sjNQsFvkhf4G8OhXswvB6Vee8hM/LyS+8=
919
github.com/gofiber/fiber/v2 v2.42.0/go.mod h1:3+SGNjqMh5VQH5Vz2Wdi43zTIV16ktlFd3x3R6O1Zlc=
1020
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
1121
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
1222
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
1323
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
24+
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
1425
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
1526
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
1627
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
28+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1729
github.com/google/go-github/v50 v50.0.0 h1:gdO1AeuSZZK4iYWwVbjni7zg8PIQhp7QfmPunr016Jk=
1830
github.com/google/go-github/v50 v50.0.0/go.mod h1:Ev4Tre8QoKiolvbpOSG3FIi4Mlon3S2Nt9W5JYqKiwA=
1931
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
@@ -22,6 +34,11 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
2234
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
2335
github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
2436
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
37+
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
38+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
39+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
40+
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
41+
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
2542
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
2643
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
2744
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
@@ -38,6 +55,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
3855
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3956
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
4057
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
58+
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
4159
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
4260
github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w=
4361
github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
@@ -48,6 +66,7 @@ github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJv
4866
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
4967
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
5068
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
69+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5170
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5271
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
5372
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
@@ -64,8 +83,9 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
6483
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
6584
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
6685
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
67-
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
6886
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
87+
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
88+
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
6989
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
7090
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7191
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
@@ -98,6 +118,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
98118
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
99119
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
100120
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
121+
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
122+
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
101123
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
102124
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
103125
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -111,8 +133,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
111133
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
112134
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
113135
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
114-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
115136
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
137+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
116138
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
117139
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
118140
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/config/load.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package config
2+
3+
import (
4+
"os"
5+
6+
"github.com/ankorstore/gh-action-mq-lease-service/internal/config/server/latest"
7+
"github.com/drone/envsubst/v2"
8+
"gopkg.in/yaml.v3"
9+
)
10+
11+
// LoadServerConfig opens the configuration file, performs environment substitution and parses it.
12+
// The environment substitution allows to e.g. include private information in form of
13+
// ${MY_GITHUB_PRIVATE_KEY} rather than hardcoding it on the configuration
14+
func LoadServerConfig(path string) (*latest.ServerConfig, error) {
15+
serverConfig := &latest.ServerConfig{}
16+
err := load(path, serverConfig)
17+
return serverConfig, err
18+
}
19+
20+
func load(path string, config interface{}) error {
21+
raw, err := os.ReadFile(path)
22+
if err != nil {
23+
return err
24+
}
25+
26+
templated, err := envsubst.EvalEnv(string(raw))
27+
if err != nil {
28+
return err
29+
}
30+
31+
if err := yaml.Unmarshal([]byte(templated), config); err != nil {
32+
return err
33+
}
34+
35+
return nil
36+
}

internal/config/load_test.go

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package config_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/ankorstore/gh-action-mq-lease-service/internal/config"
8+
"github.com/ankorstore/gh-action-mq-lease-service/internal/config/server/latest"
9+
"github.com/google/go-cmp/cmp"
10+
)
11+
12+
const (
13+
TestServerYaml = `repositories:
14+
- owner: test
15+
name: repo0
16+
base_ref: main
17+
stabilize_duration: 300
18+
expected_request_count: 4
19+
- owner: test
20+
name: repo1
21+
base_ref: develop
22+
stabilize_duration: 100
23+
expected_request_count: 5`
24+
)
25+
26+
func TestLoadServerConfig(t *testing.T) {
27+
var err error
28+
29+
expected := latest.ServerConfig{
30+
Repositories: []*latest.GithubRepositoryConfig{
31+
{
32+
Owner: "test",
33+
Name: "repo0",
34+
BaseRef: "main",
35+
StabilizeDuration: 300,
36+
ExpectedRequestCount: 4,
37+
},
38+
{
39+
Owner: "test",
40+
Name: "repo1",
41+
BaseRef: "develop",
42+
StabilizeDuration: 100,
43+
ExpectedRequestCount: 5,
44+
},
45+
},
46+
}
47+
48+
yamlFileName := prepareYamlFile(TestServerYaml)
49+
50+
// Load config
51+
got, err := config.LoadServerConfig(yamlFileName)
52+
if err != nil {
53+
t.Errorf("Could not load config, %v", err)
54+
}
55+
if cmp.Equal(got, expected) {
56+
t.Errorf(cmp.Diff(got, err))
57+
}
58+
59+
cleanup(yamlFileName)
60+
}
61+
62+
func prepareYamlFile(content string) string {
63+
// Set up our test file
64+
f, err := os.CreateTemp("/tmp", "gotest")
65+
if err != nil {
66+
panic(err)
67+
}
68+
yamlFileName := f.Name()
69+
_, err = f.WriteString(content)
70+
if err != nil {
71+
panic(err)
72+
}
73+
err = f.Close()
74+
if err != nil {
75+
panic(err)
76+
}
77+
78+
return yamlFileName
79+
}
80+
81+
func cleanup(path string) {
82+
_ = os.Remove(path)
83+
}
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package latest
2+
3+
import "github.com/rs/zerolog"
4+
5+
func (r GithubRepositoryConfig) MarshalZerologObject(e *zerolog.Event) {
6+
e.Str("gh_repo_owner", r.Owner).
7+
Str("gh_repo_name", r.Name).
8+
Str("gh_base_ref", r.BaseRef)
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package latest
2+
3+
// ServerConfig represents the current server configuration file.
4+
type ServerConfig struct {
5+
Repositories []*GithubRepositoryConfig `yaml:"repositories,omitempty"`
6+
}
7+
8+
// GithubRepositoryConfig defines how a repository should be handled
9+
type GithubRepositoryConfig struct {
10+
Owner string `yaml:"owner"`
11+
Name string `yaml:"name"`
12+
BaseRef string `yaml:"base_ref"`
13+
StabilizeDuration int `yaml:"stabilize_duration"`
14+
ExpectedRequestCount int `yaml:"expected_request_count"`
15+
}

0 commit comments

Comments
 (0)