LoginSignup
43
40

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-15

ここ数年、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、というように、用途に合わせてツールを使い分けるのが良いと思います。

43
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
40