hmdeploy/main.go
2025-04-03 12:03:46 +02:00

108 lines
2.7 KiB
Go

package main
import (
"context"
"encoding/json"
"flag"
"os"
"os/signal"
"path"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gitea.thegux.fr/hmdeploy/deployers"
"gitea.thegux.fr/hmdeploy/docker"
"gitea.thegux.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/scheduler"
)
const HMDEPLOY_DIRNAME = ".homeserver"
const NETWORK_FILENAME = "map.json"
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() {
ctx, stop := signal.NotifyContext(
context.Background(),
os.Interrupt,
os.Kill,
)
defer stop()
initLogger()
log.Info().Msg("hmdeploy started")
projectDir := flag.String("path", ".", "define the .homeserver project root dir")
flag.Parse()
hmmap_path := path.Join(HOME_PATH, HMDEPLOY_DIRNAME, NETWORK_FILENAME)
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(&dcli, swarmNet, &project)
if err != nil {
log.Fatal().Err(err).Msg("unable to init swarm deployer")
}
var nd deployers.IDeployer
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(nginxNet, &project)
if err != nil {
log.Err(err).Msg("unable to nginx conf")
return
}
nd = &d
}
deployNginx := scheduler.NewTask("nginx-deploy", nd.Deploy)
deploySwarm := scheduler.NewTask("swarm-deploy", sd.Deploy, deployNginx)
s := scheduler.NewScheduler(ctx, 30, 4)
s.Submit(scheduler.NewTask("swarm-build", sd.Build, deploySwarm))
s.Submit(scheduler.NewTask("nginx-build", nd.Build))
<-nd.Done()
<-sd.Done()
s.Submit(scheduler.NewTask("nginx-clear", nd.Clear))
s.Submit(scheduler.NewTask("swarm-clear", sd.Clear))
s.Stop()
<-s.Done()
log.Info().Str("name", project.Name).Msg("project deployed successfully")
}