130 lines
3.3 KiB
Go
130 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"flag"
|
|
"os"
|
|
"os/signal"
|
|
"path"
|
|
|
|
"gitea.thegux.fr/hmdeploy/deployers"
|
|
"gitea.thegux.fr/hmdeploy/docker"
|
|
"gitea.thegux.fr/hmdeploy/models"
|
|
"gitea.thegux.fr/hmdeploy/scheduler"
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
const (
|
|
HMDeployDirname string = ".homeserver"
|
|
NetworkFilename string = "map.json"
|
|
|
|
SchedulerNbWorkers uint8 = 4
|
|
SchedulerQueueCapacity uint32 = 30
|
|
)
|
|
|
|
var HOME_PATH = os.Getenv("HOME")
|
|
|
|
func initLogger() {
|
|
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
|
|
log.Logger = log.With().Caller().Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr})
|
|
}
|
|
|
|
func main() { //nolint: funlen // TODO: to rework
|
|
ctx, _ := signal.NotifyContext(
|
|
context.Background(),
|
|
os.Interrupt,
|
|
os.Kill,
|
|
)
|
|
|
|
initLogger()
|
|
log.Info().Msg("hmdeploy started")
|
|
|
|
projectDir := flag.String("path", ".", "define the .homeserver project root dir")
|
|
flag.Parse()
|
|
|
|
hmmap_path := path.Join(HOME_PATH, HMDeployDirname, NetworkFilename)
|
|
c, err := os.ReadFile(hmmap_path)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Str("conf", hmmap_path).Msg("unable to load configuration")
|
|
}
|
|
|
|
var hmmap models.HMMap
|
|
if err := json.Unmarshal(c, &hmmap); err != nil {
|
|
log.Fatal().Err(err).Str("conf", hmmap_path).Msg("unable to parse configuration")
|
|
}
|
|
log.Info().Str("conf", hmmap_path).Msg("hmmap load successfully")
|
|
|
|
project, err := models.ProjectFromDir(*projectDir)
|
|
if err != nil {
|
|
log.Fatal().Str("dir", *projectDir).Err(err).Msg("unable to init project from directory")
|
|
}
|
|
log.Info().
|
|
Str("dir", project.Dir).
|
|
Str("name", project.Name).
|
|
Msg("project initialized with success")
|
|
|
|
swarmNet := hmmap.GetSwarmNetInfo()
|
|
if swarmNet == nil {
|
|
log.Fatal().Err(err).Msg("unable to get swarm net info, does not exist")
|
|
}
|
|
dcli := docker.NewClient()
|
|
|
|
sd, err := deployers.NewSwarmDeployer(ctx, &dcli, swarmNet, &project)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("unable to init swarm deployer")
|
|
}
|
|
|
|
var nd *deployers.NginxDeployer
|
|
if project.Deps.NginxFile != "" {
|
|
nginxNet := hmmap.GetNginxNetInfo()
|
|
if nginxNet == nil {
|
|
log.Err(err).Msg("unable to get nginx net info, does not exist")
|
|
return
|
|
}
|
|
|
|
d, err := deployers.NewNginxDeployer(ctx, nginxNet, &project)
|
|
if err != nil {
|
|
log.Err(err).Msg("unable to nginx conf")
|
|
return
|
|
}
|
|
|
|
nd = d
|
|
}
|
|
|
|
var deploySwarm *scheduler.Task
|
|
if nd != nil {
|
|
deployNginx := scheduler.NewTask("nginx-deploy", nd.Deploy)
|
|
deploySwarm = scheduler.NewTask("swarm-deploy", sd.Deploy, deployNginx)
|
|
} else {
|
|
deploySwarm = scheduler.NewTask("swarm-deploy", sd.Deploy)
|
|
}
|
|
|
|
s := scheduler.NewScheduler(
|
|
context.Background(),
|
|
SchedulerQueueCapacity,
|
|
SchedulerNbWorkers,
|
|
)
|
|
s.Submit(scheduler.NewTask("swarm-build", sd.Build, deploySwarm)) //nolint: errcheck // TODO
|
|
if nd != nil {
|
|
s.Submit(scheduler.NewTask("nginx-build", nd.Build)) //nolint: errcheck // TODO
|
|
}
|
|
|
|
<-sd.Done()
|
|
<-nd.Done()
|
|
|
|
s.Submit(scheduler.NewTask("nginx-clear", nd.Clear)) //nolint: errcheck // TODO
|
|
s.Submit(scheduler.NewTask("swarm-clear", sd.Clear)) //nolint: errcheck // TODO
|
|
|
|
s.Stop()
|
|
<-s.Done()
|
|
|
|
if sd.Error() != nil || nd.Error() != nil {
|
|
log.Error().Str("name", project.Name).Msg("unable to deploy project, see logs for details")
|
|
return
|
|
}
|
|
|
|
log.Info().Str("name", project.Name).Msg("project deployed successfully")
|
|
}
|