Skip to content

Commit 4883e48

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 f22bd5b commit 4883e48

File tree

3 files changed

+271
-1
lines changed

3 files changed

+271
-1
lines changed

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

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
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.16"
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 "::set-output name=result::$RESULT"
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: ubuntu-latest
60+
61+
strategy:
62+
fail-fast: false
63+
64+
matrix:
65+
module:
66+
# TODO: add paths of all Go modules here
67+
- path: ./
68+
69+
steps:
70+
- name: Checkout repository
71+
uses: actions/checkout@v3
72+
73+
- name: Install Go
74+
uses: actions/setup-go@v3
75+
with:
76+
go-version: ${{ env.GO_VERSION }}
77+
78+
- name: Install Task
79+
uses: arduino/setup-task@v1
80+
with:
81+
repo-token: ${{ secrets.GITHUB_TOKEN }}
82+
version: 3.x
83+
84+
- name: Check for errors
85+
env:
86+
GO_MODULE_PATH: ${{ matrix.module.path }}
87+
run: task go:vet
88+
89+
check-outdated:
90+
name: check-outdated (${{ matrix.module.path }})
91+
needs: run-determination
92+
if: needs.run-determination.outputs.result == 'true'
93+
runs-on: ubuntu-latest
94+
95+
strategy:
96+
fail-fast: false
97+
98+
matrix:
99+
module:
100+
# TODO: add paths of all Go modules here
101+
- path: ./
102+
103+
steps:
104+
- name: Checkout repository
105+
uses: actions/checkout@v3
106+
107+
- name: Install Go
108+
uses: actions/setup-go@v3
109+
with:
110+
go-version: ${{ env.GO_VERSION }}
111+
112+
- name: Install Task
113+
uses: arduino/setup-task@v1
114+
with:
115+
repo-token: ${{ secrets.GITHUB_TOKEN }}
116+
version: 3.x
117+
118+
- name: Modernize usages of outdated APIs
119+
env:
120+
GO_MODULE_PATH: ${{ matrix.module.path }}
121+
run: task go:fix
122+
123+
- name: Check if any fixes were needed
124+
run: git diff --color --exit-code
125+
126+
check-style:
127+
name: check-style (${{ matrix.module.path }})
128+
needs: run-determination
129+
if: needs.run-determination.outputs.result == 'true'
130+
runs-on: ubuntu-latest
131+
132+
strategy:
133+
fail-fast: false
134+
135+
matrix:
136+
module:
137+
# TODO: add paths of all Go modules here
138+
- path: ./
139+
140+
steps:
141+
- name: Checkout repository
142+
uses: actions/checkout@v3
143+
144+
- name: Install Go
145+
uses: actions/setup-go@v3
146+
with:
147+
go-version: ${{ env.GO_VERSION }}
148+
149+
- name: Install Task
150+
uses: arduino/setup-task@v1
151+
with:
152+
repo-token: ${{ secrets.GITHUB_TOKEN }}
153+
version: 3.x
154+
155+
- name: Install golint
156+
run: go install golang.org/x/lint/golint@latest
157+
158+
- name: Check style
159+
env:
160+
GO_MODULE_PATH: ${{ matrix.module.path }}
161+
run: task --silent go:lint
162+
163+
check-formatting:
164+
name: check-formatting (${{ matrix.module.path }})
165+
needs: run-determination
166+
if: needs.run-determination.outputs.result == 'true'
167+
runs-on: ubuntu-latest
168+
169+
strategy:
170+
fail-fast: false
171+
172+
matrix:
173+
module:
174+
# TODO: add paths of all Go modules here
175+
- path: ./
176+
177+
steps:
178+
- name: Checkout repository
179+
uses: actions/checkout@v3
180+
181+
- name: Install Go
182+
uses: actions/setup-go@v3
183+
with:
184+
go-version: ${{ env.GO_VERSION }}
185+
186+
- name: Install Task
187+
uses: arduino/setup-task@v1
188+
with:
189+
repo-token: ${{ secrets.GITHUB_TOKEN }}
190+
version: 3.x
191+
192+
- name: Format code
193+
env:
194+
GO_MODULE_PATH: ${{ matrix.module.path }}
195+
run: task go:format
196+
197+
- name: Check formatting
198+
run: git diff --color --exit-code
199+
200+
check-config:
201+
name: check-config (${{ matrix.module.path }})
202+
needs: run-determination
203+
if: needs.run-determination.outputs.result == 'true'
204+
runs-on: ubuntu-latest
205+
206+
strategy:
207+
fail-fast: false
208+
209+
matrix:
210+
module:
211+
# TODO: add paths of all Go modules here
212+
- path: ./
213+
214+
steps:
215+
- name: Checkout repository
216+
uses: actions/checkout@v3
217+
218+
- name: Install Go
219+
uses: actions/setup-go@v3
220+
with:
221+
go-version: ${{ env.GO_VERSION }}
222+
223+
- name: Run go mod tidy
224+
working-directory: ${{ matrix.module.path }}
225+
run: go mod tidy
226+
227+
- name: Check whether any tidying was needed
228+
run: git diff --color --exit-code

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# rp2040tools
22

3+
[![Check Go status](https://github.com/arduino/rp2040tools/actions/workflows/check-go-task.yml/badge.svg)](https://github.com/arduino/rp2040tools/actions/workflows/check-go-task.yml)
4+
35
This repo contains all the tools used by Arduino to upload compiled code to the boards that use the rp2040 processor.
46

57
## Tools

Taskfile.yml

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,50 @@ vars:
2323
'
2424
# Path of the project's primary Go module:
2525
DEFAULT_GO_MODULE_PATH: ./
26+
DEFAULT_GO_PACKAGES:
27+
sh: |
28+
echo $(cd {{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}} && go list ./... | tr '\n' ' ' || echo '"ERROR: Unable to discover Go packages"')
29+
2630
tasks:
2731
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/go-task/Taskfile.yml
2832
go:build:
2933
desc: Build the Go code
3034
dir: "{{.DEFAULT_GO_MODULE_PATH}}"
3135
cmds:
32-
- go build -v {{.LDFLAGS}}
36+
- go build -v {{.LDFLAGS}}
37+
38+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
39+
go:fix:
40+
desc: Modernize usages of outdated APIs
41+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
42+
cmds:
43+
- go fix {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
44+
45+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
46+
go:format:
47+
desc: Format Go code
48+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
49+
cmds:
50+
- go fmt {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
51+
52+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
53+
go:lint:
54+
desc: Lint Go code
55+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
56+
cmds:
57+
- |
58+
if ! which golint &>/dev/null; then
59+
echo "golint not installed or not in PATH. Please install: https://github.com/golang/lint#installation"
60+
exit 1
61+
fi
62+
- |
63+
golint \
64+
{{default "-min_confidence 0.8 -set_exit_status" .GO_LINT_FLAGS}} \
65+
{{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
66+
67+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
68+
go:vet:
69+
desc: Check for errors in Go code
70+
dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
71+
cmds:
72+
- go vet {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}

0 commit comments

Comments
 (0)