CI環境をDockerで再現する/Build the testing containers

CI環境をDockerで再現する/Build the testing containers

1aa17287e8916e4012a53c118b2f0c55?s=128

litencatt

April 26, 2017
Tweet

Transcript

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

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

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

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

  5. 予想してた結果

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

  7. 現実

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

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

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

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

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

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

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

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

  17. .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 ...
  18. .drone.yml の中身 ... compose: mysql_container: image: mysql:5.5 environment: - MYSQL_ALLOW_EMPTY_PASSWORD=yes

    notify: slack: ( 以下略)
  19. Docker でつくる

  20. Docker コンテナ作成 まずはDocker for mac のinstall spec コンテナ 今回はDocker le

    を作成してビルドする
  21. 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
  22. Docker コンテナ作成 spec コンテナ $ docker pull ruby:2.2.2 $ docker

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

    run --name db -e \ MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.5
  24. 調査 $ bin/rspec spec/.../ 動作確認したいテスト_spec.rb binding.pry とかで ここまでくれば普通にデバッグなどができる

  25. コンテナ間の通信について drone はこのあたり書いとくだけでよしなにいける # .drone.yml ... compose: image: mysql:5.5 Docker

    の場合、 --link オプションを付与してspec とdb コンテナ間通信設定している $ docker run -it --link db spec bash
  26. コンテナ間の通信について --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
  27. コンテナ間の通信について /etc/hosts にも自動的に設定される root@39b8b67cc3a8:/tmp/muu# cat /etc/hosts ... 172.17.0.2 db b916b6d6569b

  28. コンテナ内へのファイルの渡し方 テストするレポジトリのディレクトリを渡したい docker run -v src_dir:dst_dir でMac 側のディレクト リをマウントしたが$bin/rake db:create

    が全然実行 されない… なので、Docker le でADD するように変更した ( コンテナbuild 時にsrc_dir をdst_dir へコピー)
  29. まとめ

  30. まとめ テスト失敗原因調査のためDocker にてロー カル環 境にテスト環境を構築 CI 時のテスト環境の基本的な仕組み( .drone.yml ) と、Docker

    の基本的な使い方を習得 え? docker-compose でまとめてビルドとかできる? … それはまた別のお話