Skip to content

Commit

Permalink
added multithreading
Browse files Browse the repository at this point in the history
  • Loading branch information
m-adawi committed Jul 14, 2024
1 parent c3fcd76 commit 9efa54e
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 14 deletions.
8 changes: 7 additions & 1 deletion init.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"os"
"path"
"sync"

"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/flags"
Expand Down Expand Up @@ -55,17 +56,22 @@ func initRepos() (err error) {
}
}
repos[repoName] = repo
repoLocks[repoName] = &sync.Mutex{}
}

return nil
}

func initDockerCli() (err error) {
dockerCli, err = command.NewDockerCli()
// suppress command outputs (errors are returned as objects)
nullFile, _ := os.Open("/dev/null")
defer nullFile.Close()
dockerCli, err = command.NewDockerCli(command.WithOutputStream(nullFile), command.WithErrorStream(nullFile))
if err != nil {
return fmt.Errorf("could not create a docker cli object: %w", err)
}
err = dockerCli.Initialize(flags.NewClientOptions())

if err != nil {
return fmt.Errorf("could not initialize docker cli object: %w", err)
}
Expand Down
17 changes: 17 additions & 0 deletions log.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package main

import (
"log/slog"
"os"
)

var logger *slog.Logger

func init() {
logOptions := &slog.HandlerOptions{
Level: slog.LevelInfo,
}

logger = slog.New(slog.NewTextHandler(os.Stderr, logOptions))
}

40 changes: 27 additions & 13 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package main

import (
"fmt"
"log"
"path"
"sync"
"time"

"github.com/docker/cli/cli/command/stack"
Expand All @@ -12,19 +12,38 @@ import (
"github.com/go-git/go-git/v5/plumbing/transport/http"
)


var repoLocks map[string]*sync.Mutex = make(map[string]*sync.Mutex)

func main() {
logger.Info("starting SwarmCD")
for {
var waitGroup sync.WaitGroup
logger.Info("updating stacks...")
for stackName := range config.StackConfigs {
err := updateStack(stackName)
logIfError(err)
waitGroup.Add(1)
go updateStackThread(&waitGroup, stackName)
}
waitGroup.Wait()
logger.Info("waiting for the update interval")
time.Sleep(time.Duration(config.UpdateInterval) * time.Second)
}

}

func updateStackThread(waitGroup *sync.WaitGroup, stackName string) {
repoLock := repoLocks[config.StackConfigs[stackName].Repo]
repoLock.Lock()
defer repoLock.Unlock()
logger.Info(fmt.Sprintf("updating %s stack", stackName))
err := updateStack(stackName)
if err != nil{
logger.Error(err.Error())
} else {
logger.Info(fmt.Sprintf("done updating %s stack", stackName))
}
waitGroup.Done()
}

func updateStack(stackName string) (err error) {
err = pullChanges(stackName)
if err != nil && err != git.NoErrAlreadyUpToDate {
Expand All @@ -33,7 +52,7 @@ func updateStack(stackName string) (err error) {
stackConfig := config.StackConfigs[stackName]
cmd := stack.NewStackCommand(dockerCli)
cmd.SetArgs([]string{
"deploy", "-c",
"deploy", "--detach", "-c",
path.Join(config.ReposPath, stackConfig.Repo, stackConfig.ComposeFile),
stackName,
})
Expand All @@ -52,18 +71,20 @@ func pullChanges(stackName string) (err error) {
stackConfig := config.StackConfigs[stackName]
repoConfig := config.RepoConfigs[stackConfig.Repo]
branch := stackConfig.Branch
// repos[stackConfig.Repo].//Branch(branch)//.Fetch(&git.FetchOptions{})
workTree, err := repos[stackConfig.Repo].Worktree()
if err != nil {
return fmt.Errorf("could not get %s repo worktree: %w", stackConfig.Repo, err)
}
err = workTree.Checkout(&git.CheckoutOptions{
Branch: plumbing.NewBranchReferenceName(branch),
Branch: plumbing.ReferenceName("refs/remotes/origin/" + branch),
})
if err != nil {
return fmt.Errorf("could not checkout branch %s: %w", branch, err)
}
pullOptions := &git.PullOptions{
ReferenceName: plumbing.NewBranchReferenceName(branch),
RemoteName: "origin",
}
if repoConfig.Password != "" && repoConfig.Username != "" {
pullOptions.Auth = &http.BasicAuth{
Expand All @@ -77,10 +98,3 @@ func pullChanges(stackName string) (err error) {
}
return
}


func logIfError(err error) {
if err != nil {
log.Println(err)
}
}

0 comments on commit 9efa54e

Please sign in to comment.