Skip to content

Commit 42727eb

Browse files
Add CI workflow to lint and check formatting of Go code
On every push and pull request that affects relevant files, check the Go module for: - Common detectable errors in the code. - Use of outdated APIs - Code style violations - Code formatting inconsistency - Misconfiguration
1 parent b2d61b7 commit 42727eb

File tree

3 files changed

+280
-0
lines changed

3 files changed

+280
-0
lines changed

.github/workflows/check-go-task.yml

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-task.md
2+
name: Check Go
3+
4+
env:
5+
# See: https://github.com/actions/setup-go/tree/main#supported-version-syntax
6+
GO_VERSION: "1.19"
7+
8+
# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows
9+
on:
10+
create:
11+
push:
12+
paths:
13+
- ".github/workflows/check-go-task.ya?ml"
14+
- "Taskfile.ya?ml"
15+
- "**/go.mod"
16+
- "**/go.sum"
17+
- "**.go"
18+
pull_request:
19+
paths:
20+
- ".github/workflows/check-go-task.ya?ml"
21+
- "Taskfile.ya?ml"
22+
- "**/go.mod"
23+
- "**/go.sum"
24+
- "**.go"
25+
schedule:
26+
# Run periodically to catch breakage caused by external changes.
27+
- cron: "0 7 * * WED"
28+
workflow_dispatch:
29+
repository_dispatch:
30+
31+
jobs:
32+
run-determination:
33+
runs-on: ubuntu-latest
34+
outputs:
35+
result: ${{ steps.determination.outputs.result }}
36+
steps:
37+
- name: Determine if the rest of the workflow should run
38+
id: determination
39+
run: |
40+
RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x"
41+
# The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead.
42+
if [[
43+
"${{ github.event_name }}" != "create" ||
44+
"${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX
45+
]]; then
46+
# Run the other jobs.
47+
RESULT="true"
48+
else
49+
# There is no need to run the other jobs.
50+
RESULT="false"
51+
fi
52+
53+
echo "result=$RESULT" >> $GITHUB_OUTPUT
54+
55+
check-errors:
56+
name: check-errors (${{ matrix.module.path }})
57+
needs: run-determination
58+
if: needs.run-determination.outputs.result == 'true'
59+
runs-on: windows-latest
60+
61+
strategy:
62+
fail-fast: false
63+
64+
matrix:
65+
module:
66+
- path: ./
67+
68+
steps:
69+
- name: Checkout repository
70+
uses: actions/checkout@v3
71+
72+
- name: Install Go
73+
uses: actions/setup-go@v3
74+
with:
75+
go-version: ${{ env.GO_VERSION }}
76+
77+
- name: Install Task
78+
uses: arduino/setup-task@v1
79+
with:
80+
repo-token: ${{ secrets.GITHUB_TOKEN }}
81+
version: 3.x
82+
83+
- name: Check for errors
84+
env:
85+
GO_MODULE_PATH: ${{ matrix.module.path }}
86+
run: task go:vet
87+
88+
check-outdated:
89+
name: check-outdated (${{ matrix.module.path }})
90+
needs: run-determination
91+
if: needs.run-determination.outputs.result == 'true'
92+
runs-on: windows-latest
93+
94+
strategy:
95+
fail-fast: false
96+
97+
matrix:
98+
module:
99+
- path: ./
100+
101+
steps:
102+
- name: Checkout repository
103+
uses: actions/checkout@v3
104+
105+
- name: Install Go
106+
uses: actions/setup-go@v3
107+
with:
108+
go-version: ${{ env.GO_VERSION }}
109+
110+
- name: Install Task
111+
uses: arduino/setup-task@v1
112+
with:
113+
repo-token: ${{ secrets.GITHUB_TOKEN }}
114+
version: 3.x
115+
116+
- name: Modernize usages of outdated APIs
117+
env:
118+
GO_MODULE_PATH: ${{ matrix.module.path }}
119+
run: task go:fix
120+
121+
- name: Check if any fixes were needed
122+
run: git diff --color --exit-code
123+
124+
check-style:
125+
name: check-style (${{ matrix.module.path }})
126+
needs: run-determination
127+
if: needs.run-determination.outputs.result == 'true'
128+
runs-on: windows-latest
129+
130+
strategy:
131+
fail-fast: false
132+
133+
matrix:
134+
module:
135+
- path: ./
136+
137+
steps:
138+
- name: Checkout repository
139+
uses: actions/checkout@v3
140+
141+
- name: Install Go
142+
uses: actions/setup-go@v3
143+
with:
144+
go-version: ${{ env.GO_VERSION }}
145+
146+
- name: Install Task
147+
uses: arduino/setup-task@v1
148+
with:
149+
repo-token: ${{ secrets.GITHUB_TOKEN }}
150+
version: 3.x
151+
152+
- name: Install golint
153+
run: go install golang.org/x/lint/golint@latest
154+
155+
- name: Check style
156+
env:
157+
GO_MODULE_PATH: ${{ matrix.module.path }}
158+
run: task --silent go:lint
159+
160+
check-formatting:
161+
name: check-formatting (${{ matrix.module.path }})
162+
needs: run-determination
163+
if: needs.run-determination.outputs.result == 'true'
164+
runs-on: windows-latest
165+
166+
strategy:
167+
fail-fast: false
168+
169+
matrix:
170+
module:
171+
- path: ./
172+
173+
steps:
174+
- name: Checkout repository
175+
uses: actions/checkout@v3
176+
177+
- name: Install Go
178+
uses: actions/setup-go@v3
179+
with:
180+
go-version: ${{ env.GO_VERSION }}
181+
182+
- name: Install Task
183+
uses: arduino/setup-task@v1
184+
with:
185+
repo-token: ${{ secrets.GITHUB_TOKEN }}
186+
version: 3.x
187+
188+
- name: Format code
189+
env:
190+
GO_MODULE_PATH: ${{ matrix.module.path }}
191+
run: task go:format
192+
193+
- name: Check formatting
194+
run: git diff --color --exit-code
195+
196+
check-config:
197+
name: check-config (${{ matrix.module.path }})
198+
needs: run-determination
199+
if: needs.run-determination.outputs.result == 'true'
200+
runs-on: windows-latest
201+
202+
strategy:
203+
fail-fast: false
204+
205+
matrix:
206+
module:
207+
- path: ./
208+
209+
steps:
210+
- name: Checkout repository
211+
uses: actions/checkout@v3
212+
213+
- name: Install Go
214+
uses: actions/setup-go@v3
215+
with:
216+
go-version: ${{ env.GO_VERSION }}
217+
218+
- name: Run go mod tidy
219+
working-directory: ${{ matrix.module.path }}
220+
run: go mod tidy
221+
222+
- name: Check whether any tidying was needed
223+
run: git diff --color --exit-code

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
[![Sync Labels status](https://github.com/arduino/go-win32-utils/actions/workflows/sync-labels.yml/badge.svg)](https://github.com/arduino/go-win32-utils/actions/workflows/sync-labels.yml)
33
[![Check Markdown status](https://github.com/arduino/go-win32-utils/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/go-win32-utils/actions/workflows/check-markdown-task.yml)
44
[![Check Taskfiles status](https://github.com/arduino/go-win32-utils/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/go-win32-utils/actions/workflows/check-taskfiles.yml)
5+
[![Check Go status](https://github.com/arduino/go-win32-utils/actions/workflows/check-go-task.yml/badge.svg)](https://github.com/arduino/go-win32-utils/actions/workflows/check-go-task.yml)
56

67
This library contains some useful calls to win32 API that are not available on the standard golang library.
78

Taskfile.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
# See: https://taskfile.dev/#/usage
22
version: "3"
33

4+
vars:
5+
# Path of the project's primary Go module:
6+
DEFAULT_GO_MODULE_PATH: ./
7+
DEFAULT_GO_PACKAGES:
8+
sh: |
9+
echo $(
10+
cd {{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}} &&
11+
go list ./... | tr '\n' ' ' ||
12+
echo '"ERROR: Unable to discover Go packages"'
13+
)
14+
# `-ldflags` flag to use for `go build` command
15+
LDFLAGS:
16+
417
tasks:
518
docs:generate:
619
desc: Create all generated documentation content
@@ -87,3 +100,46 @@ tasks:
87100
desc: Install dependencies managed by npm
88101
cmds:
89102
- npm install
103+
104+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
105+
go:fix:
106+
desc: Modernize usages of outdated APIs
107+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
108+
cmds:
109+
- go fix {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
110+
111+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
112+
go:format:
113+
desc: Format Go code
114+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
115+
cmds:
116+
- go fmt {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
117+
118+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
119+
go:lint:
120+
desc: Lint Go code
121+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
122+
cmds:
123+
- |
124+
if ! which golint &>/dev/null; then
125+
echo "golint not installed or not in PATH. Please install: https://github.com/golang/lint#installation"
126+
exit 1
127+
fi
128+
- |
129+
golint \
130+
{{default "-min_confidence 0.8 -set_exit_status" .GO_LINT_FLAGS}} \
131+
{{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
132+
133+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
134+
go:vet:
135+
desc: Check for errors in Go code
136+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
137+
cmds:
138+
- go vet {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
139+
140+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/go-task/Taskfile.yml
141+
go:build:
142+
desc: Build the Go code
143+
dir: "{{.DEFAULT_GO_MODULE_PATH}}"
144+
cmds:
145+
- go build -v {{.LDFLAGS}}

0 commit comments

Comments
 (0)