GeekFactory

int128.hatenablog.com

Jenkins Workflow Pluginを使ってみる

先日リリースされたJenkins Workflow Plugin 1.0を使ってみました。年明けのJenkinsユーザカンファレンスで詳しい発表があると思うので、今から楽しみですね!

Workflow Pluginでできること

Workflow Pluginを使うと、Jenkinsジョブの動作をGroovyで記述することができて、さらにユーザとのインタラクションを差し込むことも可能です。これはデプロイメントパイプラインの実装に便利そうです。

また、リポジトリからチェックアウトしたGroovyスクリプトを読み込めるので、Travis CIやCircle CIのようにビルド設定をリポジトリで管理できます。開発現場でJenkinsを使い込んでいくと、いろんな人がジョブ設定をいじって荒廃していくことが多いので、ビルド設定をリポジトリで管理できることは大きなメリットがあると思います。

(と偉そうに書いていますが、まだ調査中です...)

本稿では、公式に公開されているデモを試して、さらに普段使っているJenkinsに導入してみるところまでを説明します。

公式デモを試す

Workflow Pluginのデモが用意されています。デモでは、継続的デリバリーのパイプラインがWorkflow Pluginで実装されています。

デモの流れをざっくりまとめると以下の内容です。

  • Gitリポジトリ(ここではローカル)からソースコードを取得してMavenでビルドする
  • インテグレーションテストを実行して成功したら、ステージングサーバにアプリをデプロイする
  • 人間がステージングサーバ(8080ポートの/staging)を確認する
  • 人間がリリースを承認すると、本番サーバにアプリがデプロイされる

現実のワークフローに当てはめると、プロダクトマネージャがリリースを承認した後、開発者がステージング環境で最終確認を行って、問題なければ本番環境にリリースといった感じでしょうか。実運用するにはブランチ戦略やリリースプロセスと合わせて検討する必要がありそうです。

Dockerでデモを試す

では、実際に試してみましょう。デモの入ったDockerイメージが公式に配布されているので、気軽に試せます。boot2dockerやDigitalOceanなどでDocker環境を調達して、下記のコマンドを実行してみましょう。参考までに、DigitalOceanでDocker環境をさくっと立ち上げるVagrantfileを公開しているのでご活用ください。

docker run --rm -it -p 8080:8080 -p 8081:8081 -p 8022:22 jenkinsci/workflow-demo

8081ポートにアクセスするとJenkinsが現れます。

なお、ローカルホスト以外でこのデモを試す場合は管理画面で正しいJenkins URLを設定してください。Jenkins URLを設定し直さないと、Proceed or Abortをクリックしても次に進めませんでした。

cdというジョブを実行してみましょう。なかなか終了しないからコンソールを見ると、Proceed or Abortのプロンプトが表示されています。

... (コンソールの抜粋)
Entering stage Staging
Proceeding
Running: Shell Script
...
Running: Input
Does http://localhost:8080/staging/ look good?
Proceed or Abort

ジョブの詳細

一体どんな仕組みで動いているのでしょうか。ジョブの設定を見ると、ワークフローがGroovyで記述されていることが分かります。

def flow
node('slave') {
    git url: '/var/lib/jenkins/workflow-plugin-pipeline-demo'
    flow = load 'flow.groovy'
    flow.devQAStaging()
}
flow.production()

ワークフローの詳細は、ジョブでインクルードされているflow.groovyで記述されています。このGroovyファイルを読めば具体的な動きが分かります。

JenkinsにWorkflow Pluginをインストールする

では、いつも使っているJenkinsにWorkflow Pluginをインストールしてみましょう。Workflow PluginのGitHub Projectによると、バージョン1.580以降が必要で、管理画面からWorkflow: Aggregatorプラグインをインストールすればよいようです。

Workflow Pluginをインストールすると、ジョブの新規作成で下記を選択できるようになります。

Workflow:

Orchestrates long-running activities that can span multiple build slaves. Suitable for building pipelines and/or organizing complex activities that do not easily fit in > free-style job type.

ジョブを作成したら設定画面でワークフロー定義(Groovy DSL)を記述します。テキストボックスに何か入力するとバリデーションが動くようです。構文エラーがあったらすぐに表示されるので便利ですね。

ワークフローを書く

普通にビルドしてみます。下記のワークフロー定義でジョブを実行してみます。

node('master') {
  git url: 'https://github.com/int128/gradle-ssh-plugin.git'
  sh './gradlew build'
}

普通にビルドできました!Groovyを知らなくても何となく書けそうです。Groovyのいいところですね。

とりあえず導入してみたところまでを書きました。