生産性向上ブログ

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

Jenkins 2.0 (3): Scripted Pipeline と Declarative Pipeline

Jenkins 2.0について書く記事の3回目です。今回は、前回書いたJenkins Pipelineを構成するDSLについて書きます。

フリースタイルプロジェクトのジョブ設定

1.x時代から存在したフリースタイルプロジェクトでは、Web上のUIを通してジョブを設定しました。この方法は、前回書いたように、わかりやすい反面いくつか問題点もありました。

  • 機能が増えるにつれ設定UIが複雑になりがち
  • 1つのジョブにつき1つのノードしか使えない
  • デプロイパイプラインを構築するためには複数ジョブをつなげないといけない
  • 設定の変更履歴を管理しづらい

Scripted Pipeline

2.0のPipelineでは、GroovyによるDSLが導入され、Pipeline as Codeとしてジョブを設定できるようになりました。DSLによる柔軟な表現力により、上記の問題が改善されました。

  • 必要な設定だけコードとして書ける
  • 1つのジョブの中で複数のノードを扱える
  • 1つのジョブでデプロイパイプラインを表現できる
  • バージョン管理しやすい

加えて、masterが再起動してもビルドを再開できる耐久性や、ユーザーからの入力を受け付ける仕組みといった、これまでにない機能を使えるようになりました。

しかし、初期のパイプラインの構文(Scripted Pipeline)は、これまでのJenkinsの設定や他のCIツールにおけるyamlのようなわかりやすい設定に慣れたユーザーにとっては親しみにくいものでした。

withEnv(["GIT_COMMITTER_NAME = jenkins","GIT_COMMITTER_EMAIL = jenkins@jenkins.io"]) {
  node('has-docker') {
    try {
      checkout scm // checks out Dockerfile and source code
      def myImage = docker.build 'my-environment:snapshot'
      myImage.inside {
        stage('Build') {
          sh 'mvn clean install -Dmaven.test.failure.ignore=true'
        }
        stage('Archive') {
          archive "*/target/**/*"
          junit '*/target/surefire-reports/*.xml'
        }
      }
      if (currentBuild.result == null || currentBuild.result == 'SUCCESS') {
        mail to:"me@example.com", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed."
      }
    }
    catch (exc) {
      mail to:"me@example.com", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed."
    }
    finally {
      deleteDir()
    }
  }
}

上の例は、Jenkins公式ブログの記事からの引用です。

内容としては、Dockerコンテナ内でmavenプロジェクトをビルドしてメール通知を飛ばすといったものですが、直観的には理解しにくいです。失敗したときにメール通知を投げるために try/catch を書かなきゃいけないというのは、プログラマなら理解はできますが、CIのジョブ設定のためにこれを書くのはなかなか辛いものがあります。

Declarative Pipeline

上記のScripted Pipelineの問題点を解決するために、ジョブの設定を記述するための新しい構文が作られました。それが、Declarative Pipelineです。

Declarative Pipelineは元々はPipeline Model Definition Pluginとして開発されていましたが、今年の2/1に1.0になりました。それと同時にPipeline Pluginのdependenciesとなり、一緒にインストールされるようになりました。

Declarative Pipelineは、よりシンプルにセクションと呼ばれるブロックベースで記述します。

pipeline {
  agent  label:'has-docker', dockerfile: true
  environment {
    GIT_COMMITTER_NAME = "jenkins"
    GIT_COMMITTER_EMAIL = "jenkins@jenkins.io"
  }
  stages {
    stage("Build") {
      steps {
        sh 'mvn clean install -Dmaven.test.failure.ignore=true'
      }
    }
    stage("Archive"){
      steps {
        archive "*/target/**/*"
        junit '*/target/surefire-reports/*.xml'
      }
    }
  }
  post {
    always {
      deleteDir()
    }
    success {
      mail to:"me@example.com", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed."
    }
    failure {
      mail to:"me@example.com", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed."
    }
  }
}

こちらのDeclarative Pipelineの例も先ほどと同じ記事からの引用で、同じ内容のジョブ設定を表します。

pipeline {...} で囲われたブロック内でDeclarative Pipelineの構文は有効になり、それぞれのブロックが1つ1つのジョブの設定を表します。例えば、 agent はビルドを行うノードの設定を表しています。

Scripted Pipelineで try/catch で表現されていたビルド後の処理の設定は、Declarative Pipelineでは post というブロックでわかりやすく表現されるようになっています。

もし、Declarative Pipelineの中でScripted Pipelineのように iftry/catch のようなプログラム的な命令処理を書きたい場合は、 script というブロックを使うことによって記述できるようになっており、両方の構文のメリットを組み合わせた記述も可能になっています。なので、今後はDeclarative Pipelineをメインとして使い、Scripted Pipelineは柔軟な表現を使いたい場面だけで使うようになるのではないかと思います。

Declarative Pipelineについての詳細なドキュメントは、現時点ではJenkins公式のドキュメントPluginのGitHub Wikiを読むのがいいと思います。

まとめ

  • Jenkins PipelineにはScripted PipelineとDeclarative Pipelineの2つの構文が存在する
  • Scripted Pipelineは柔軟な表現ができる一方で複雑だった
  • Declarative Pipelineはシンプルな設定ができ、Scripted Pipelineの構文を使うこともできる

2.0がリリースされたころはDSLの複雑さが自分としても懸念でしたが、Declarative Pipelineの登場によりかなり書きやすくなったのではないかと思います。yamlほどシンプルではないかもしれませんが、そのぶん複雑なパイプラインを表現できるところが魅力だと思います。

Web上にはScripted Pipelineの構文しかない時点で書かれた情報があるので、そのあたりは注意が必要です。

次回は、少しパイプラインから離れてGitHub連携について書く予定です。

Jenkins 2.0 (1): Dockerで環境構築

Jenkins 2.0

2016/04/26にJenkins 2.0がリリースされてから1年近くが経ちました。

リリース当初は、正直2.0のメリットをほとんど感じていませんでした。というのも、2.0の目玉であったPipeline Pluginは実は1.x系でもその時点の2.0とほぼ同等の機能が使えたのです。そうなるとUI変更ぐらいしか取り上げる点がなく、そこまでインパクトのある変更ではなかったため積極的にバージョンを上げることはしませんでした。

しかし、最近になってJenkins 2.0のPipeline Pluginまわりを調べると、2.0リリース当初と比べて状況は大きく変わっていました。Piepline Pluginとその関連プラグインの発展により、1.xでは不可能だった数々の機能を実現できるようになっていました。

公式ドキュメントやプラグインのwikiは整備されつつあり、Jenkinsコミュニティブログも頻繁に更新され、その新しい機能の全貌がどんどん発信されています。しかし、まだまだ国内ではその機能についての情報が少ないようなので、何回かの記事に分けてJenkins 2.0の最新情報を書いていこうと思います。基本的には、Jenkins 1.xを一通り触ったことがある人向けです。

今回は、Dockerを使った環境構築について書きます。

続きを読む

今年読んでよかった本4冊【2016年版】

2016年に読んでよかった書籍をまとめておきます。

Work Rules!

ワーク・ルールズ!―君の生き方とリーダーシップを変える

ワーク・ルールズ!―君の生き方とリーダーシップを変える

Googleの人事が採用、育成、評価について書いた本です。

人事関連の仕事というとエンジニア的には苦手な人とのコミュニケーションとか心の話とかになりがちだと思っていたのですが、この本はできるだけ具体的なデータを使って人事という仕事を分析しています。人事をGoogleがエンジニアリングするとこうなりましたという内容で、最初から最後まで飽きることなく読み切ることができました。

もちろんGoogleだからできている部分もあるとは思うのですべてを鵜呑みにすればいいというわけではないですが、たいていの組織ではこの本から得られる学びがあるのではないかと思います。人事やエンジニアの人におすすめできる本です。

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

ソフトウェア開発者がよりよい人生を過ごすためのノウハウをまとめた一冊です。一言で表すと、エンジニア向けの自己啓発書です。

この本の著者の体験に依るところがかなり大きいので、書かれている内容についてはそのまま受け取らないほうがいい部分も多いです。自分は、不動産で儲けているノウハウのあたりはかなり生存者バイアスがかかっているのではと感じました。

一方、これまであまり触れられてこなかったエンジニアのセルフブランディングや仕事の効率化、運動、料理、果ては恋愛といった人生のあらゆる側面を改善するためのノウハウが詰まっているのは間違いないです。できる限り科学的なエビデンスなども合わせて書かれていて、それぞれの項目についての分量は少なめでも十分な内容となっています。

著者がかなりストイックなので書かれていることを誰もが完璧に実現できるとは言えないですが、日々の生活を見直したいエンジニアにおすすめです。

人を動かす

人を動かす 文庫版

人を動かす 文庫版

前に感想を書きましたが、人間関係を円滑にするための原則について書かれた自己啓発書です。ひょっとしたら、自分は自己啓発書好きなのかもしれませんね。。

誰もが自分を大切に思われたがっているというところがこの本の核になっていると思います。正直この本を読めば書かれてることを実践できるというものでもないですが、人とのコミュニケーションに課題を感じている人は読んで損はないと思います。自分もまだまだ実践できてないので、また読み直したいと思います。

ファシリテーションの教科書

ファシリテーションの教科書: 組織を活性化させるコミュニケーションとリーダーシップ

ファシリテーションの教科書: 組織を活性化させるコミュニケーションとリーダーシップ

会議や議論でのファシリテーション手法について書かれた一冊です。

事前の『仕込み』と実際の会議での『さばき』の大きく2つについて書かれています。論理的な部分と感情的な部分の両方についてうまくバランスをとって書かれている印象で、あまりファシリテーションに慣れていないけど今後は必要になるという人におすすめです。

自分も正直こういう分野は得意じゃないですが、この本のおかげで事前に把握しておくべきことや議論中に気をつけるべきことが自分の中で形に落とし込めたのでよかったです。

まとめ

今年読んでよかった本について簡単にまとめました。今年は正直あまり読書していなかったので、おすすめできる本も少なかったです。積ん読してる本もいくつか溜まってきてるので、少しずつでも読書する習慣を作り直さないといけないと感じています。