Dockerコンテナ上にSelenium用のJenkins環境を構築する


この記事は「[Dockerコンテナ上に開発環境一式を構築する](http://qiita.com/hakaicode/items/5522a5ad1c280b9cf757)」の一部です。

## 現在のステータス

* [VPSにホストにUbuntuを入れる](http://qiita.com/hakaicode/items/5522a5ad1c280b9cf757)
* [dnsを構築する](http://qiita.com/hakaicode/items/478ba39055c101d6197d)
* [nginxを構築する](http://qiita.com/hakaicode/items/38cbed889a03a33cdfcf)
* [GitBucket環境を構築する](http://qiita.com/hakaicode/items/4fb257c8e05727a8abf5#_reference-46b5627e5bd030aa78e0)
* Selenium用のJenkins環境を構築する <-イマココ
* [Desktop環境(IntelliJ IDEA)を構築する](http://qiita.com/hakaicode/items/4fb257c8e05727a8abf5#_reference-46b5627e5bd030aa78e0)

## Dockerfile

Java8の公式イメージは[java:8](https://hub.docker.com/r/library/java/tags/)で入るようです。これは[buildpack-deps:jessie-scm](https://github.com/docker-library/buildpack-deps)をベースにしています。Jenkinsの公式イメージは[jenkins:latest](https://hub.docker.com/r/library/jenkins/tags/)ですね。これはjava:8-jdkがベースになっています。コンテナごとにいろいろ環境に差異があると余計な手間になりかねないのでubuntu14.04を使います。次のLTSである16.04が出たらアップデートを考えます。

```Dockerfile
# Jenkins Dockerfile
FROM ubuntu:14.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y upgrade

ENV HOME /root
RUN locale-gen ja_JP.UTF-8
ENV LANG       ja_JP.UTF-8
ENV LC_ALL     ja_JP.UTF-8

# Install.
RUN apt-get install -y build-essential software-properties-common
RUN apt-get install -y byobu curl git htop man zip unzip wget

# Install java 8
RUN add-apt-repository ppa:webupd8team/java -y && apt-get update
RUN (echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections) && apt-get install -y oracle-java8-installer oracle-java8-set-default

# X frame buffer & firefox & chrome
RUN apt-get install -y Xvfb firefox fonts-ipafont
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update
RUN apt-get install -y google-chrome-stable

#user
ENV USER jenkins
RUN /usr/sbin/useradd $USER

# time
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

Java8の後にXvfb等を入れてます。chromeはそのままではapt-get installできないのでdepを取って来ます。

```:build.sh
#/bin/sh

. ../../setenv.sh
CONTAINER=jenkins

cd $DOCKER_HOME/$CONTAINER/docker
docker build --force-rm -t "lavans-$CONTAINER:latest" .
```

ちなみにこれを作っている最中にglibcのバグの件でパッケージが見つからないエラーがでました。`docker build --no-cache`オプションをつけて`apt-get update`を再実行させることで解消しました。

```shell-session
$ chmod 755 build.sh
$ ./build.sh
```


## jenkins本体の用意

```:update.sh
#/bin/sh

mv jenkins.war jenkins.war.1
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
```


## 起動終了スクリプト


```sh:run.sh
#/bin/sh

. ../setenv.sh
CONTAINER=jenkins

docker run -v $DOCKER_HOME/$CONTAINER:/home/$CONTAINER -u $CONTAINER -d \
  -v /dev/shm:/dev/shm -e HOME="/home/$CONTAINER" --privileged \
  --name $CONTAINER -p 8081:8080 --dns=$DNS \
  lavans-$CONTAINER java -Xmx512m -Djava.awt.headless=true -Duser.timezone=Asia/Tokyo -jar $CONTAINER.war
```

`-v /dev/shm:/dev/shm`は仮想メモリをコンテナにマウントさせます。2016/02時点でdockerでは64MBにハードコーディングされているようで、デフォルトでchromeを動かすとすぐに落ちてしまいます。`--privileged`はコンテナを特権モードにするオプションで、これがないとchrome起動時に`--no-sandbox`オプションが必要になります。`-Duser.timezone`を指定しておかないとjenkinsのコンソールがUTCになってしまいます。

起動するプロセスはDockerfileのCMDに書いておいてrun.shで上書きできるのがいいかなと思っていたのですが、オプションをいろいろトライする時にいちいちビルドしなおすのは面倒なのでrun.shに書いておくのがいいかもしれません。

```sh:kill.sh
#!/bin/sh

CONTAINER=jenkins
docker kill $CONTAINER; docker rm $CONTAINER
```

## 参考

http://qiita.com/yacchin1205/items/e742519e2df32c006679