package main import ( "fmt" "log" "os" "os/exec" "filelistener/cfg" "github.com/fsnotify/fsnotify" ) func main() { isProd := os.Getenv("ENV") == "prod" config := cfg.NewConfig(isProd) // Create new watcher. watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } defer watcher.Close() // Start listening for events. go func() { for { select { case event, ok := <-watcher.Events: if !ok { log.Printf("<-watcher.Events: %s\n", err) return } if !event.Has(fsnotify.Write) { log.Printf("is not Write: %s\n", event.Name) continue } if err := deploy(config.ScriptBinaryPath, config.WebhookScriptPath); err != nil { log.Printf("deploy: %s\n", err) continue } case err, ok := <-watcher.Errors: if !ok { return } log.Printf("<-watcher.Errors: %s\n", err) } } }() // Add a path. err = watcher.Add(config.FileToWatchPath) if err != nil { log.Fatal(err) } // Block main goroutine forever. <-make(chan struct{}) } func deploy(binaryPath, scriptPath string) error { err := execute(binaryPath, scriptPath) if err != nil { return fmt.Errorf("execute: %s", err) } log.Println("deploy done") return nil } func execute(binaryPath, scriptPath string) error { cmd := exec.Command(binaryPath, scriptPath) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return fmt.Errorf("cmd.Run %s", err) } return nil }