466 Views
December 20, 13
スライド概要
2013/12/20 第8回 Jenkins勉強会
https://github.com/ydnjp/jenkins-with-docker-demo
http://techblog.yahoo.co.jp/event/jenkins-with-docker/
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
Jenkins with Docker 13/12/20 第8回 Jenkins 勉強会 Kazuki Suda
Kazuki Suda ! @superbrothers " github.com/superbrothers
Docker とは LXC ベースの軽量仮想化 コピーオンライトのファイルシステム aufs, devicemapper, btrfs... 仮想マシンと比べ軽量で通常のプロセス のように高速にコンテナを起動できる
ジョブごとにクリーンな 実行環境を一瞬で作ることが できる!
Jenkins おじさん スレーブノード LXC Jenkins マスタから Docker がインストールさ れたスレーブに対してジョブを実行し、ジョブ スクリプトでコンテナの作成、削除を行う。
# Dockerfile for nodejs
!
FROM ubuntu:12.04
!
RUN apt-get -q update; apt-get -y upgrade
RUN apt-get -y install build-essential sudo git-core
!
# NVM インストール
RUN git clone --depth 1 https://github.com/creationix/nvm.git
~/.nvm
!
# nodejs インストール
RUN bash -c ". /.nvm/nvm.sh; nvm install 0.10"
!
# スクリプト実行ユーザの作成
RUN useradd -u 45678 -s /bin/bash -m worker
!
# ワークスペースのマウント先を作成
RUN mkdir /workspace
!
ENTRYPOINT ["/bin/bash", "-c"]
# Docker イメージのビルド
!
docker build -t jenkins-with-docker/nodejs .
# ジョブスクリプト
!
docker run \
-v ${WORKSPACE}:/workspace \ # Workspace をマウント
-w /workspace \
# Working Directory を指定
-u worker \
# 実行ユーザを指定
-e HOME=/home/worker \
# 環境変数を指定
jenkins-with-docker/nodejs "$(cat <<EOL # イメージを指定
source /.nvm/nvm.sh
# 実行スクリプトを指定
nvm use 0.10
npm install
npm test
EOL
)"
省略...
もっと Docker を活用してみる 複数のコンテナをバッググラウンドで 同時に作成し、travis-ci のように複 数のバージョンでテストを同時に実行 する
# Dockerfile for nodejs ! # nodejs RUN bash RUN bash RUN bash インストール -c ". /.nvm/nvm.sh; nvm install 0.8” -c ". /.nvm/nvm.sh; nvm install 0.10” -c ". /.nvm/nvm.sh; nvm install 0.11" Dockerfile を修正して3つのバージョ ンをインストールしておく
VERSIONS=(0.8 0.10 0.11)
!
for ((i = 0; i < "${#VERSIONS[@]}"; i++)); do
VERSION="${VERSIONS[$i]}"
!
!
# ワークスペースをビルド番号、言語バージョン単位で複製する
_WORKSPACE="${WORKSPACE}.${BUILD_NUMBER}.${VERSION}"
cp -R "${WORKSPACE}" "${_WORKSPACE}"
CONTAINER_ID=$(docker run \
-d \
# コンテナをバッググラウンドで実行
-v "${_WORKSPACE}":/workspace \ # Workspace をマウント
-w /workspace \
# Working Directory を指定
-u worker \
# 実行ユーザを指定
-e HOME=/home/worker \
# 環境変数を指定
jenkins-with-docker/nodejs "$(cat <<EOL
source /.nvm/nvm.sh
nvm use ${VERSION} # バージョンを指定する
npm install
npm test
EOL
)")
# コンテナ ID をスペース区切りでまとめる
CONTAINER_IDS="${CONTAINER_IDS} ${CONTAINER_ID}"
done
細かいのであとで
ゆったり眺めてください!
!
# docker wait は複数のコンテナ ID を受け取り、全てのコンテナが終了ステータスを返すまで待つ
# コンテナ ID の引数順に終了ステータスを出力する
EXIT_STATUSES="$(docker wait ${CONTAINER_IDS})"
まとめ Docker を使うことでクリーンな環境 が一瞬で手に入る Jenkins と Docker を組み合わせると 工夫次第でもっと面白いことができる かも?