@@ -3,54 +3,75 @@ package main
3
3
import (
4
4
"flag"
5
5
"os"
6
- "strconv"
6
+ "os/signal"
7
+ "syscall"
7
8
8
- "github.com/ankorstore/gh-action-mq-lease-service/internal/config"
9
- "github.com/ankorstore/gh-action-mq-lease-service/internal/lease"
10
9
"github.com/ankorstore/gh-action-mq-lease-service/internal/server"
11
10
"github.com/ankorstore/gh-action-mq-lease-service/internal/version"
12
11
"github.com/ankorstore/gh-action-mq-lease-service/pkg/util/logger"
13
- "github.com/gofiber/fiber/v2"
14
12
)
15
13
16
14
var (
17
- serverPort uint
18
- configPath string
15
+ serverPort uint
16
+ configPath string
17
+ logDebug bool
18
+ logJSON bool
19
+ persistentStateDir string
19
20
)
20
21
21
22
func init () {
23
+ // General flags
22
24
flag .UintVar (& serverPort , "port" , 9000 , "server listening port" )
23
25
flag .StringVar (& configPath , "config" , "./config.yaml" , "Configuration path" )
24
26
25
- // Register logging flags
26
- logger .InitFlags ()
27
+ // Logging flags
28
+ flag .BoolVar (& logDebug , "log-debug" , false , "Enable debug logging" )
29
+ flag .BoolVar (& logJSON , "log-json" , true , "Enable console logging format" )
30
+
31
+ // Persistent state flags
32
+ flag .StringVar (& persistentStateDir , "persistents-state-dir" , "/tmp/state" , "Setup the directory for persistent state storage" )
27
33
}
28
34
29
35
func main () {
30
36
flag .Parse ()
31
37
32
38
// Logger
33
- log := logger .New (version.Version {})
39
+ log := logger .New (logger.NewOpts {
40
+ AppInfo : version.Version {},
41
+ Debug : logDebug ,
42
+ JSON : logJSON ,
43
+ })
34
44
35
- // Config
36
- cfg , err := config .LoadServerConfig (configPath )
37
- if err != nil {
38
- log .Error ().Msg ("Failed loading configuration" )
39
- os .Exit (1 )
45
+ // Main server
46
+ s := server .New (server.NewOpts {
47
+ Port : int (serverPort ),
48
+ Logger : & log ,
49
+ ConfigPath : configPath ,
50
+ PersistentStateDir : persistentStateDir ,
51
+ })
52
+ if err := s .Init (); err != nil {
53
+ log .Panic ().Err (err ).Msg ("Failed initializing the server" )
40
54
}
41
55
42
- // Lease provider orchestrator (handling all repos merge queue leases)
43
- orchestrator := lease .NewProviderOrchestrator (cfg .Repositories )
56
+ // Signal handling (SIGTERM) to be able to gracefully shut down the server (both fiber + other resources,
57
+ // like the storage for ex).
58
+ c := make (chan os.Signal , 1 )
59
+ signal .Notify (c , os .Interrupt , syscall .SIGTERM )
44
60
45
- // Fiber app
46
- app := fiber .New (fiber.Config {DisableStartupMessage : true })
47
- app .Use (logger .FiberMiddleware (log ))
48
- server .RegisterRoutes (app , orchestrator )
61
+ globShutdown := make (chan struct {}, 1 )
49
62
50
- log .Info ().Msg ("Bootstrap completed, starting..." )
63
+ go func () {
64
+ <- c
65
+ log .Warn ().Msg ("SIGTERM received" )
66
+ if err := s .Shutdown (); err != nil {
67
+ log .Error ().Err (err ).Msg ("Could not shutdown server gracefully" )
68
+ }
69
+ globShutdown <- struct {}{}
70
+ }()
51
71
52
- if err := app .Listen (":" + strconv .Itoa (int (serverPort ))); err != nil {
53
- log .Err (err ).Msg ("Fiber server failed" )
54
- defer os .Exit (1 )
72
+ if err := s .Start (); err != nil {
73
+ log .Panic ().Err (err ).Msg ("Server error" )
55
74
}
75
+
76
+ <- globShutdown
56
77
}
0 commit comments