Skip to content

Commit 812a8c0

Browse files
committed
Add CI workflow to check for problems with npm configuration files
On every push and pull request that affects relevant files, and periodically: - Validate package.json against its JSON schema. - Check for forgotten package-lock.json syncs.
1 parent fc81d8f commit 812a8c0

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

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

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-npm-task.md
2+
name: Check npm
3+
4+
env:
5+
# See: https://github.com/actions/setup-node/#readme
6+
NODE_VERSION: 16.x
7+
8+
# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows
9+
on:
10+
push:
11+
paths:
12+
- ".github/workflows/check-npm-task.ya?ml"
13+
- "**/package.json"
14+
- "**/package-lock.json"
15+
- "Taskfile.ya?ml"
16+
pull_request:
17+
paths:
18+
- ".github/workflows/check-npm-task.ya?ml"
19+
- "**/package.json"
20+
- "**/package-lock.json"
21+
- "Taskfile.ya?ml"
22+
schedule:
23+
# Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema.
24+
- cron: "0 8 * * TUE"
25+
workflow_dispatch:
26+
repository_dispatch:
27+
28+
permissions:
29+
contents: read
30+
31+
jobs:
32+
validate:
33+
runs-on: ubuntu-latest
34+
35+
steps:
36+
- name: Checkout repository
37+
uses: actions/checkout@v3
38+
39+
- name: Setup Node.js
40+
uses: actions/setup-node@v3
41+
with:
42+
node-version: ${{ env.NODE_VERSION }}
43+
44+
- name: Install Task
45+
uses: arduino/setup-task@v1
46+
with:
47+
repo-token: ${{ secrets.GITHUB_TOKEN }}
48+
version: 3.x
49+
50+
- name: Validate package.json
51+
run: task --silent npm:validate
52+
53+
check-sync:
54+
runs-on: ubuntu-latest
55+
56+
steps:
57+
- name: Checkout repository
58+
uses: actions/checkout@v3
59+
60+
- name: Setup Node.js
61+
uses: actions/setup-node@v3
62+
with:
63+
node-version: ${{ env.NODE_VERSION }}
64+
65+
- name: Install Task
66+
uses: arduino/setup-task@v1
67+
with:
68+
repo-token: ${{ secrets.GITHUB_TOKEN }}
69+
version: 3.x
70+
71+
- name: Install npm dependencies
72+
run: task npm:install-deps
73+
74+
- name: Check package-lock.json
75+
run: git diff --color --exit-code package-lock.json

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# arduinoOTA
22

33
[![Check General Formatting status](https://github.com/arduino/arduinoOTA/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-general-formatting-task.yml)
4+
[![Check npm status](https://github.com/arduino/arduinoOTA/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-npm-task.yml)
45
[![Check Prettier Formatting status](https://github.com/arduino/arduinoOTA/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-prettier-formatting-task.yml)
56
[![Spell Check status](https://github.com/arduino/arduinoOTA/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/spell-check-task.yml)
67
[![Check Markdown status](https://github.com/arduino/arduinoOTA/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/arduinoOTA/actions/workflows/check-markdown-task.yml)

Taskfile.yml

+73
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# See: https://taskfile.dev/#/usage
22
version: "3"
33

4+
vars:
5+
# Last version of ajv-cli with support for the JSON schema "Draft 4" specification
6+
SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0
7+
48
tasks:
59
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-workflows-task/Taskfile.yml
610
ci:validate:
@@ -150,6 +154,64 @@ tasks:
150154
cmds:
151155
- npm install
152156

157+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-npm-task/Taskfile.yml
158+
npm:validate:
159+
desc: Validate npm configuration files against their JSON schema
160+
vars:
161+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/package.json
162+
SCHEMA_URL: https://json.schemastore.org/package.json
163+
SCHEMA_PATH:
164+
sh: task utility:mktemp-file TEMPLATE="package-json-schema-XXXXXXXXXX.json"
165+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/ava.json
166+
AVA_SCHEMA_URL: https://json.schemastore.org/ava.json
167+
AVA_SCHEMA_PATH:
168+
sh: task utility:mktemp-file TEMPLATE="ava-schema-XXXXXXXXXX.json"
169+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/eslintrc.json
170+
ESLINTRC_SCHEMA_URL: https://json.schemastore.org/eslintrc.json
171+
ESLINTRC_SCHEMA_PATH:
172+
sh: task utility:mktemp-file TEMPLATE="eslintrc-schema-XXXXXXXXXX.json"
173+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/jscpd.json
174+
JSCPD_SCHEMA_URL: https://json.schemastore.org/jscpd.json
175+
JSCPD_SCHEMA_PATH:
176+
sh: task utility:mktemp-file TEMPLATE="jscpd-schema-XXXXXXXXXX.json"
177+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/prettierrc.json
178+
PRETTIERRC_SCHEMA_URL: https://json.schemastore.org/prettierrc.json
179+
PRETTIERRC_SCHEMA_PATH:
180+
sh: task utility:mktemp-file TEMPLATE="prettierrc-schema-XXXXXXXXXX.json"
181+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/semantic-release.json
182+
SEMANTIC_RELEASE_SCHEMA_URL: https://json.schemastore.org/semantic-release.json
183+
SEMANTIC_RELEASE_SCHEMA_PATH:
184+
sh: task utility:mktemp-file TEMPLATE="semantic-release-schema-XXXXXXXXXX.json"
185+
# Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/stylelintrc.json
186+
STYLELINTRC_SCHEMA_URL: https://json.schemastore.org/stylelintrc.json
187+
STYLELINTRC_SCHEMA_PATH:
188+
sh: task utility:mktemp-file TEMPLATE="stylelintrc-schema-XXXXXXXXXX.json"
189+
INSTANCE_PATH: "package.json"
190+
PROJECT_FOLDER:
191+
sh: pwd
192+
WORKING_FOLDER:
193+
sh: task utility:mktemp-folder TEMPLATE="dependabot-validate-XXXXXXXXXX"
194+
cmds:
195+
- wget --quiet --output-document="{{.SCHEMA_PATH}}" {{.SCHEMA_URL}}
196+
- wget --quiet --output-document="{{.AVA_SCHEMA_PATH}}" {{.AVA_SCHEMA_URL}}
197+
- wget --quiet --output-document="{{.ESLINTRC_SCHEMA_PATH}}" {{.ESLINTRC_SCHEMA_URL}}
198+
- wget --quiet --output-document="{{.JSCPD_SCHEMA_PATH}}" {{.JSCPD_SCHEMA_URL}}
199+
- wget --quiet --output-document="{{.PRETTIERRC_SCHEMA_PATH}}" {{.PRETTIERRC_SCHEMA_URL}}
200+
- wget --quiet --output-document="{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" {{.SEMANTIC_RELEASE_SCHEMA_URL}}
201+
- wget --quiet --output-document="{{.STYLELINTRC_SCHEMA_PATH}}" {{.STYLELINTRC_SCHEMA_URL}}
202+
- |
203+
cd "{{.WORKING_FOLDER}}" # Workaround for https://github.com/npm/cli/issues/3210
204+
npx ajv-cli@{{.SCHEMA_DRAFT_4_AJV_CLI_VERSION}} validate \
205+
--all-errors \
206+
-s "{{.SCHEMA_PATH}}" \
207+
-r "{{.AVA_SCHEMA_PATH}}" \
208+
-r "{{.ESLINTRC_SCHEMA_PATH}}" \
209+
-r "{{.JSCPD_SCHEMA_PATH}}" \
210+
-r "{{.PRETTIERRC_SCHEMA_PATH}}" \
211+
-r "{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" \
212+
-r "{{.STYLELINTRC_SCHEMA_PATH}}" \
213+
-d "{{.PROJECT_FOLDER}}/{{.INSTANCE_PATH}}"
214+
153215
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml
154216
poetry:install-deps:
155217
desc: Install dependencies managed by Poetry
@@ -242,6 +304,17 @@ tasks:
242304
vars:
243305
RAW_PATH: "{{.RAW_PATH}}"
244306

307+
# Make a temporary folder named according to the passed TEMPLATE variable and print the path passed to stdout
308+
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml
309+
utility:mktemp-folder:
310+
vars:
311+
RAW_PATH:
312+
sh: mktemp --directory --tmpdir "{{.TEMPLATE}}"
313+
cmds:
314+
- task: utility:normalize-path
315+
vars:
316+
RAW_PATH: "{{.RAW_PATH}}"
317+
245318
# Print a normalized version of the path passed via the RAW_PATH variable to stdout
246319
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml
247320
utility:normalize-path:

0 commit comments

Comments
 (0)