Slide 1

Slide 1 text

CI 環境をDocker で再現する ムー ムー ドメイン エンジニア なかむー(@litencatt)

Slide 2

Slide 2 text

ムー ムー ドメインは 只今CI 整備週間中

Slide 3

Slide 3 text

背景 CI でE2E テストが実行されていない状況だった 今回それを全て通す

Slide 4

Slide 4 text

いざ、 テスト実行( ッター ン)…

Slide 5

Slide 5 text

予想してた結果

Slide 6

Slide 6 text

いざ、 テスト実行( ッター ン)… ........F.........F............... いくつか落ちる程度だろう

Slide 7

Slide 7 text

現実

Slide 8

Slide 8 text

いざ、 テスト実行( ッター ン)… FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

E2E テストがCI 環境でほぼ全て落ちる! ロー カルでは通るところがCI 環境だと落ちる こういう場合のデバッグ… とは? そういえばCI ってどう動いてるんだっけ?

Slide 11

Slide 11 text

ペパボのCI 基盤 drone.io https://www.slideshare.net/udzura/droneio

Slide 12

Slide 12 text

ペパボの共通CI 基盤 drone.io

Slide 13

Slide 13 text

ペパボのCI 基盤 https://speakerdeck.com/gs3/pepabowozhi-eruda- tong-ciji-pan-toren

Slide 14

Slide 14 text

drone とCI 実行の全体像 Docker コンテナでCI 環境を構築

Slide 15

Slide 15 text

ロー カルに同様の環境が作れ ますね!

Slide 16

Slide 16 text

ということで Docker でCI 環境をロー カルに 構築する

Slide 17

Slide 17 text

.drone.yml の中身 build: rspec_container: image: ruby:2.2.2 environment: LANG: C.UTF-8 RAILS_ENV: test TEST_MYSQL_HOST: 127.0.0.1 commands: # phantomjs をDL してコピー ... # mysql-client をインストー ル ... - bundle install --quiet --path /tmp/bundle --without prod - bin/rake db:create >/dev/null && bin/rake db:migrate >/d - bin/rspec -f p - bin/rubocop ...

Slide 18

Slide 18 text

.drone.yml の中身 ... compose: mysql_container: image: mysql:5.5 environment: - MYSQL_ALLOW_EMPTY_PASSWORD=yes notify: slack: ( 以下略)

Slide 19

Slide 19 text

Docker でつくる

Slide 20

Slide 20 text

Docker コンテナ作成 まずはDocker for mac のinstall spec コンテナ 今回はDocker le を作成してビルドする

Slide 21

Slide 21 text

Docker コンテナ作成 # Dockerfile FROM ruby:2.2.2 ENV LANG C.UTF-8 ENV RAILS_ENV test ENV TEST_MYSQL_HOST muurb_db_1 RUN apt-get update -qq >/dev/null && apt-get install -qq wget >/ # mysql RUN apt-get install -qq mysql-client >/dev/null # phantomjs RUN test -f /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs || w RUN tar xjf /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /tmp RUN cp /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/ # rails RUN bundle install --quiet --path /tmp/bundle --without producti RUN bin/rake db:create >/dev/null && bin/rake db:migrate >/dev/n

Slide 22

Slide 22 text

Docker コンテナ作成 spec コンテナ $ docker pull ruby:2.2.2 $ docker build -t spec . Docker le を元にimage をビルド $ docker run -it --link db spec bash spec コンテナ起動 db コンテナ起動後に実行します

Slide 23

Slide 23 text

Docker コンテナ作成 db コンテナの作成 $ docker pull mysql:5.5 $ docker run --name db -e \ MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.5

Slide 24

Slide 24 text

調査 $ bin/rspec spec/.../ 動作確認したいテスト_spec.rb binding.pry とかで ここまでくれば普通にデバッグなどができる

Slide 25

Slide 25 text

コンテナ間の通信について drone はこのあたり書いとくだけでよしなにいける # .drone.yml ... compose: image: mysql:5.5 Docker の場合、 --link オプションを付与してspec とdb コンテナ間通信設定している $ docker run -it --link db spec bash

Slide 26

Slide 26 text

コンテナ間の通信について --link オプション付与時 環境変数にdb の情報が自動的に設定される root@39b8b67cc3a8:/tmp/muu# env | grep DB_ DB_PORT=tcp://172.17.0.2:3306 DB_PORT_3306_TCP=tcp://172.17.0.2:3306 DB_PORT_3306_TCP_PORT=3306 DB_PORT_3306_TCP_PROTO=tcp DB_ENV_MYSQL_ALLOW_EMPTY_PASSWORD=yes DB_ENV_GOSU_VERSION=1.7 DB_ENV_MYSQL_VERSION=5.5.55 DB_ENV_no_proxy=*.local, 169.254/16 DB_NAME=/muurb_spec/muurb_db_1 DB_PORT_3306_TCP_ADDR=172.17.0.2 DB_ENV_MYSQL_MAJOR=5.5

Slide 27

Slide 27 text

コンテナ間の通信について /etc/hosts にも自動的に設定される root@39b8b67cc3a8:/tmp/muu# cat /etc/hosts ... 172.17.0.2 db b916b6d6569b

Slide 28

Slide 28 text

コンテナ内へのファイルの渡し方 テストするレポジトリのディレクトリを渡したい docker run -v src_dir:dst_dir でMac 側のディレクト リをマウントしたが$bin/rake db:create が全然実行 されない… なので、Docker le でADD するように変更した ( コンテナbuild 時にsrc_dir をdst_dir へコピー)

Slide 29

Slide 29 text

まとめ

Slide 30

Slide 30 text

まとめ テスト失敗原因調査のためDocker にてロー カル環 境にテスト環境を構築 CI 時のテスト環境の基本的な仕組み( .drone.yml ) と、Docker の基本的な使い方を習得 え? docker-compose でまとめてビルドとかできる? … それはまた別のお話