/
main.go
131 lines (105 loc) · 3.19 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Package main defines automation targets using Magefile
package main
import (
"errors"
"fmt"
"os"
"regexp"
"github.com/magefile/mage/sh"
)
// init performs some sanity checks before running anything.
func init() {
mustBeInRoot()
}
// unformatted error.
var errUnformatted = errors.New("some files were unformatted, make sure `go fmt` is run")
// Checks runs various pre-merge checks.
func Checks() error {
if err := sh.Run("go", "vet", "./..."); err != nil {
return fmt.Errorf("failed to run go vet: %w", err)
}
out, err := sh.Output("go", "fmt", "./...")
if err != nil {
return fmt.Errorf("failed to run gofmt: %w", err)
}
if out != "" {
return errUnformatted
}
return nil
}
// Lint lints the codebase.
func Lint() error {
if err := sh.Run("golangci-lint", "run"); err != nil {
return fmt.Errorf("failed to run staticcheck: %w", err)
}
return nil
}
// Generate generates code across the repository.
func Generate() error {
// generate mock types
if err := sh.Run("go", "run", "-mod=readonly", "github.com/vektra/mockery/v2"); err != nil {
return fmt.Errorf("failed to run mockery: %w", err)
}
// generate protobuf
if err := sh.Run("buf", "generate"); err != nil {
return fmt.Errorf("failed to generate protobuf: %w", err)
}
// generate OPA bundles
if err := sh.Run("opa", "build",
"-b", "clauthz/testdata/policies",
"-o", "clauthz/testdata/bundles/bundle.tar.gz",
); err != nil {
return fmt.Errorf("failed to build OPA bundle: %w", err)
}
return nil
}
// Test perform the whole project's unit tests.
func Test() error {
if err := Dev(); err != nil {
return fmt.Errorf("failed to setup dev environment: %w", err)
}
if err := sh.Run(
"go", "run", "-mod=readonly", "github.com/onsi/ginkgo/v2/ginkgo",
"-p", "-randomize-all", "-repeat=1", "--fail-on-pending", "--race", "--trace",
"--junit-report=test-report.xml", "./...",
); err != nil {
return fmt.Errorf("failed to run: %w", err)
}
return nil
}
// Bench run any benchmarks in the project.
func Bench() error {
if err := sh.Run("go", "test", "-bench=.*", "./..."); err != nil {
return fmt.Errorf("failed to run: %w", err)
}
return nil
}
// Dev will create or replace containers used for development.
func Dev() error {
if err := sh.Run("docker", "compose", "-f", "docker-compose.dev.yml", "-p", "clgo-dev", "up",
"-d", "--build", "--remove-orphans", "--force-recreate"); err != nil {
return fmt.Errorf("failed to run: %w", err)
}
return nil
}
// error when wrong version format is used.
var errVersionFormat = fmt.Errorf("version must be in format vX,Y,Z")
// Release tags a new version and pushes it.
func Release(version string) error {
if !regexp.MustCompile(`^v([0-9]+).([0-9]+).([0-9]+)$`).Match([]byte(version)) {
return errVersionFormat
}
if err := sh.Run("git", "tag", version); err != nil {
return fmt.Errorf("failed to tag version: %w", err)
}
if err := sh.Run("git", "push", "origin", version); err != nil {
return fmt.Errorf("failed to push version tag: %w", err)
}
return nil
}
// mustBeInRoot checks that the command is run in the project root.
func mustBeInRoot() {
if _, err := os.Stat("go.mod"); err != nil {
panic("must be in root, couldn't stat go.mod file: " + err.Error())
}
}