diff --git a/_templates/cloudflare/cron-go/.gitignore b/_templates/cloudflare/cron-go/.gitignore new file mode 100644 index 0000000..7fd93e1 --- /dev/null +++ b/_templates/cloudflare/cron-go/.gitignore @@ -0,0 +1,3 @@ +build +node_modules +.wrangler \ No newline at end of file diff --git a/_templates/cloudflare/cron-go/Makefile b/_templates/cloudflare/cron-go/Makefile new file mode 100644 index 0000000..7f0c8e8 --- /dev/null +++ b/_templates/cloudflare/cron-go/Makefile @@ -0,0 +1,12 @@ +.PHONY: dev +dev: + wrangler dev + +.PHONY: build +build: + go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1 -mode=go + GOOS=js GOARCH=wasm go build -o ./build/app.wasm . + +.PHONY: deploy +deploy: + wrangler deploy diff --git a/_templates/cloudflare/cron-go/README.md b/_templates/cloudflare/cron-go/README.md new file mode 100644 index 0000000..7ba8a1d --- /dev/null +++ b/_templates/cloudflare/cron-go/README.md @@ -0,0 +1,61 @@ +# cron-job-template-go + +- A template for starting a Cloudflare Worker project with a cron job using Go. +- This template uses the [workers](https://github.com/syumai/workers) package to schedule and run cron jobs. + +## Notice + +- A free plan Cloudflare Workers only accepts ~1MB sized workers. + - Go Wasm binaries easily exceed this limit, so _you'll need to use a paid plan of Cloudflare Workers_ (which accepts ~5MB sized workers). + - There's also a TinyGo version of this that can be found [here](https://github.com/syumai/workers/tree/main/_templates/cloudflare/cron-tinygo). + +## Usage + +- `main.go` includes a simple cron job implementation. Feel free to edit this code and implement your own cron job logic. + +## Requirements + +- Node.js +- [wrangler](https://developers.cloudflare.com/workers/wrangler/) + - Just run `npm install -g wrangler` +- Go 1.21.0 or later + +## Getting Started + +- If not already installed, please install the [gonew](https://pkg.go.dev/golang.org/x/tools/cmd/gonew) command. + +```console +go install golang.org/x/tools/cmd/gonew@latest +``` + +- Create a new project using this template. + - The second argument passed to `gonew` is the module path of your new app. + +```console +gonew github.com/syumai/workers/_templates/cloudflare/cron-go your.module/my-app # e.g. github.com/syumai/my-app +cd my-app +go mod tidy +make dev # start running dev server +``` + +- To change the worker name, please edit the `name` property in `wrangler.toml`. + +## Development + +### Commands + +```console +make dev # run dev server +make build # build Go Wasm binary +make deploy # deploy worker +``` + +### Testing the Dev Server + +- To test the cron job, you can simulate the cron event by sending an HTTP request to the dev server. + +```console +curl -X POST http://localhost:8787/cron +``` + +- You should see the scheduled time printed in the console. diff --git a/_templates/cloudflare/cron-go/go.mod b/_templates/cloudflare/cron-go/go.mod new file mode 100644 index 0000000..dcd90a3 --- /dev/null +++ b/_templates/cloudflare/cron-go/go.mod @@ -0,0 +1,7 @@ +module github.com/syumai/workers/_templates/cloudflare/cron-go + +go 1.21.3 + +toolchain go1.22.4 + +require github.com/syumai/workers v0.26.1 diff --git a/_templates/cloudflare/cron-go/go.sum b/_templates/cloudflare/cron-go/go.sum new file mode 100644 index 0000000..b58a0b0 --- /dev/null +++ b/_templates/cloudflare/cron-go/go.sum @@ -0,0 +1,2 @@ +github.com/syumai/workers v0.26.1 h1:DvhLZ4PPO/zu5leYRd85TnHELOBTkBbi/2ymkLOieSY= +github.com/syumai/workers v0.26.1/go.mod h1:ZnqmdiHNBrbxOLrZ/HJ5jzHy6af9cmiNZk10R9NrIEA= diff --git a/_templates/cloudflare/cron-go/main.go b/_templates/cloudflare/cron-go/main.go new file mode 100644 index 0000000..6d7e5e3 --- /dev/null +++ b/_templates/cloudflare/cron-go/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/syumai/workers/cloudflare/cron" +) + +func task(ctx context.Context) error { + e, err := cron.NewEvent(ctx) + if err != nil { + return fmt.Errorf("failed to create cron event: %w", err) + } + log.Printf("Cron job triggered at: %s", time.Unix(e.ScheduledTime.Unix(), 0).Format(time.RFC3339)) + log.Println("Executing scheduled task...") + return nil +} + +func main() { + cron.ScheduleTask(task) + select {} +} diff --git a/_templates/cloudflare/cron-go/wrangler.toml b/_templates/cloudflare/cron-go/wrangler.toml new file mode 100644 index 0000000..355bbc5 --- /dev/null +++ b/_templates/cloudflare/cron-go/wrangler.toml @@ -0,0 +1,10 @@ +name = "go-cron" +main = "./build/worker.mjs" +compatibility_date = "2023-02-24" +workers_dev = false + +[triggers] +crons = ["* * * * *"] + +[build] +command = "make build" diff --git a/_templates/cloudflare/cron-tinygo/.gitignore b/_templates/cloudflare/cron-tinygo/.gitignore new file mode 100644 index 0000000..7fd93e1 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/.gitignore @@ -0,0 +1,3 @@ +build +node_modules +.wrangler \ No newline at end of file diff --git a/_templates/cloudflare/cron-tinygo/Makefile b/_templates/cloudflare/cron-tinygo/Makefile new file mode 100644 index 0000000..24eeaf0 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/Makefile @@ -0,0 +1,12 @@ +.PHONY: dev +dev: + wrangler dev + +.PHONY: build +build: + go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1 + tinygo build -o ./build/app.wasm -target wasm -no-debug ./... + +.PHONY: deploy +deploy: + wrangler deploy diff --git a/_templates/cloudflare/cron-tinygo/README.md b/_templates/cloudflare/cron-tinygo/README.md new file mode 100644 index 0000000..2ce92c7 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/README.md @@ -0,0 +1,61 @@ +# cron-tinygo + +- A template for starting a Cloudflare Worker project with a cron job using Go. +- This template uses the [workers](https://github.com/syumai/workers) package to schedule and run cron jobs. + +## Notice + +- A free plan Cloudflare Workers only accepts ~1MB sized workers. + - TinyGo Wasm binaries probably won't exceed this limit, so you might not need to use a paid plan of Cloudflare Workers. + - There's also a Go version of this that can be found [here](https://github.com/syumai/workers/tree/main/_templates/cloudflare/cron-go). + +## Usage + +- `main.go` includes a simple cron job implementation. Feel free to edit this code and implement your own cron job logic. + +## Requirements + +- Node.js +- [wrangler](https://developers.cloudflare.com/workers/wrangler/) + - Just run `npm install -g wrangler` +- Go 1.21.0 or later + +## Getting Started + +- If not already installed, please install the [gonew](https://pkg.go.dev/golang.org/x/tools/cmd/gonew) command. + +```console +go install golang.org/x/tools/cmd/gonew@latest +``` + +- Create a new project using this template. + - The second argument passed to `gonew` is the module path of your new app. + +```console +gonew github.com/syumai/workers/_templates/cloudflare/cron-go your.module/my-app # e.g. github.com/syumai/my-app +cd my-app +go mod tidy +make dev # start running dev server +``` + +- To change the worker name, please edit the `name` property in `wrangler.toml`. + +## Development + +### Commands + +```console +make dev # run dev server +make build # build Go Wasm binary +make deploy # deploy worker +``` + +### Testing the Dev Server + +- To test the cron job, you can simulate the cron event by sending an HTTP request to the dev server. + +```console +curl -X POST http://localhost:8787/cron +``` + +- You should see the scheduled time printed in the console. diff --git a/_templates/cloudflare/cron-tinygo/go.mod b/_templates/cloudflare/cron-tinygo/go.mod new file mode 100644 index 0000000..645db61 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/go.mod @@ -0,0 +1,7 @@ +module github.com/syumai/workers/_templates/cloudflare/cron-tinygo + +go 1.21.3 + +toolchain go1.22.4 + +require github.com/syumai/workers v0.26.1 diff --git a/_templates/cloudflare/cron-tinygo/go.sum b/_templates/cloudflare/cron-tinygo/go.sum new file mode 100644 index 0000000..b58a0b0 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/go.sum @@ -0,0 +1,2 @@ +github.com/syumai/workers v0.26.1 h1:DvhLZ4PPO/zu5leYRd85TnHELOBTkBbi/2ymkLOieSY= +github.com/syumai/workers v0.26.1/go.mod h1:ZnqmdiHNBrbxOLrZ/HJ5jzHy6af9cmiNZk10R9NrIEA= diff --git a/_templates/cloudflare/cron-tinygo/main.go b/_templates/cloudflare/cron-tinygo/main.go new file mode 100644 index 0000000..6d7e5e3 --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/syumai/workers/cloudflare/cron" +) + +func task(ctx context.Context) error { + e, err := cron.NewEvent(ctx) + if err != nil { + return fmt.Errorf("failed to create cron event: %w", err) + } + log.Printf("Cron job triggered at: %s", time.Unix(e.ScheduledTime.Unix(), 0).Format(time.RFC3339)) + log.Println("Executing scheduled task...") + return nil +} + +func main() { + cron.ScheduleTask(task) + select {} +} diff --git a/_templates/cloudflare/cron-tinygo/wrangler.toml b/_templates/cloudflare/cron-tinygo/wrangler.toml new file mode 100644 index 0000000..cbf238f --- /dev/null +++ b/_templates/cloudflare/cron-tinygo/wrangler.toml @@ -0,0 +1,10 @@ +name = "tinygo-cron" +main = "./build/worker.mjs" +compatibility_date = "2023-02-24" +workers_dev = false + +[triggers] +crons = ["* * * * *"] + +[build] +command = "make build"