sorin
sorin

Reputation: 170658

Jenkins: How do I lint Jenkins pipelines from the command line?

I would like to be able to perform linting on Jenkins pipelines and it seems that Groovy linting is not enough.

How can I do this?

Upvotes: 24

Views: 37548

Answers (6)

kenorb
kenorb

Reputation: 166765

SSH

Methods using Jenkins SSH interface to run the linter:

  1. Enable SSH service in the Configure Global Security page and assign the port (e.g. 2222).

  2. Add your Public SSH Key in your user's profile in Jenkins (JENKINS_URL/user/USER/configure).

  3. Confirm the SSH access by SSHing to Jenkins and run:

    ssh -l admin -p 2222 localhost help
    
  4. Validate your local Jenkinsfile using the following command on Jenkins box:

    ssh -l admin -p 2222 localhost declarative-linter < ./Jenkinsfile
    

For further details, read Pipeline Development Tools.

Furthermore, to simplify, you can add the following section to your ~/.ssh/config:

Host jenkins-cli
  HostName localhost
  User admin
  Port 2222
  ProxyJump jenkins-host.example.com

Then run: ssh jenkins-cli declarative-linter < ./Jenkinsfile.

You can also consider creating the following shell alias (e.g. to your startup files):

alias jenkins-lint="ssh jenkins-cli declarative-linter < ./Jenkinsfile"

Then just run: jenkins-lint.

POST

Validate a Jenkinsfile by using the following curl command:

curl --user username:password -X POST -F "jenkinsfile=<Jenkinsfile" http://jenkins-url:8080/pipeline-model-converter/validate

For details, please read How to validate a Jenkinsfile page.

VS Code plugin

Using VS Code IDE editor, you can install Jenkins Pipeline Linter Connector plugin and configure accordingly to the instructions, so it can post your Jenkinsfile to your Jenkins Server via POST request.

Upvotes: 2

Isaac Philip
Isaac Philip

Reputation: 575

If you want to lint Jenkins pipelines which can be scripted or declarative. Then the best solution is to lint using the jenkins-cli.jar.

I tried whatever I could possibly get my hands at but this really looks like the best and most convenient to use.

Requirements would be - java

Download the cli jar

$ curl -O https://<jenkins-server>/jnlpJars/jenkins-cli.jar

Lint the Jenkins pipeline script - either Scripted or Declarative

$ java -jar jenkins-cli.jar -s '<jenkins-server-url' -auth <username>:<password> declarative-linter < Jenkinsfile

Its always best to use the jenkins server url where it will be placed as that takes care of checking if the necessary plugins, etc are in place for the pipeline to function correctly.

Jenkins-CLI

Upvotes: 2

Nicolas Vuillamy
Nicolas Vuillamy

Reputation: 690

If for some reason you can't use Jenkins server linter, you can use npm-groovy-lint (works with Declarative or Scripted Jenkinsfile, and also groovy shared libraries)

https://github.com/nvuillam/npm-groovy-lint

npm install -g npm-groovy-lint

npm-groovy-lint  // in the root directory of the Jenkinsfile

Upvotes: 14

miyajan
miyajan

Reputation: 139

In addition to kongkoro's answer, there is a tool to lint Jenkinsfile.

https://www.npmjs.com/package/jflint

# install
$ npm install -g jflint

# usage
# JENKINS_URL=[root URL of Jenkins master]
$ jflint -j $JENKINS_URL Jenkinsfile

What the jflint does is the same as curl in the official document, and jflint works only with declarative pipelines too. But it's easier to use.

Upvotes: 4

Kent Kostelac
Kent Kostelac

Reputation: 2466

HTTP without crumb.

If you want to use HTTP and don't want to use CRUMB. just add your username and password using the '-u' parameter. Replace <username> and <password> with the username and password of your user. Also Check that the url of the jenkins server is correct.

 curl --user <username>:<password> -X POST -F "jenkinsfile=<Jenkinsfile" http://localhost:8080/pipeline-model-converter/validate

src

Upvotes: 17

kongkoro
kongkoro

Reputation: 842

Looks like there are two options for linting pipeline scripts, one via the cli on the leader or an http POST call:

Linting via the CLI with SSH

# ssh (Jenkins CLI)
# JENKINS_SSHD_PORT=[sshd port on master]
# JENKINS_HOSTNAME=[Jenkins master hostname]
ssh -p $JENKINS_SSHD_PORT $JENKINS_HOSTNAME declarative-linter < Jenkinsfile

Linting via HTTP POST using curl

# curl (REST API)
# Assuming "anonymous read access" has been enabled on your Jenkins instance.
# JENKINS_URL=[root URL of Jenkins master]
# JENKINS_CRUMB is needed if your Jenkins master has CRSF protection enabled as it should
JENKINS_CRUMB=`curl "$JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)"`
curl -X POST -H $JENKINS_CRUMB -F "jenkinsfile=<Jenkinsfile" $JENKINS_URL/pipeline-model-converter/validate

https://jenkins.io/doc/book/pipeline/development/#linter

Upvotes: 9

Related Questions