Jenkins2で実用的なPipelineジョブを作ってみた

バージョンアップしたJenkins2のPipelineジョブを作ってみました。

対象読者

Jenkinsの利用経験があり、Jenkins2の概要をご存知の方向けになります。
そのためJenkinsに関する補足説明はしません。

その他、以下についての基礎知識があることが望ましいです。

  • Github
  • Git
  • Docker
  • AWS

ジョブの概要

TINAというchaliceプロジェクトをcloneして、AWSにデプロイします。

                         GitHub
                           ↓ 1.Clone 2.Image build
                         |-----------------------------|
                         | TINA (Chalice project)      |
|-------------| 2.Deploy |-----------------------------| 1.Build  |----------------|
| AWS Lambda  |   <--    | Python Container            |   <--    | Job            |
|-------------|          |-----------------------------|          |----------------|
| API Gateway |          | Docker                      |          | Jenkins        |
|-------------|          |-----------------------------|----------|----------------|
|    AWS      |          | CentOS 7                                                |
|-------------|          |---------------------------------------------------------|

chalice

Flaskに準拠したPythonのWeb API用ライブラリです。
コマンド1つでAWS上にAPIをデプロイできます。

awslabs/chalice

API GatewayとAWS Lambdaを使用しているためサーバレスです。
インフラの心配をする必要がなく、pythonのAPI実装のみに集中できます。

まだプレビュー版のため、ミッションクリティカルな要件には使用しないようにしましょう。

TINA

Githubで公開している Todoist / Toggl と連携してSlackに通知するAPIです。
chalice用のプロジェクトで、DockerfileやJenkinsfileも同封しています。

tadashi-aikawa/tina

※ 今はdaily-reportブランチのみで masterブランチはJenkinsfile未対応

Todoistはタスク管理ツール、Togglは時間管理ツールです。

バージョン

関係しそうな対象のバージョンだけ記載します。

対象 バージョン
Jenkins 2.20
Credentials Binding Plugin 1.9
Credentials Plugin 2.1.4
Pipeline 2.4
Pipeline: API 2.4
Pipeline: Basic Steps 2.2
Pipeline: Build Step 2.3
Pipeline: Groovy 2.18
Pipeline: Input Step 2.1
Pipeline: Job 2.7
Pipeline: Milestone Step 1.1
Pipeline: Multibranch 2.9
Pipeline: Nodes and Processes 2.5
Pipeline: REST API Plugin 2.1
Pipeline: SCM Step 2.2
Pipeline: Shared Groovy Libraries 2.4
Pipeline: Stage Step 2.2
Pipeline: Stage View Plugin 2.1
Pipeline: Step API 2.4
Pipeline: Supporting APIs 2.8

ジョブの作成

Jenkinsの新規ジョブ作成からPipelineを選択して、以下のように設定します。

  • リポジトリURLは各自変更して下さい
  • ブランチ名が固定ならBRANCH_NAMEはビルドパラメータにする必要はありません
  • イメージ名が固定ならIMAGE_NAMEはビルドパラメータにせず、Jenkinsfileに直接記載します

簡単ですね。
認証情報を設定してビルドを実行すればデプロイが完了します。

※ 認証情報はAWSとのやりとりに必要なだけのため、Jenkins2のPipelineプロジェクトに必須ではありません

Jenkinsfile

ジョブの設定が完結な秘訣はJenkinsfileにあります。

node {
    withCredentials([
        [$class: 'StringBinding', credentialsId: 'AWS_ACCESS_KEY_ID', variable: 'AWS_ACCESS_KEY_ID'],
        [$class: 'StringBinding', credentialsId: 'AWS_SECRET_ACCESS_KEY', variable: 'AWS_SECRET_ACCESS_KEY'],
    ]) {
        stage 'Checkout'
        checkout scm

        stage 'Docker build'
        sh "sudo docker build -t $IMAGE_NAME ."

        stage 'Docker run'
        sh """
           sudo docker run -e AWS_ACCESS_KEY_ID=${env.AWS_ACCESS_KEY_ID} \
                           -e AWS_SECRET_ACCESS_KEY=${env.AWS_SECRET_ACCESS_KEY} \
                           -e AWS_DEFAULT_REGION=${env.AWS_DEFAULT_REGION} \
                           --rm $IMAGE_NAME
        """
    }
}

認証情報を取得した上で以下の3ステップを実行しているだけです。

  1. プロジェクトのチェックアウト
  2. Dockerイメージのビルド
  3. Dockerイメージの実行

今回はTINAをデプロイしていますが、他のものになろうとコンテナで動作するものであれば同じ作りでOKです。

本題とは逸れますが、Dockerfileも以下のようにシンプルな作りです。

FROM python:2-onbuild
CMD [ "chalice", "deploy" ]

実行結果

せっかく作ったので実行の様子を眺めてみましょう。

Stageごとに進捗やログ、経過時間などを確認できて便利ですね。

トラブルシューティング

動作させるまで色々なところでハマったので紹介します。

環境変数一覧を見たい

Jenkinsfileのコマンドで以下の様に記載します。

sh "env | sort"

参考

How can I list the variables already available inside Jenkinsfile?

秘密情報を隠したい

出力をマスクしたり、ブラウザ上からは見られなくしたい場合です。
Credentials Binding Pluginをインストールしましょう。

Injecting Secrets into Jenkins Build Jobs

システム設定 > 認証情報 から秘密のファイルや秘密の文字列を登録できるようになります。

変数展開が上手くいかない

Jenkinsにシェルを実行していたときとは異なり、Groovyの解釈が加わります。
クォートの種類や変数の書き方、変数が指す情報によって展開方法が変わります。

ダブルクォートに統一して、情報によって記述を変える方法をオススメします。

変数xxxの書き方
ビルドパラメータ $xxx
認証情報 ${env.xxx}
環境変数 ${env.xxx}

ビルドパラメータ以外はenvが付くと覚えておくと良いでしょう。

Jenkinsfileの書き方が分からない

JenkinsにPipeline Syntaxという説明ページが存在しますので参照しましょう。
Pipelineプロジェクト設定画面の一番左下にあるリンクをクリックすれば移動できます。

Snippet GeneratorでGUIの設定からGroovyスクリプト(Jenkinsfile形式)に変換できます。

総括

Jenkins2で実用的なPipelineジョブを作ってみました。
Jenkinsfileのメリットについては省略していますが、ピンと来ない方は是非調べてみてください。

コメントを残す