cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists 馃崈
charm
leaflet
readability
golang
1version: '3'
2
3vars:
4 BINARY_NAME: noteleaf
5 BUILD_DIR: ./tmp
6 CMD_DIR: ./cmd
7 COVERAGE_FILE: coverage.out
8 COVERAGE_HTML: coverage.html
9 VERSION_PKG: github.com/stormlightlabs/noteleaf/internal/version
10
11 # Git version detection
12 GIT_COMMIT:
13 sh: git rev-parse --short HEAD 2>/dev/null || echo "none"
14 GIT_TAG:
15 sh: git describe --tags --exact-match 2>/dev/null || echo ""
16 GIT_DESCRIBE:
17 sh: git describe --tags --always --dirty 2>/dev/null || echo "dev"
18 BUILD_DATE:
19 sh: date -u +"%Y-%m-%dT%H:%M:%SZ"
20
21tasks:
22 default:
23 desc: Show available tasks
24 silent: true
25 cmds:
26 - task --list
27
28 test:
29 desc: Run all tests
30 cmds:
31 - go test ./...
32
33 coverage:
34 desc: Generate HTML coverage report
35 cmds:
36 - go test -coverprofile={{.COVERAGE_FILE}} ./...
37 - go tool cover -html={{.COVERAGE_FILE}} -o {{.COVERAGE_HTML}}
38 - echo "Coverage report generated at {{.COVERAGE_HTML}}"
39
40 cov:
41 desc: Show coverage in terminal
42 cmds:
43 - go test -coverprofile={{.COVERAGE_FILE}} ./...
44 - go tool cover -func={{.COVERAGE_FILE}}
45
46 build:
47 desc: Build binary (simple build without version injection)
48 cmds:
49 - mkdir -p {{.BUILD_DIR}}
50 - go build -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.CMD_DIR}}
51 - echo "Built {{.BUILD_DIR}}/{{.BINARY_NAME}}"
52
53 build:dev:
54 desc: Build binary with dev version (includes git commit hash and dev tools)
55 vars:
56 VERSION: "{{.GIT_DESCRIBE}}"
57 LDFLAGS: "-X {{.VERSION_PKG}}.Version={{.VERSION}} -X {{.VERSION_PKG}}.Commit={{.GIT_COMMIT}} -X {{.VERSION_PKG}}.BuildDate={{.BUILD_DATE}}"
58 cmds:
59 - mkdir -p {{.BUILD_DIR}}
60 - go build -ldflags "{{.LDFLAGS}}" -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.CMD_DIR}}
61 - 'echo "Built {{.BUILD_DIR}}/{{.BINARY_NAME}} (version: {{.VERSION}})"'
62
63 build:rc:
64 desc: Build release candidate binary (requires git tag with -rc suffix, excludes dev tools)
65 vars:
66 VERSION: "{{.GIT_TAG}}"
67 LDFLAGS: "-X {{.VERSION_PKG}}.Version={{.VERSION}} -X {{.VERSION_PKG}}.Commit={{.GIT_COMMIT}} -X {{.VERSION_PKG}}.BuildDate={{.BUILD_DATE}}"
68 preconditions:
69 - sh: '[ -n "{{.GIT_TAG}}" ]'
70 msg: "No git tag found. Create a tag with 'git tag v1.0.0-rc1' first."
71 - sh: 'echo "{{.GIT_TAG}}" | grep -q "\-rc"'
72 msg: "Git tag must contain '-rc' for release candidate builds (e.g., v1.0.0-rc1)"
73 cmds:
74 - mkdir -p {{.BUILD_DIR}}
75 - go build -tags prod -ldflags "{{.LDFLAGS}}" -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.CMD_DIR}}
76 - 'echo "Built {{.BUILD_DIR}}/{{.BINARY_NAME}} (version: {{.VERSION}})"'
77
78 build:prod:
79 desc: Build production binary (requires clean semver git tag, excludes dev tools)
80 vars:
81 VERSION: "{{.GIT_TAG}}"
82 LDFLAGS: "-X {{.VERSION_PKG}}.Version={{.VERSION}} -X {{.VERSION_PKG}}.Commit={{.GIT_COMMIT}} -X {{.VERSION_PKG}}.BuildDate={{.BUILD_DATE}}"
83 preconditions:
84 - sh: '[ -n "{{.GIT_TAG}}" ]'
85 msg: "No git tag found. Create a tag with 'git tag v1.0.0' first."
86 - sh: 'echo "{{.GIT_TAG}}" | grep -qE "^v?[0-9]+\.[0-9]+\.[0-9]+$"'
87 msg: "Git tag must be a clean semver version (e.g., v1.0.0 or 1.0.0) without prerelease suffix"
88 - sh: '[ -z "$(git status --porcelain)" ]'
89 msg: "Working directory must be clean (no uncommitted changes) for production builds"
90 cmds:
91 - mkdir -p {{.BUILD_DIR}}
92 - go build -tags prod -ldflags "{{.LDFLAGS}}" -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.CMD_DIR}}
93 - 'echo "Built {{.BUILD_DIR}}/{{.BINARY_NAME}} (version: {{.VERSION}})"'
94
95 clean:
96 desc: Remove build artifacts and coverage files
97 cmds:
98 - rm -f {{.COVERAGE_FILE}} {{.COVERAGE_HTML}}
99 - rm -rf {{.BUILD_DIR}}
100 - echo "Cleaned build artifacts"
101
102 lint:
103 desc: Run linters (go vet and go fmt)
104 cmds:
105 - go vet ./...
106 - go fmt ./...
107
108 check:
109 desc: Run linters and coverage tests
110 cmds:
111 - task: lint
112 - task: cov
113
114 deps:
115 desc: Download and tidy dependencies
116 cmds:
117 - go mod download
118 - go mod tidy
119
120 run:
121 desc: Build and run the application
122 deps: [build]
123 cmds:
124 - '{{.BUILD_DIR}}/{{.BINARY_NAME}}'
125
126 status:
127 desc: Show Go version, module info, and dependencies
128 silent: true
129 cmds:
130 - echo "=== Go Version ==="
131 - go version
132 - echo ""
133 - echo "=== Module Info ==="
134 - go list -m
135 - echo ""
136 - echo "=== Dependencies ==="
137 - go list -m all
138
139 dev:
140 desc: Full development workflow (clean, lint, test, build)
141 cmds:
142 - task: clean
143 - task: lint
144 - task: test
145 - task: build
146
147 docs:generate:
148 desc: Generate documentation in all formats
149 cmds:
150 - go run tools/docgen.go -output website/docs/manual -format docusaurus
151 - go run tools/docgen.go -output docs/manual -format man
152 - echo "Documentation generated"
153
154 docs:man:
155 desc: Generate man pages
156 cmds:
157 - mkdir -p docs/manual
158 - go run tools/docgen.go -output docs/manual -format man
159 - echo "Man pages generated in docs/manual"
160
161 docs:serve:
162 desc: Start docusaurus development server
163 dir: website
164 cmds:
165 - npm run start
166
167 version:show:
168 desc: Display current version information
169 silent: true
170 cmds:
171 - echo "Version info:"
172 - 'echo " Git tag: {{.GIT_TAG}}"'
173 - 'echo " Git commit: {{.GIT_COMMIT}}"'
174 - 'echo " Git describe: {{.GIT_DESCRIBE}}"'
175 - 'echo " Build date: {{.BUILD_DATE}}"'
176
177 version:validate:
178 desc: Validate git tag format for releases
179 cmds:
180 - |
181 if [ -z "{{.GIT_TAG}}" ]; then
182 echo "No git tag found"
183 exit 1
184 fi
185 if echo "{{.GIT_TAG}}" | grep -qE "^v?[0-9]+\.[0-9]+\.[0-9]+(-rc[0-9]+)?$"; then
186 echo "Valid version tag: {{.GIT_TAG}}"
187 else
188 echo "Invalid version tag: {{.GIT_TAG}}"
189 echo "Expected format: v1.0.0 or v1.0.0-rc1"
190 exit 1
191 fi