ここ数年、CircleCIやTravis CIに代表されるクラウドCIサービスがメジャーになり、Jenkinsの影がめっきり薄くなりました。
でも、自社のプロダクトではクラウドサービスダメ!であったりで、恩恵を受けられない人のために、Jenkinsで少しでもその恩恵受けたい!というのが、この記事です。
CircleCIに対するJenkinsのデメリット
個人的に、Jenkins離れが多い理由は、
- 初めのセットアップが面倒
- 複数プロジェクトで共有すると環境が混ざって大変
- ジョブ設定に関する知識が属人的になりやすい(Jenkinsおじさんの出現)
の3つだと考えています。
今回は、特に2.に注目します。
複数プロジェクトの環境が混ざる
あるプロジェクトAは、Rubyでサーバサイドアプリを、別のプロジェクトBは、Androidを、というような場合、
Aのビルドには、rbenv, rais, ...etc
Bのビルドには、jdk, android-sdk, ...etc
というふうに、それぞれのsdkやランタイムが必要ですが、これらが一つのビルドサーバにインストールされると、それぞれ干渉してしまうかもしれません。
ビルドサーバをプロジェクトごとに分けることができれば問題ないですが、そんなにたくさんのサーバを用意できない!という人も多いですよね?
CircleCIでは?
CircleCIでは、プロジェクト(リポジトリ)がビルドされるたびにコンテナが作られ、そこにミドルウェアをセットアップします。コンテナ内は独立したサーバとみなせるので、それぞれが干渉する危険はありません。
Jenkinsジョブをコンテナ内で実行してみる
Jenkinsでも、CircleCIのようにコンテナ内でジョブを実行することができます。
今回は、Vagrantで動作確認用の環境を作ります。
Vagrant.configure(2) do |config|
config.vm.box = "centos7"
config.vm.network "forwarded_port", host:8080, guest:8080
config.vm.network inline: <<-SHELL
# install jenkins
sudo yum -y install java-1.7.0-openjdk
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum -y install --enablerepo=jenkins jenkins
sudo systemctl start jenkins
sudo iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
# install Docker
sudo yum -y update
sudo yum -y install docker
sudo systemctl start docker
SHELL
end
今回作る環境では、CentOS7にJenkinsとDockerをインストールします。
Jenkinsのジョブを、Dockerコンテナ内で実行するには、CloudBees Docker Custom Build Environment Pluginを、Jenkinsにインストールします。
Jenkinsのインストール環境が、CentOSなので、コンテナ内でジョブが実行されたことを明らかにするため、コンテナには、Ubuntuを使います。
ジョブ内では、Ubuntuのバージョンを確認しています。
動作確認
$ docker exec ~
により、シェル内に記述した $ cat /etc/lsb-release
が、コンテナ内で実行されました。
まとめ
UIがイケてない、設定がわかりづらいなどあるものの、Jenkinsは柔軟性があり、クラウドCIでできることは、ほぼJenkinsでも実現できます。
手軽にCIを始めたい場合はクラウドCIを、凝ったCIを組みたい場合はJenkins、というように、用途に合わせてツールを使い分けるのが良いと思います。