生産性向上ブログ

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

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を使った環境構築について書きます。

LTSとWeeklyリリースライン

Jenkinsのリリースラインには、LTSとWeeklyの2種類があります。

LTSは、Long-Term Supportの略で、より安定して運用したいユーザー向けの変更頻度少なめで重要な不具合改修のみ取り込むバージョンのことです。Jenkinsの場合、約3ヶ月に1回更新されます。

Weeklyは、毎週更新されるバージョンです。主に、最新バージョンの動作確認といった、Jenkins自体の開発に関わる人向けと言えると思います。

通常のソフトウェア開発で運用する分には、LTSを利用する方がいいでしょう。

Dockerイメージ

Jenkinsには、公式のDockerイメージが存在しています。公式リポジトリにはLTSのイメージのみですが、それとは別にWeeklyのDockerイメージも存在します。

動作確認環境

OSはUbuntu 16.04で確認しています。とはいえ、他のOSでも動くはずです。

環境構築

Dockerのインストールは、公式ドキュメントを参照してください。

以下のように docker コマンドを叩くと http://localhost:8080 でJenkinsが起動します。

docker run \
    --name jenkins \
    -p 8080:8080 \
    -p 50000:50000 \
    -v /your/jenkins/home:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime:ro \
    -e JAVA_OPTS="-Duser.timezone=Asia/Tokyo -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" \
    -e JENKINS_OPTS="--sessionTimeout=1440" \
    jenkins:2.32.2

書いてるオプションについて、簡単に説明します。

--name jenkins でDockerコンテナ名を指定しています。jenkinsじゃなくてもいいですが、指定しないとランダムな名前になりコンテナを削除したくなったときとかに面倒なので、わかりやすい名前にしておきます。

-p 8080:8080 でJenkinsのWeb UIにアクセスするportを指定しています。80番でアクセスしたいなら、 -p 80:8080 になります。

-p 50000:50000 は、ノードにJNLP方式で接続するときに使うポートを空けています。おそらく、ssh方式とかだけ使うなら必要ない気がしますが、試してはないです。

-v /your/jenkins/home:/var/jenkins_home は、ホストマシンの /your/jenkins/home ディレクトリをJenkinsのホームディレクトリとしてマウントします。マウントしないと、コンテナが消えたらデータも消えてしまうので、本運用では必ずマウントしましょう。

-v /etc/localtime:/etc/localtime:ro は、ホストマシンのタイムゾーン情報をread onlyでマウントしています。JAVA_OPTSでタイムゾーンを指定すれば基本的には大丈夫なのですが、過去にJenkinsバージョンアップ時のデータマイグレーションで /etc/localtime を参照することがあってハマった経験があるので、一応マウントしておくことをおすすめします。

-e JAVA_OPTS="-Duser.timezone=Asia/Tokyo -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" は、JAVA_OPTS環境変数でタイムゾーンと文字コードを指定しています。タイムゾーンは指定しないとUTCで表示されてしまうので、必ず指定しましょう。文字コードは、現在だと指定しなくてもUTF-8になる気がしますが、過去に文字化けにハマった経験があるので一応指定しておくほうが無難だと思います。

-e JENKINS_OPTS="--sessionTimeout=1440" は、JENKINS_OPTSでセッションのタイムアウト時間を設定しています。デフォルトだと60分でログアウトされてわずらわしいので、24時間にしています。これは任意で大丈夫です。

初期設定

初回起動時は、コンソールに以下のように初期設定に使うパスワードが表示されます。

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

<password>

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

ブラウザからアクセスして、表示されたパスワードを入力して、あとは画面に沿ってポチポチしていくだけです。プラグインのインストールは、"Install Suggested Plugins" を選択しておけばとりあえず大丈夫です。

1.xまでとの違いとしては、最初にadminユーザーが強制的に作成されることです。以前はインストール直後はログインなしで使えるのがデフォルトだったので、2.0ではセキュリティ的にユーザーがログインした状態で使うことを推奨しているようです。『Jenkinsの管理』→『グローバルセキュリティの設定』で無効化できるので運用の好みによりますが、一般的にはユーザ管理したほうがいざというときに便利なことが多いです。

まとめ

今回は、JenkinsをDockerで構築する方法について書きました。まだ2.0ならではの部分はないので目新しさはないと思いますが、次回以降は本題のPipeline Pluginまわりについて書く予定です。