Skip to content

Commit

Permalink
feat: support multi cron spec
Browse files Browse the repository at this point in the history
  • Loading branch information
ismdeep committed Apr 26, 2024
1 parent 0b4b4a4 commit ae9a66b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 26 deletions.
12 changes: 11 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,14 @@ module github.com/ismdeep/cron

go 1.20

require github.com/robfig/cron/v3 v3.0.1
require (
github.com/ismdeep/log v0.2.2
github.com/robfig/cron/v3 v3.0.1
go.uber.org/zap v1.24.0
)

require (
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
)
17 changes: 17 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/ismdeep/log v0.2.2 h1:19C/9qEmlVPMDpbIZMiM/0vU9LoqVt9ne4Xa5A2aOwU=
github.com/ismdeep/log v0.2.2/go.mod h1:Xg9zlKaE2X1jzxyMFoV87aFpLt21haxcXd35JVPj7gA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
62 changes: 37 additions & 25 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,49 @@
package main

import (
"context"
_ "embed"
"fmt"
"os"
"os/exec"
"strings"
"time"

"github.com/ismdeep/log"
"github.com/robfig/cron/v3"
"go.uber.org/zap"
)

//go:embed banner.txt
var banner string

var cronCommand string

func runCommandFunc() {
startedAt := time.Now()
log.WithContext(context.Background()).Info("Started")
defer func() {
endedAt := time.Now()
log.WithContext(context.Background()).Info("Ended", zap.String("time_elapsed", endedAt.Sub(startedAt).String()))
log.WithContext(context.Background()).Info("----------------------------------------------------------------------")
fmt.Println()
}()
cmdSlice := strings.Fields(cronCommand)
cmd := exec.Command(cmdSlice[0], cmdSlice[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.WithContext(context.Background()).Error("failed to run task", zap.Error(err))
return
}
log.WithContext(context.Background()).Info("Finished")
}

func main() {
fmt.Println(banner)

cronSpec := os.Getenv("CRON_SPEC")
cronCommand := os.Getenv("CRON_COMMAND")
cronCommand = os.Getenv("CRON_COMMAND")
cronRunAtStart := os.Getenv("CRON_RUN_AT_START")

if cronSpec == "" {
Expand All @@ -29,29 +54,7 @@ func main() {
panic("CRON_COMMAND is empty")
}

runCommandFunc := func() {
fmt.Println("----------------------------------------------------------------------")
startedAt := time.Now()
fmt.Println("Started At:", startedAt.Format(time.RFC1123Z))

defer func() {
endedAt := time.Now()
fmt.Println("Ended At:", endedAt.Format(time.RFC1123Z))
fmt.Println("Time Elapse:", fmt.Sprintf("%v s", endedAt.Unix()-startedAt.Unix()))
fmt.Println("----------------------------------------------------------------------")
fmt.Println()
}()

cmdSlice := strings.Fields(cronCommand)
cmd := exec.Command(cmdSlice[0], cmdSlice[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("Error:", err.Error())
return
}
fmt.Println("OK")
}
log.WithContext(context.Background()).Info("----------------------------------------------------------------------")

if cronRunAtStart == "true" {
runCommandFunc()
Expand All @@ -63,7 +66,16 @@ func main() {
cron.SkipIfStillRunning(
cron.DefaultLogger)),
)
_, _ = c.AddFunc(cronSpec, runCommandFunc)

for _, spec := range strings.Split(cronSpec, "\n") {
spec = strings.TrimSpace(spec)
if spec != "" {
log.WithContext(context.Background()).Info("Cron spec", zap.String("spec", spec))
if _, err := c.AddFunc(spec, runCommandFunc); err != nil {
panic(fmt.Errorf("failed to add cron spec '%s': %v", spec, err))
}
}
}

c.Run()
}

0 comments on commit ae9a66b

Please sign in to comment.