Pull-based GitOps-style Docker Compose deployer: polls a (private) Git repo, detects changed stacks and reconciles only the affected
1package core
2
3import (
4 "errors"
5 "os"
6 "syscall"
7)
8
9func AcquireLock(lockPath string) (func() error, error) {
10 f, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0644)
11 if err != nil {
12 return nil, err
13 }
14
15 if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
16 _ = f.Close()
17 return nil, errors.New("another compose-sync is already running")
18 }
19
20 return func() error {
21 if err := syscall.Flock(int(f.Fd()), syscall.LOCK_UN); err != nil {
22 f.Close()
23 return err
24 }
25 if err := f.Close(); err != nil {
26 return err
27 }
28 return os.Remove(lockPath)
29 }, nil
30}