tekton-lint v0.6.0
tekton-lint
A linter for tekton resource definitions
Requirements
The only requirement is node (at least 12.0.0).
Install
$ npm install -g tekton-lintUsage
CLI
tekton-lint is parsing the passed files as yaml files, and checks the rules
on the resulting document set. More details on the pattern syntax.
Using tekton-lint in watch mode will monitor for any changes in the provided paths and automatically run the linter again.
Options:
$ tekton-lint --watch # Run tekton-lint in watch mode
$ tekton-lint --version # Show version number
$ tekton-lint --help # Show help
$ tekton-lint --color / --no-color # Forcefully enable/disable colored output
$ tekton-lint --format # Format output. Available formatters: vscode (default) | stylish | json
$ tekton-lint --quiet # Report errors only - default: false
$ tekton-lint --max-warnings <Int> # Number of warnings to trigger nonzero exit code - default: -1
# exact file path
$ tekton-lint my-pipeline.yaml my-task.yaml
# globstar matching (note the quotes around the glob expression)
$ tekton-lint '**/*.yaml'
# multiple glob patterns
$ tekton-lint path/to/my/pipeline.yaml 'path/to/my/tasks/*.yaml'
# Watch mode
$ tekton-lint --watch '**/*.yaml'IDE Integration
tekton-lint can be added as a Task:
// .vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Run tekton-lint in the workspace",
"type": "shell",
"command": "tekton-lint",
"args": [
"--watch",
"${workspaceFolder}/**/*.yaml" // Change this path to the path of your yaml files (this will watch for every yaml file in your currently open workspace)
],
"problemMatcher": [
{
"fileLocation": "absolute",
"pattern": [
{
"regexp": "^([^\\s].*):$",
"file": 1
},
{
"regexp": "^(error|warning|info)\\s+\\((\\d+,\\d+,\\d+,\\d+)\\):(.*)$",
"severity": 1,
"location": 2,
"message": 3,
"loop": true
}
],
"background": {
"activeOnStart": true,
"beginsPattern": "^File (.*) has been changed! Running Linter again!",
"endsPattern": "^Tekton-lint finished running!"
}
}
]
}
]
}You can run this task from Terminal > Run Task... > Run tekton-lint:

API
linter(globs: string[], config?: Config): Promise<Problem[]>
Runs the linter on the provided globs, and resolves to the list of found problems.
Each problem has a level and a message property. path is the path to the
original file, loc is an object which describes the location of the problem.
An additional config object can be passed to fine-tune rules (see Configuring tekton-lint).
interface Problem {
level: 'warning' | 'error';
message: string;
path?: string;
loc?: {
range: [number, number];
startLine: number;
startColumn: number;
endLine: number;
endColumn: number;
};
}
interface Config {
rules: {
[rule: string]: 'off' | 'warning' | 'error';
};
}Example
const linter = require('tekton-lint');
const problems = await linter(['path/to/defs/**/*.yaml']);
for (const problem of problems) {
console.log(problem.level, problem.message)
}linter.lint(docs: any[], config?: Config): Problem[]
Runs the linter on the provided parsed documents. Returns the list of found problems.
Example
const linter = require('tekton-lint');
const problems = linter.lint([{
apiVersion: 'tekton.dev/v1beta1',
kind: 'Task',
metadata: {
name: 'my-task',
},
spec: {
steps: [],
},
}]);
for (const problem of problems) {
console.log(problem.level, problem.message)
}Rules
Detecting errors
These rules are straightforward, violations indicate that there's a good chance that you won't be able to run your
Pipeline
- Missing
Taskdefinitions - Missing
Conditiondefinitions - Missing
Pipelinedefinitions - Missing
TriggerTemplatedefinitions - Missing
TriggerBindingdefinitions - Missing parameter declarations within
Tasks - Missing parameter declarations within
Pipelines - Missing parameter declarations within
TriggerTemplates - Missing volume definitions in
Tasks - Missing
Taskoutputresults - Missing required
Pipelineparameters inTriggerTemplates - Missing required
Taskparameters inPipelines - Missing required workspaces of
Tasks referenced inPipelines - Missing required workspaces of
Pipelines referenced inTriggerTemplates - Extra parameters passed to
Pipelines - Extra parameters passed to
Tasks - Invalid
runAfterconditions - Invalid
resourceVersionkey - Duplicate resources (of all supported resource kinds)
- Duplicate parameters name in
Tasks - Duplicate environment variables in
Steps - Duplicate
PipelineRun's parameters name inTriggerTemplates - Duplicate parameters name in
TriggerBindings - Duplicate parameters name in
TriggerTemplates - Duplicate parameters name in
Pipelines - Missing
Taskparameter value inPipelines - Invalid
Task,Pipeline,TriggerTemplate,Conditionparameter names (alpha-numeric characters,-and_and can only start with alpha characters and_) - Invalid
Task,Pipeline,TriggerTemplateparameter value types (must bestring,multiline stringorarray of strings) - Invalid
Taskparameter syntax (usingv1beta1syntax inv1alpha1defintions, and vice versa) - Invalid (undefined)
Workspacereferences inTasks ofPipelines - Missing referenced
Taskin anotherTask's parameter inPipelines - Cycle detection in each pipelines task dependency graph (based on
runAfters,resultsandresource -> inputs)
Best practices
If you violate these rules, the
Pipelineis probably going to be just fine, these rules are more like a collection of best practices that we collected while we were working with tekton.
- Unused
Taskparameters - Unused
Conditionparameters - Unused
Pipelineparameters - Unused
TriggerTemplateparameters - Unpinned images in
Tasksteps - kebab-case naming violations
Task&Pipelinedefinitions withtekton.dev/v1alpha1apiVersion- Missing
TriggerBindingparameter values - Usage of deprecated
Conditioninstead ofWhenExpression - Usage of deprecated resources (resources marked with
tekton.dev/deprecatedlabel)
Configuring tekton-lint
You can configure tekton-lint with a configuration file (.tektonlintrc.yaml) in your project's directory. You can decide which rules are enabled and at what error level.
The configuration file should follow this format:
---
rules:
rule-name: error | warning | offExample .tektonlintrc.yaml file:
---
rules:
no-duplicate-param: error
no-unused-param: warning
no-deprecated-resource: offtekton-lint will look for a configuration file named .tektonlintrc.yaml in the directory where you run the command. If the configuration file is not present, tekton-lint will use the default configuration.