-
Notifications
You must be signed in to change notification settings - Fork 4
138 lines (117 loc) · 4.19 KB
/
Copy pathci.yml
File metadata and controls
138 lines (117 loc) · 4.19 KB
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
132
133
134
135
136
137
138
name: CI
on:
push:
branches: [main]
paths-ignore:
- '**.md'
- 'docs/**'
- 'web/**'
- 'LICENSE'
- '.github/CODEOWNERS'
pull_request:
paths-ignore:
- '**.md'
- 'docs/**'
- 'web/**'
- 'LICENSE'
- '.github/CODEOWNERS'
workflow_call:
# Cancel in-progress runs for the same branch/PR to avoid wasted resources.
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
test:
# Tests run on Ubuntu only. Cross-platform compilation is verified in the
# cross-compile job. Native Windows/macOS testing requires platform-specific
# dependencies (ConPTY, system shells) not available in CI runners.
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0" # Match release build settings
steps:
# Pin actions to full SHA for supply-chain security.
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: go.mod
- name: Check formatting (gofmt)
run: |
unformatted=$(gofmt -l .)
if [ -n "$unformatted" ]; then
echo "::error::Files need formatting:"
echo "$unformatted"
exit 1
fi
- name: Check modules tidy
run: |
go mod tidy
git diff --exit-code go.mod go.sum
- name: Check strict formatting (gofumpt)
run: |
go install mvdan.cc/gofumpt@v0.10.0 || { echo "gofumpt install failed, skipping"; exit 0; }
unformatted=$(gofumpt -l .)
if [ -n "$unformatted" ]; then
echo "::error::Files need strict formatting (gofumpt):"
echo "$unformatted"
exit 1
fi
- name: Check dead code
run: |
go install golang.org/x/tools/cmd/deadcode@v0.47.0 || { echo "deadcode install failed, skipping"; exit 0; }
go install github.com/magefile/mage@v1.17.2 || { echo "mage install failed, skipping"; exit 0; }
mage deadcode
- run: go build ./cmd/dispatch/
- name: golangci-lint
uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0
with:
version: "v2.12.2"
install-mode: goinstall
- run: go vet ./...
- name: Test with coverage
run: go test -coverprofile=coverage.out ./...
- name: Coverage summary
run: |
echo "### Coverage Summary" >> "$GITHUB_STEP_SUMMARY"
go tool cover -func=coverage.out | tail -1 | awk '{print "Total: " $3}' | tee -a "$GITHUB_STEP_SUMMARY"
- name: Coverage threshold
run: |
COVERAGE=$(go tool cover -func=coverage.out | tail -1 | awk '{print $3}' | sed 's/%//')
echo "Coverage: ${COVERAGE}%"
if [ "$(echo "$COVERAGE < 60" | bc -l)" -eq 1 ]; then
echo "::error::Coverage ${COVERAGE}% is below 60% threshold"
exit 1
fi
- name: Upload coverage
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: coverage
path: coverage.out
- name: Test (race detector)
env:
CGO_ENABLED: "1"
run: go test -race ./... -count=1
- name: govulncheck
run: |
go install golang.org/x/vuln/cmd/govulncheck@v1.5.0
govulncheck ./...
# Verify the binary compiles for all release platforms.
# CGO_ENABLED=0 means cross-compilation is pure Go — no native runners needed.
cross-compile:
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0"
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: go.mod
- name: Cross-compile all release targets
run: |
for pair in darwin/amd64 darwin/arm64 windows/amd64 windows/arm64; do
os="${pair%/*}"
arch="${pair#*/}"
echo "Building $os/$arch..."
GOOS=$os GOARCH=$arch go build -o /dev/null ./cmd/dispatch/
done