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 を組み合わせると
工夫次第でもっと面白いことができる
かも?


Jenkins with Docker

  • 1.
    Jenkins with Docker 13/12/20第8回 Jenkins 勉強会 Kazuki Suda
  • 2.
    Kazuki Suda ! @superbrothers "github.com/superbrothers
  • 3.
    Docker とは LXC ベースの軽量仮想化 コピーオンライトのファイルシステム aufs,devicemapper, btrfs... 仮想マシンと比べ軽量で通常のプロセス のように高速にコンテナを起動できる
  • 4.
  • 5.
    Jenkins おじさん スレーブノード   LXC   Jenkinsマスタから Docker がインストールさ れたスレーブに対してジョブを実行し、ジョブ スクリプトでコンテナの作成、削除を行う。
  • 6.
    # Dockerfile fornodejs ! 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"]
  • 7.
    # Docker イメージのビルド ! dockerbuild -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 )"
  • 8.
  • 9.
  • 10.
    # Dockerfile fornodejs ! # 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つのバージョ ンをインストールしておく
  • 11.
    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})"
  • 13.
    まとめ Docker を使うことでクリーンな環境 が一瞬で手に入る Jenkins とDocker を組み合わせると 工夫次第でもっと面白いことができる かも?
  • 14.