Compare commits

...

5 Commits

Author SHA1 Message Date
rmanach
c22d505aed fix only swarm deployer setting 2025-10-29 09:26:47 +01:00
rmanach
cff1c96394 fix package name 2025-10-29 09:03:38 +01:00
rmanach
9918c0c363 rework hm netinfo map model 2025-10-28 22:11:31 +01:00
rmanach
c7dc3d4402 fix table bottom 2025-10-28 21:52:39 +01:00
rmanach
999e80ae2f fix missing tag parse 2025-10-28 21:43:18 +01:00
11 changed files with 50 additions and 93 deletions

View File

@ -3,10 +3,10 @@ BIN_INSTALL = $(shell whereis $(BIN_NAME) | cut -d ' ' -f2)
VERSION = 0.1.1 VERSION = 0.1.1
run: lint run: check
@go run main.go @go run main.go
build: lint build: check
@echo "building binary..." @echo "building binary..."
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.Version=$(VERSION)" -o $(BIN_NAME) main.go && echo "$(BIN_NAME) v$(VERSION) built" @CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.Version=$(VERSION)" -o $(BIN_NAME) main.go && echo "$(BIN_NAME) v$(VERSION) built"
@ -16,7 +16,7 @@ install: build
@echo "program installed: $(GOPATH)/bin/hmdeploy" @echo "program installed: $(GOPATH)/bin/hmdeploy"
@$(GOPATH)/bin/hmdeploy --version @$(GOPATH)/bin/hmdeploy --version
lint: check:
@echo "format and lint..." @echo "format and lint..."
@golangci-lint fmt ./... @golangci-lint fmt ./...
@golangci-lint run ./... @golangci-lint run ./...

View File

@ -38,14 +38,6 @@ It has a nice logging and clean all the ressources (succeed or failed).
* Create a file inside named: `map.json`. This file will contain all network informations of your instances. * Create a file inside named: `map.json`. This file will contain all network informations of your instances.
```json ```json
{ {
"ip": "<proxmox-ip>",
"web_url": "https://<proxmox-ip>:8006",
"ssh": {
"user": "<ssh-user>",
"privkey": "<path-to-ssh-private-key>",
"port": <proxmox-ssh-port>
},
"vm": {
"swarm": { "swarm": {
"ip": "<swarm-ip>", "ip": "<swarm-ip>",
"ssh": { "ssh": {
@ -53,9 +45,7 @@ It has a nice logging and clean all the ressources (succeed or failed).
"privkey": "<path-to-ssh-private-key>", "privkey": "<path-to-ssh-private-key>",
"port": <swarm-ssh-port> "port": <swarm-ssh-port>
} }
}
}, },
"lxc": {
"nginx": { "nginx": {
"ip": "<nginx-ip>", "ip": "<nginx-ip>",
"web_url": "https://<nginx-ip>", "web_url": "https://<nginx-ip>",
@ -66,23 +56,9 @@ It has a nice logging and clean all the ressources (succeed or failed).
} }
} }
} }
}
``` ```
Below an example of a configuration. Of course you must ensure that the user public key has been deployed on the `<ssh-user>` server. Below an example of a configuration. Of course you must ensure that the user public key has been deployed on the `<ssh-user>` server.
You may notice the configuration has two distincts keys: **vm** and **lxc**. And, obviously, it refers to a virtual machine and a linux container.
For convience, **Docker Swarm** is installed on a **vm** to ensure a strong isolated environment. If you decided for an LXC, you have to update this section of the code and rebuild the binary:
```go
func (hm *HMMap) GetSwarmNetInfo() *HMNetInfo {
data, ok := hm.VM["swarm"] // update to hm.LXC["swarm]
if !ok {
return nil
}
return data
}
```
* In your project root directory, create a `.homeserver` directory with a configuration file: `hmdeploy.json`: * In your project root directory, create a `.homeserver` directory with a configuration file: `hmdeploy.json`:
```json ```json
{ {
@ -111,7 +87,7 @@ If you have a Docker registry with the target image available, you can thus leav
* Clone the repository * Clone the repository
```bash ```bash
git clone https://gitea.thegux.fr/rmanach/hmdeploy git clone https://gitea.sonak.fr/rmanach/hmdeploy
``` ```
* Install the binary * Install the binary
```bash ```bash
@ -124,7 +100,7 @@ The binary is then installed in your **$GOPATH/bin**.
hmdeploy --help hmdeploy --help
Usage of hmdeploy: Usage of hmdeploy:
-config string -config string
define the configuration directory (default "/home/romain/.homeserver") define the configuration directory (default "/home/<user>/.homeserver")
-confirm -confirm
do not ask for confirmation, you're the best, you don't need confirmation do not ask for confirmation, you're the best, you don't need confirmation
-debug -debug

View File

@ -9,8 +9,8 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"gitea.thegux.fr/hmdeploy/connection" "gitea.sonak.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/models" "gitea.sonak.fr/hmdeploy/models"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -5,8 +5,8 @@ import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"gitea.thegux.fr/hmdeploy/models" "gitea.sonak.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/utils" "gitea.sonak.fr/hmdeploy/utils"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -7,10 +7,10 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"gitea.thegux.fr/hmdeploy/connection" "gitea.sonak.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/docker" "gitea.sonak.fr/hmdeploy/docker"
"gitea.thegux.fr/hmdeploy/models" "gitea.sonak.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/utils" "gitea.sonak.fr/hmdeploy/utils"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -11,8 +11,8 @@ import (
"sync" "sync"
"time" "time"
"gitea.thegux.fr/hmdeploy/connection" "gitea.sonak.fr/hmdeploy/connection"
"gitea.thegux.fr/hmdeploy/models" "gitea.sonak.fr/hmdeploy/models"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -188,6 +188,11 @@ func (s *Service) UnmarshalJSON(data []byte) error {
imageName = imageNameParts[0] imageName = imageNameParts[0]
} }
tag := "..."
if len(imageNameParts) > 1 {
tag = imageNameParts[1]
}
appName := ci.Details[0].Spec.Labels.Namespace appName := ci.Details[0].Spec.Labels.Namespace
*s = Service{ *s = Service{
@ -199,7 +204,7 @@ func (s *Service) UnmarshalJSON(data []byte) error {
Tag string Tag string
}{ }{
Name: imageName, Name: imageName,
Tag: imageNameParts[1], Tag: tag,
}, },
Networks: networks, Networks: networks,
Ports: ci.Details[0].Endpoint.Ports, Ports: ci.Details[0].Endpoint.Ports,

2
go.mod
View File

@ -1,4 +1,4 @@
module gitea.thegux.fr/hmdeploy module gitea.sonak.fr/hmdeploy
go 1.23.0 go 1.23.0

20
main.go
View File

@ -13,11 +13,11 @@ import (
"strings" "strings"
"sync" "sync"
"gitea.thegux.fr/hmdeploy/deployers" "gitea.sonak.fr/hmdeploy/deployers"
"gitea.thegux.fr/hmdeploy/docker" "gitea.sonak.fr/hmdeploy/docker"
"gitea.thegux.fr/hmdeploy/models" "gitea.sonak.fr/hmdeploy/models"
"gitea.thegux.fr/hmdeploy/scheduler" "gitea.sonak.fr/hmdeploy/scheduler"
"gitea.thegux.fr/hmdeploy/utils" "gitea.sonak.fr/hmdeploy/utils"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
@ -108,8 +108,8 @@ func (d *Deployers) generateDeployTasks() scheduler.Tasks {
// only swarm deployer // only swarm deployer
if d.sd != nil && d.nd == nil { if d.sd != nil && d.nd == nil {
rootTask := scheduler.NewTask("swarm-build", d.nd.Build) rootTask := scheduler.NewTask("swarm-build", d.sd.Build)
rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.nd.Deploy)) rootTask.AddNext(scheduler.NewTask("swarm-deploy", d.sd.Deploy))
tasks = append(tasks, rootTask) tasks = append(tasks, rootTask)
return tasks return tasks
@ -293,7 +293,7 @@ func initDeployers(
} }
if !opt.noSwarm && project.GetComposePath() != "" { if !opt.noSwarm && project.GetComposePath() != "" {
swarmNet := hmmap.GetSwarmNetInfo() swarmNet := hmmap.Swarm
if swarmNet == nil { if swarmNet == nil {
return deps, fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound) return deps, fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound)
} }
@ -307,7 +307,7 @@ func initDeployers(
} }
if !opt.noNginx && project.GetNginxConfPath() != "" { if !opt.noNginx && project.GetNginxConfPath() != "" {
nginxNet := hmmap.GetNginxNetInfo() nginxNet := hmmap.Nginx
if nginxNet == nil { if nginxNet == nil {
return deps, fmt.Errorf("%w, nginx net info does not exist", ErrNetInfoNotFound) return deps, fmt.Errorf("%w, nginx net info does not exist", ErrNetInfoNotFound)
} }
@ -332,7 +332,7 @@ func initDeployers(
//nolint:funlen,mnd // TODO(rmanach): could be splitted //nolint:funlen,mnd // TODO(rmanach): could be splitted
func getSwarmServicesDetails(hm *models.HMMap) error { func getSwarmServicesDetails(hm *models.HMMap) error {
swarmNet := hm.GetSwarmNetInfo() swarmNet := hm.Swarm
if swarmNet == nil { if swarmNet == nil {
return fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound) return fmt.Errorf("%w, swarm net info does not exist", ErrNetInfoNotFound)
} }

View File

@ -14,32 +14,8 @@ type HMNetInfo struct {
} `json:"ssh,omitempty"` } `json:"ssh,omitempty"`
} }
type (
HMVM map[string]*HMNetInfo
HMLXC map[string]*HMNetInfo
)
// HMMap handles all the informations of your home server instances. // HMMap handles all the informations of your home server instances.
type HMMap struct { type HMMap struct {
*HMNetInfo Nginx *HMNetInfo `json:"nginx,omitempty"`
VM HMVM `json:"vm,omitempty"` Swarm *HMNetInfo `json:"swarm,omitempty"`
LXC HMLXC `json:"lxc,omitempty"`
}
func (hm *HMMap) GetSwarmNetInfo() *HMNetInfo {
data, ok := hm.VM["swarm"]
if !ok {
return nil
}
return data
}
func (hm *HMMap) GetNginxNetInfo() *HMNetInfo {
data, ok := hm.LXC["nginx"]
if !ok {
return nil
}
return data
} }

View File

@ -339,7 +339,7 @@ func (t *Table) Render() {
) )
} }
if idx+1 < len(t.rows) { if idx < len(t.rows) {
if t.rows[idx].next != nil { if t.rows[idx].next != nil {
table = append(table, strings.Join(lineParts, t.colSeparator)) table = append(table, strings.Join(lineParts, t.colSeparator))
} else { } else {