Pull-based GitOps-style Docker Compose deployer: polls a (private) Git repo, detects changed stacks and reconciles only the affected
at main 30 lines 602 B view raw
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}