Kanon(Trac+Maven+Jenkins)をできるだけ昔の形でコンテナ化した

# はじめに
Kanonが出てからかなりの時間がすぎ、インストール対象のソフトはバージョンが上がり、Kanonを新しい環境にインストールするとすんなりいかないことが多くなりました。最新の環境(Docker+Trac1.2.3)対応は今作業中です。これまではMavenとJenkinsは除いてコンテナ化をしましたが、今回はMavenとJenkinsを含めてできるだけ昔のままのKanonをコンテナにし、今後数年間利用できる(といいな)ようにしました。

記事の内容を分割しました。
 - [Kanon(Trac0.12)コンテナの使い方](https://qiita.com/okazakiyuji/items/24d87e0881e4a65f081b)
 - [proxyの中と外の環境でビルドと実行を行うためのスクリプト](https://qiita.com/okazakiyuji/items/50940235d917bf4bf462)




# インストールするバージョン
できるだけ最新を追わないでビルドに問題がおきないようにバージョンを次のように選びました。

| 名        | バージョン  |備考              |
|:----------|:-----------|:-----------------|
| コンテナ  |CentOS6     |                  |
| Trac      |0.12.7      |                  |
| JDK       |OpenJDK1.7.0|                  |
| Virtualenv|1.11.3      |pipでバージョン指定|
| Maven     |3.0.5       |kanon-setupは3.1.1<br>CentOS7のyuｍと同じ |
| Jenkins   |1.659       |リポジトリからビルド|

# リポジトリ
コンテナイメージは[DockerHub](https://hub.docker.com/r/okazakiyuji/kanon/)にあります。Jenkinsをソースからビルドしているので、問題なければイメージ(okazakiyuji/kanon:latest)を使用してください。
詳細を知りたい場合、ソースは[BitbucketのKanon](https://bitbucket.org/okazakiyuji/kanon/src/default/)と[BitbucketのCentOS](https://bitbucket.org/okazakiyuji/centos/src/c6-m30-j1x/)から取得できます。

# イメージ
コンテナは一つですが、メンテナンスを考えてDockerfileを次の二つに分けました。

## ベースイメージ
CentOS, Virtualenv, Maven, JenkinsのコンテナでDockerHubのokazakiyuji/centos:c6-m30-j1xで取得できます。ソースは[Bitbucket](https://bitbucket.org/okazakiyuji/centos/src/c6-m30-j1x/)から取得できます。

```centos:Dockerfile
FROM centos:6
MAINTAINER okazakiyuji
# ロケールの設定(glibc-commonのreinstallは上で)
RUN yum install -y epel-release && yum -y reinstall glibc-common
ENV LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja"
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# パッケージのインストール kanon-setupのものも先にインストールする
# jenkinsのビルドはjdk1.6はだめで1.7ならOk
ADD pkglist.rhel6 /tmp/
RUN yum -y update && \
    yum -y install mercurial `cat /tmp/pkglist.rhel6` subversion-python && \
    yum -y install java-1.7.0-openjdk-devel unzip wget && \
    yum install -y epel-release && \
    yum install -y python-pip --enablerepo=epel && \
    pip install virtualenv==1.11.3 && \
    rm -rf /var/cache/yum/* /tmp/pkglist.rhel6 && yum clean all
WORKDIR /tmp
# Mavenのインストール
#  少し古くなるが、なぜか3.0.5ならダウンロードできた
ARG maven_ver="3.0.5"
COPY apache-maven-$maven_ver-bin.tar.gz /tmp
RUN tar xzf apache-maven-$maven_ver-bin.tar.gz && \
    mkdir -p /opt/maven && \
    cp -r /tmp/apache-maven-$maven_ver/* /opt/maven/ && \
    rm -r /tmp/apache-maven-$maven_ver
# Jenkinsのインストール
# できるだけ昔の物を入れるためリポジトリからビルド
ADD jenkins-1.x.zip /tmp/
# RUN git clone https://github.com/jenkinsci/jenkins.git /tmp/jenkins-1.x && \
#     cd /tmp/jenkins-1.x && git checkout 1.x && \
RUN unzip jenkins-1.x.zip && cd jenkins-1.x && \
    /opt/maven/bin/mvn clean install -pl war -am -DskipTests && \
    cd .. && rm -r /tmp/jenkins-1.x && \
    /usr/sbin/groupadd -g 981 jenkins && \
    /usr/sbin/useradd -u 987 -d /var/lib/jenkins \
                      -s /bin/false -g jenkins jenkins && \
    mkdir -p /usr/lib/jenkins /var/log/jenkins \
             /var/cache/jenkins/war/META-INF && \
    chown jenkins.jenkins -R /var/cache/jenkins /var/log/jenkins && \
    cp /root/.m2/repository/org/jenkins-ci/main/jenkins-war/1.659-SNAPSHOT/jenkins-war-1.659-SNAPSHOT.war /usr/lib/jenkins/jenkins.war && \
    rm -r /root/.m2
COPY jenkins/etc /etc
CMD ["tail", "-f", "/dev/null"]
```

## Kanonイメージ
このベースを使って、もう一つのイメージはKanonのインストールとデータを永続化するための退避を行っています。

```Kanon:Dockerfile
FROM okazakiyuji/centos:c6-m30-j1x
MAINTAINER okazakiyuji
WORKDIR /tmp
# Proxy設定が必要な環境でも動くように
COPY proxy-setting.sh /root/
RUN /root/proxy-setting.sh
ENV JENKINS_HOME="/var/lib/jenkins"
# kanonをインストール
COPY kanon /tmp/kanon
RUN hg clone https://bitbucket.org/okamototk/kanonconductor kanonconductor && \
    cp -r /tmp/kanon/* kanonconductor/ && \
    kanonconductor/kanon-setup && \
    cp -fr kanonconductor/resource/jenkins-config/* $JENKINS_HOME && \
    chown jenkins.jenkins -R $JENKINS_HOME && \
    rm -rf /tmp/kanonconductor /tmp/kanon 
# マウント場所のファイルの退避
RUN mkdir -p /tmp/save && cd /tmp/save && \
    cp -r /var/opt/kanon ./var && \
    cp -r /etc/opt/kanon ./etc && \
    cp -r /opt/kanon ./opt && \
    cp -r $JENKINS_HOME ./jenkins
# マウントする場所
VOLUME /opt/kanon
VOLUME /etc/opt/kanon
VOLUME /var/opt/kanon
VOLUME /var/lib/jenkins
# ホストに接続するポート
EXPOSE 80
#  Kanonでリーバースプロキシの設定があるが…
EXPOSE 8080
# Maven動作確認用のファイルをコピーする
COPY maven-test/* /tmp/
WORKDIR /opt/kanon
# Proxy関連の設定を元に戻す
RUN /root/proxy-setting.sh revert
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["tail", "-f", "/dev/null"]
```