生産性向上ブログ

継続的な生産性向上を目指すエンジニアのためのブログ

Jenkins 2.0 (5): Jenkinsfileをコマンドラインからlintする

Jenkins 2.0のDeclarative Pipelineには、Jenkinsfileをlintするための仕組みが用意されています。

curlとssh

プラグインのWikiには、sshとcurlそれぞれでJenkinsをlintするための方法が紹介されています。以下は引用です。

# ssh方式
ssh -p [sshd port on master] [Jenkins master hostname] declarative-linter < Jenkinsfile

# curl方式
curl -X POST -H `curl 'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'` -F "jenkinsfile=<Jenkinsfile" JENKINS_URL/pipeline-model-converter/validate

ssh方式の場合は、「Jenkinsの管理」→「システム設定」→「SSHサーバー」からsshdポートを指定しておくのがいいでしょう。

curl方式の -H `curl 'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'` のサブコマンド部分は、「グローバルセキュリティの設定」→「CSRF対策」→「Default Crumb Issuer」が有効になっている場合のみ必要です。Jenkins 2.0ではデフォルトで有効になっているはずです。さらに、ログイン前ユーザーにread権限がない場合は、 -u <username>:<password> を追加するなどして認証情報を与えないと 403 Forbidden でエラーになってしまいます。

jflint

上記の方式だと、日常的に叩くにはちょっとコマンドが複雑です。なので、jflintというコマンドラインツールをnpmパッケージとして作成しました。

$ npm install -g jflint

でインストールできます。

$ jflint -j [Jenkins master hostname] Jenkinsfile

でlintが走ります。内部的には、curl方式でJenkinsにリクエストを投げているだけですが、curlコマンドを直に叩くよりは楽だと思います。

さらに、 -j [Jenkins master hostname] 部分も毎回書くのが面倒なので、設定ファイルから自動で読み込めるようにしています。

{
  "jenkinsUrl": "[Jenkins master hostname]"
}

のようなjsonを、 .jflintrc という名前のファイルとして、現在のディレクトリからファイルシステムルートまでの間か、ホームディレクトリに保存してください。すると、

$ jflint Jenkinsfile

だけでlintできるようになります。

まとめ

JenkinsfileをCLI上からlintする方法と、入力を簡単にするためのnpmパッケージ、jflintについて紹介しました。Jenkinsfileをいじるときに手軽にlintできるの便利なので、ぜひ使ってみてください。なにか不具合や質問などあれば、issue立てるなり、なんらかの手段で自分に連絡するなりしていただけると助かります。