Initial project setup
							parent
							
								
									3f1f2a5df7
								
							
						
					
					
						commit
						ffce70ad3e
					
				| @ -0,0 +1,15 @@ | |||||||
|  | kind: pipeline | ||||||
|  | type: docker | ||||||
|  | name: CI Test Pipeline | ||||||
|  | 
 | ||||||
|  | steps: | ||||||
|  | - name: Unit Tests | ||||||
|  |   image: golang:1.24 | ||||||
|  |   privileged: true | ||||||
|  |   commands: | ||||||
|  |     - go test -v ./... | ||||||
|  | 
 | ||||||
|  | trigger: | ||||||
|  |   event: | ||||||
|  |     - pull_request | ||||||
|  |     - push | ||||||
| @ -0,0 +1,69 @@ | |||||||
|  | SQL_DATABASE?=./pulley.db | ||||||
|  | COVER_PROFILE?=./tmp/profile.out | ||||||
|  | 
 | ||||||
|  | # TODO maybe only use -race in an ARG for CI
 | ||||||
|  | FLAGS := -race -v  | ||||||
|  | 
 | ||||||
|  | # `make <target> ARGS=no-cache` will avoid using cached results in go test.
 | ||||||
|  | ifeq ($(ARGS), no-cache) | ||||||
|  | 	FLAGS += -count=1 | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # make test ARGS=no-cache
 | ||||||
|  | test: | ||||||
|  | 	go test $(FLAGS) ./... | ||||||
|  | .PHONY: test | ||||||
|  | 
 | ||||||
|  | test-short: | ||||||
|  | 	go test -short $(FLAGS) ./... | ||||||
|  | .PHONY: test-short | ||||||
|  | 
 | ||||||
|  | # make test-int ARGS=no-cache
 | ||||||
|  | test-int: | ||||||
|  | 	go test $(FLAGS) ./cmd/... | ||||||
|  | .PHONY: test-int | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Coverage See also -covermode=count and -covermode=atomic
 | ||||||
|  | cover-html: test-cover | ||||||
|  | 	go tool cover -html=$(COVER_PROFILE) | ||||||
|  | .PHONY:cover-html | ||||||
|  | 
 | ||||||
|  | coverage: test-cover | ||||||
|  | 	go tool cover -func=$(COVER_PROFILE) | ||||||
|  | .PHONY: coverage | ||||||
|  | 
 | ||||||
|  | test-cover: | ||||||
|  | 	go test -coverprofile=$(COVER_PROFILE) $(FLAGS) ./... | ||||||
|  | .PHONY: test-cover | ||||||
|  | 
 | ||||||
|  | serve: | ||||||
|  | 	go run ./cmd/api/main.go | ||||||
|  | .PHONY: serve | ||||||
|  | 
 | ||||||
|  | # SQLite Commands
 | ||||||
|  | sql-cli: | ||||||
|  | 	sqlite3 $(SQL_DATABASE) -cmd ".headers on" -cmd ".mode box" -cmd ".tables" | ||||||
|  | .PHONY: sql-cli | ||||||
|  | 
 | ||||||
|  | init-db: run-migrate | ||||||
|  | 	sqlite3 $(SQL_DATABASE) "PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;" | ||||||
|  | .PHONY: init-db | ||||||
|  | 
 | ||||||
|  | run-migrate: | ||||||
|  | 	migrate -database sqlite3://$(SQL_DATABASE) -path ./migrations up | ||||||
|  | .PHONY: run-migrate | ||||||
|  | 
 | ||||||
|  | # Checks system dependencies needed to run the local dev environment
 | ||||||
|  | check-system-deps: | ||||||
|  | 	@echo "Checking system dependencies..." | ||||||
|  | 	@command -v air > /dev/null || (echo "Missing air command. go install github.com/air-verse/air@latest"; exit 1) | ||||||
|  | 	@command -v sqlite3 > /dev/null || (echo "Missing sqlite3 command. brew install sqlite"; exit 1) | ||||||
|  | 	@command -v migrate > /dev/null || (echo "Missing migrate command. go install -tags 'sqlite3' github.com/golang-migrate/migrate/v4/cmd/migrate@latest"; exit 1) | ||||||
|  | 	@echo "System dependencies fulfilled 👍" | ||||||
|  | .PHONY: check-system-deps | ||||||
|  | # Certs
 | ||||||
|  | 
 | ||||||
|  | local-certs: | ||||||
|  | 	cd ./tls && go run /usr/local/go/src/crypto/tls/generate_cert.go --rsa-bits=2048 --host=localhost | ||||||
|  | .PHONY: local-certs | ||||||
| @ -0,0 +1,52 @@ | |||||||
|  | root = "." | ||||||
|  | testdata_dir = "testdata" | ||||||
|  | tmp_dir = "tmp" | ||||||
|  | 
 | ||||||
|  | [build] | ||||||
|  |   args_bin = ["-logging=DEBUG"] | ||||||
|  |   bin = "./tmp/main" | ||||||
|  |   cmd = "go build -o ./tmp/main cmd/api/main.go" | ||||||
|  |   delay = 1000 | ||||||
|  |   exclude_dir = ["assets", "tmp", "vendor", "testdata"] | ||||||
|  |   exclude_file = [] | ||||||
|  |   exclude_regex = ["_test.go"] | ||||||
|  |   exclude_unchanged = false | ||||||
|  |   follow_symlink = false | ||||||
|  |   full_bin = "" | ||||||
|  |   include_dir = [] | ||||||
|  |   include_ext = ["go", "tpl", "tmpl", "html", "go.tmpl"] | ||||||
|  |   include_file = [] | ||||||
|  |   kill_delay = "1s" | ||||||
|  |   log = "build-errors.log" | ||||||
|  |   poll = false | ||||||
|  |   poll_interval = 0 | ||||||
|  |   post_cmd = [] | ||||||
|  |   pre_cmd = [] | ||||||
|  |   rerun = false  | ||||||
|  |   rerun_delay = 500 | ||||||
|  |   send_interrupt = true | ||||||
|  |   stop_on_error = false | ||||||
|  | 
 | ||||||
|  | [color] | ||||||
|  |   app = "" | ||||||
|  |   build = "yellow" | ||||||
|  |   main = "magenta" | ||||||
|  |   runner = "green" | ||||||
|  |   watcher = "cyan" | ||||||
|  | 
 | ||||||
|  | [log] | ||||||
|  |   main_only = false | ||||||
|  |   silent = false | ||||||
|  |   time = false | ||||||
|  | 
 | ||||||
|  | [misc] | ||||||
|  |   clean_on_exit = false | ||||||
|  | 
 | ||||||
|  | [proxy] | ||||||
|  |   app_port = 0 | ||||||
|  |   enabled = false | ||||||
|  |   proxy_port = 0 | ||||||
|  | 
 | ||||||
|  | [screen] | ||||||
|  |   clear_on_rebuild = false | ||||||
|  |   keep_scroll = true | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func Run(w io.Writer) { | ||||||
|  | 	fmt.Fprint(w, "Hello API\n") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	Run(os.Stdout) | ||||||
|  | } | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestRun(t *testing.T) { | ||||||
|  | 	buffer := bytes.Buffer{} | ||||||
|  | 	Run(&buffer) | ||||||
|  | 	got := buffer.String() | ||||||
|  | 	want := "Hello API\n" | ||||||
|  | 	if got != want { | ||||||
|  | 		t.Errorf("got %q, want %q", got, want) | ||||||
|  | 	} | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue