動機
Jenkinsが汚れていくのは見ていられない
Jenkinsでjavaだけではなく、python、nodejs、rubyのビルドを行う場合はそれぞれの環境をインストールしなければならず、Jenkinsの中身が汚くなってしまいます。
特にJenkinsをコンテナとして運用する場合、変更をイメージとしてcommitしなければいけません。
Jenkinsでのコンテナビルドって面倒そうだと思っていた、が
Jenkinsfileもあまり浸透してないこともあり、werckerみたいに、dockerイメージを選んでyamlを書けば自動でやってくれるようなイメージがなかったです。
が、下記サイト様を閲覧し、Jenkinsfileで気楽にできることを知りました。
参考
初めての Jenkins と Declarative Pipeline
https://qiita.com/propella/items/77060dac98b9034f69bb
Jenkinsジョブ(ビルド~テスト)をDockerコンテナ上で実行する ~Docker Pipeline Pluginを使ってみる~
http://kimulla.hatenablog.com/entry/2017/06/13/003123
Jenkins環境構築
dockerコンテナとしてJenkinsを起動します。
OSはAmazon Linuxを使用しました。
Jenkinsの公式サイトを確認したところ、BlueOceanコンテナをおすすめされたので、こちらを使ってみます。
https://jenkins.io/doc/book/installing/
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
rootユーザで起動し、dockerはホストと共用する設定のようです。
--rmは実際に利用する場合は消さないといけませんね。
起動後、初期設定を行います。(初期設定は割愛します)
Open Blue Ocean
メイン画面に「Open Blue Ocean」というタブが追加されているため、クリックすると今どきのUIに飛びます。
なかなかカッコいいですね。
設定ボタンを押すと今までのJenkinsの設定画面が出てくるのはご愛敬です。
Jenkinsの裏側としては、pipelineジョブでリポジトリを設定しているので、pipelineジョブと同じ使い方をすればOKです。
Jenkinsfileによるdockerコンテナでのビルド
Jenkinsfileを書きます。
これをリポジトリのトップディレクトリに配備すると、自動でJenkinsが読み取ってくれます。
pipeline {
agent { docker 'python:3.6' }
stages {
stage('setup') {
steps {
sh 'pip install -r requirements.txt'
}
}
stage('build') {
steps {
sh 'python manage.py test'
junit 'TEST-*.xml'
}
}
}
}
肝となるのがagent部分で、dockerイメージを指定すると、
ビルドコンテナ立ち上げ
↓
ビルドコンテナ上のカレントディレクトリにリポジトリ取得
をよしなに行ってくれます。
circleciやwerckerみたいな今どきのフラットデザインUIです。
おわりに
Jenkinsでコンテナビルドが簡単にできました。
これでwerckerなどのCIツールの手軽さで、コンテナ内を汚すこともなくビルドができそうですね。
唯一の難点というかイケてない点が、Jenkinsfileがgroovyということですね。
他のCIツール同様yamlで書けるようになると嬉しいのですが、プラグインがJavaである関係でしょうね。