feat(linter): glint explain, GL042 rules:if: reachability, GL043 inherit completeness
- `glint explain <RULE>`: new subcommand printing rule description, rationale, bad-YAML example and fix for every GL001–GL043 rule. `glint explain` (no arg) lists all rules with ID, severity, title. Rule IDs are case-insensitive. - GL042 (rules:if: evaluated reachability): warns when every rules:if: condition evaluates to false given the values of variables declared in the pipeline YAML, making the job statically unreachable. Conservative: only fires when all referenced variables are declared in YAML; predefined CI_* / GITLAB_* variables are skipped to avoid false positives. - GL043 (inherit: completeness): warns when inherit: default: is declared but there is no default: block in the pipeline (dead declaration), or when the list form names fields not set in the default: block. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
|
||||
# No default: block — any inherit: default: declaration is a no-op.
|
||||
|
||||
# GL043: inherit: default: false but no default: block.
|
||||
isolated-job:
|
||||
stage: build
|
||||
inherit:
|
||||
default: false
|
||||
script: echo isolated
|
||||
|
||||
# GL043: inherit: default: [list] but no default: block.
|
||||
selective-inherit-job:
|
||||
stage: test
|
||||
inherit:
|
||||
default: [image, tags]
|
||||
script: echo selective
|
||||
|
||||
# Not GL043: inherit only touches variables: (no default: check needed).
|
||||
vars-inherit-job:
|
||||
stage: test
|
||||
inherit:
|
||||
variables: false
|
||||
script: echo vars-only
|
||||
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
|
||||
default:
|
||||
image: node:20
|
||||
|
||||
# GL043: before_script is in the list but not defined in default:.
|
||||
selective-bad:
|
||||
stage: build
|
||||
inherit:
|
||||
default: [image, before_script] # before_script not in default:
|
||||
script: echo hi
|
||||
|
||||
# Not GL043: image IS defined in default: — list is valid.
|
||||
selective-good:
|
||||
stage: test
|
||||
inherit:
|
||||
default: [image]
|
||||
script: echo hi
|
||||
Vendored
+4
@@ -9,6 +9,10 @@ workflow:
|
||||
when: always
|
||||
- when: never
|
||||
|
||||
default:
|
||||
tags:
|
||||
- docker
|
||||
|
||||
variables:
|
||||
GO_VERSION: "1.26"
|
||||
|
||||
|
||||
Vendored
+48
@@ -0,0 +1,48 @@
|
||||
stages:
|
||||
- deploy
|
||||
- test
|
||||
|
||||
variables:
|
||||
DEPLOY: "false"
|
||||
SKIP_TEST: "true"
|
||||
|
||||
# GL042: both if: conditions always evaluate to false given the declared variables.
|
||||
always-dead-deploy:
|
||||
stage: deploy
|
||||
rules:
|
||||
- if: '$DEPLOY == "true"'
|
||||
when: on_success
|
||||
script: echo deploy
|
||||
|
||||
# GL042: if: is false, explicit when:on_success rule — still never fires.
|
||||
always-dead-test:
|
||||
stage: test
|
||||
rules:
|
||||
- if: '$SKIP_TEST == "false"'
|
||||
when: on_success
|
||||
script: echo test
|
||||
|
||||
# Not GL042: references a predefined CI_ variable → unknown value → skip check.
|
||||
predefined-var-job:
|
||||
stage: test
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == "nonexistent-branch"'
|
||||
when: on_success
|
||||
script: echo branch
|
||||
|
||||
# Not GL042: has an unconditional rule (no if: → always matches).
|
||||
unconditional-job:
|
||||
stage: test
|
||||
rules:
|
||||
- if: '$DEPLOY == "true"'
|
||||
when: never
|
||||
- when: on_success
|
||||
script: echo always
|
||||
|
||||
# Not GL042: references undeclared variable → unknown → conservative.
|
||||
undeclared-var-job:
|
||||
stage: test
|
||||
rules:
|
||||
- if: '$UNDECLARED_VAR == "something"'
|
||||
when: on_success
|
||||
script: echo undeclared
|
||||
Reference in New Issue
Block a user