CircleCIライクに、JenkinsジョブをDockerコンテナ内で実行してみる

  • 42
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ここ数年、CircleCIやTravis CIに代表されるクラウドCIサービスがメジャーになり、Jenkinsの影がめっきり薄くなりました。
でも、自社のプロダクトではクラウドサービスダメ!であったりで、恩恵を受けられない人のために、Jenkinsで少しでもその恩恵受けたい!というのが、この記事です。

CircleCIに対するJenkinsのデメリット

個人的に、Jenkins離れが多い理由は、
1. 初めのセットアップが面倒
2. 複数プロジェクトで共有すると環境が混ざって大変
3. ジョブ設定に関する知識が属人的になりやすい(Jenkinsおじさんの出現)
の3つだと考えています。

今回は、特に2.に注目します。

複数プロジェクトの環境が混ざる

あるプロジェクトAは、Rubyでサーバサイドアプリを、別のプロジェクトBは、Androidを、というような場合、
Aのビルドには、rbenv, rais, ...etc
Bのビルドには、jdk, android-sdk, ...etc
というふうに、それぞれのsdkやランタイムが必要ですが、これらが一つのビルドサーバにインストールされると、それぞれ干渉してしまうかもしれません。
ビルドサーバをプロジェクトごとに分けることができれば問題ないですが、そんなにたくさんのサーバを用意できない!という人も多いですよね?

CircleCIでは?

CircleCIでは、プロジェクト(リポジトリ)がビルドされるたびにコンテナが作られ、そこにミドルウェアをセットアップします。コンテナ内は独立したサーバとみなせるので、それぞれが干渉する危険はありません。

Jenkinsジョブをコンテナ内で実行してみる

Jenkinsでも、CircleCIのようにコンテナ内でジョブを実行することができます。

今回は、Vagrantで動作確認用の環境を作ります。

Vagrantfile
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にインストールします。

Screen Shot 2015-12-16 at 0.09.59.png

Jenkinsのインストール環境が、CentOSなので、コンテナ内でジョブが実行されたことを明らかにするため、コンテナには、Ubuntuを使います。
ジョブ内では、Ubuntuのバージョンを確認しています。

Screen Shot 2015-12-16 at 0.24.18.png

動作確認

Screen Shot 2015-12-16 at 0.55.25.png

$ docker exec ~ により、シェル内に記述した $ cat /etc/lsb-release が、コンテナ内で実行されました。

まとめ

UIがイケてない、設定がわかりづらいなどあるものの、Jenkinsは柔軟性があり、クラウドCIでできることは、ほぼJenkinsでも実現できます。

手軽にCIを始めたい場合はクラウドCIを、凝ったCIを組みたい場合はJenkins、というように、用途に合わせてツールを使い分けるのが良いと思います。