Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker in CI

Docker in CI

第9回 コンテナ型仮想化の情報交換会@福岡 #lxcjp
http://ct-study.connpass.com/event/28449/

株式会社ヌーラボ

April 23, 2016
Tweet

More Decks by 株式会社ヌーラボ

Other Decks in Technology

Transcript

  1. 複数プロセスの実⾏ •  %PDLFSpMF一つだけでテスト実行 •  ローカル開発環境と同じ設定でテスト可能 # Dockerfile # install package

    required for test RUN apt-get install –y redis-server # Test Configuration in Jenkins $ docker run test-image bach –c “service redis-server start ; ./ gradlew clean test”
  2. #1 ホストディレクトリ $ docker run –v ${HOME}/.gradle:/root/.gradle test-image <test command>

    •  ϝϦοτ – ෳ਺δϣϒؒͰͷڞ༗ •  σϝϦοτ – ύʔϛογϣϯɺϩοΫ໰୊
  3. #2 事前ビルド # Dockerfile RUN mkdir -p /opt/local/app COPY requirements.txt

    /opt/local/app/ WORKDIR /opt/local/app RUN pip install -r requirements.txt COPY . /opt/local/app $ docker build –t test-image . $ docker run test-image <test command> ґଘϥΠϒϥϦͷߋ৽͸Ξ ϓϦέʔγϣϯͦͷ΋ͷͷ ߋ৽ΑΓ͸සൟʹى͜Βͳ ͍͜ͱ͕૝ఆ
  4. #3 外部キャッシュ •  ϝϦοτ – ॳճ࣮ߦͰ΋ڧ྽ʹૣ͍ •  σϝϦοτ – ֎෦ΩϟογϡΛϝϯς͠ͳ͍ͱ͍͚ͳ͍ # Dockerfile

    RUN mkdir /root/.gradle RUN cd /root/.gradle; curl -skL https://s3-ap- northeast-1.amazonaws.com/<cache-bucket>/cache.20151201.tar.gz | tar zxf -
  5. 依存ライブラリのキャッシュ戦略 Ωϟογϡͷ࢓ํ ϝϦοτ σϝϦοτ ψʔϥϘͷ࠾༻ ϗετσΟϨΫ τϦ ςετ࣮ߦ࣌ʹϗε τσΟϨΫτϦΛϚ ΢ϯτͯ͠ɺͦ͜ʹ

    ґଘϥΠϒϥϦΛอ ଘͤ͞Δ ґଘϥΠϒϥϦΛ ෳ਺δϣϒͰڞ༗ Ͱ͖ɺଟগͷґଘ ؔ܎ͷมߋʹ΋େ ͖ͳӨڹΛड͚ͳ ͍ ίϯςφ಺ͷςε τΛϧʔτϢʔβ Ҏ֎Ͱ࣮ߦ͢Δ৔ ߹ɺύʔϛογϣ ϯͷ໰୊͕ൃੜ͠ ͏Δ +BWB 4DBMB .BWFO  (SBEMF TCU  ࣄલϏϧυ ґଘϥΠϒϥϦΛΠ ϯετʔϧͨ͠Π ϝʔδΛࣄલϏϧυ ͢Δ ύʔϛογϣϯͷ ໰୊͕ൃੜ͠ͳ͍ ҰͭͰ΋ґଘؔ܎ ͕มΘΔͱΩϟο γϡ͕શΫϦΞ͞ ΕΔ 1FSM 1ZUIPO  OPEFKT ֎෦Ωϟογϡ ΩϟογϡΞʔΧΠ ϒΛ࡞੒͠4ͳͲ ͷ֎෦ϦϙδτϦʹ อଘ͠ɺςετ࣮ߦ ࣌ʹμ΢ϯϩʔυ͢ Δ Ϗϧυπʔϧ͕ࣗ લͰґଘؔ܎Λղ ܾ͢ΔΑΓѹ౗త ʹૣ͍  ֎෦ΩϟογϡΛ ࣗલͰϝϯς͢Δ ඞཁ͕͋Δ 4DBMB TCU 
  6. ワークスペースをマウントする # Dockerfile WORKDIR /opt/app $ docker run --rm –v

    $(pwd):/opt/app test-image <test command> •  ϝϦοτ – ςετ࣮ߦޙʹ͙͢ʹίϯςφΛ࡟আͰ͖Δ •  σϝϦοτ – ύʔϛογϣϯ໰୊͕ൃੜ͠͏Δ
  7. ワークアラウンド#1 # run.sh su test-user –c “py.test tests –-junit-xml=/var/tmp/results.xml” cp

    –p /var/tmp/results.xml . $ docker run --rm –v $(pwd):/opt/app test-image ./run.sh •  ςετ࣮ߦϢʔβͰॻ͖ࠐΈग़དྷΔͱ͜Ζʹ ݁ՌΛॻ͘ •  ϧʔτϢʔβͰͦͷ݁ՌΛϗετσΟϨΫτ Ϧʹίϐʔ͢Δ
  8. ワークアラウンド#2 •  ςετΛ࣮ߦ͍ͯ͠ΔؒͷϗετσΟϨ ΫτϦͷΦʔφΛมߋ͠ɺ࣮ߦޙʹݩʹ ໭͢ # run.sh chown test-user .

    su test-user –c “py.test tests” chown $1 . $ docker run --rm –v $(pwd):/opt/app test-image ./run.sh $(id -u)
  9. 実⾏結果をコンテナから取り出す # Dockerfile WORKDIR /opt/app COPY . /opt/app $ UNIQUE_NAME=“TEST_${GIT_COMMIT}_$(date

    +%s)” $ docker run --name=${UNIQUE_NAME} test-image <test command> $ docker cp ${UNIQUE_NAME}:/opt/app/build/test-result/ test-result $ docker rm ${UNIQUE_NAME} •  ύʔϛογϣϯͷ໰୊͸ൃੜ͠ͳ͍͕ς ετͷ࣮ߦεςοϓ͕ෳࡶ
  10. インハウスツールを Dockernize $ /usr/local/bin/upload-static-s3 ROOT.war –b <cdn-bucket> # Dockerfile ENTRYPOINT

    [“/usr/local/bin/upload-static-s3”] $ docker run --rm <in-house-registory>/upload-static-s3 ROOT.war – b <cdn-bucket>