Use parallel steps in your Codefresh pipelines - Codefresh
無料プランでももちろん並列実行できます。
試してみた結果
iutest で試してみた結果がこちら。もともとしていた、「benchmark test」に加えて、gcc の複数バージョンの docker コンテナでテストを実行しています。
YAML はこちらです。
version: '1.0' stages: - checkout - build - test steps: main_clone: title: Cloning main repository... type: git-clone stage: checkout repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' revision: '${{CF_REVISION}}' BuildingDockerImage: title: Building Docker Image stage: build type: build image_name: srz-zumix/iutest working_directory: ./ tag: '${{CF_BRANCH_TAG_NORMALIZED}}' dockerfile: ./tools/docker/Dockerfile RunningUnitTests: type: parallel stage: test steps: BasicTest-gcc9: &basic_test title: Running Basic Tests - gcc9 image: gcc:9 environment: - OUTDIR=gcc9 commands: - mkdir test/${OUTDIR} || true - make -C test clean - make -C test test BasicTest-gcc8: <<: *basic_test title: Running Basic Tests - gcc8 image: gcc:8 environment: - OUTDIR=gcc8 BasicTest-gcc7: <<: *basic_test title: Running Basic Tests - gcc7 image: gcc:7 environment: - OUTDIR=gcc7 BenchmarkTest: title: Running Benchmark Tests image: '${{BuildingDockerImage}}' working_directory: IMAGE_WORK_DIR entry_point: - /bin/sh - /codefresh/volume/cf-generated/unit_test_script create_file: path: /codefresh/volume/cf-generated name: unit_test_script content: |- cd /codefresh/volume/iutest cd test make -C benchmark make bench on_success: metadata: set: - '${{BuildingDockerImage.imageId}}': - CF_QUALITY: true on_fail: metadata: set: - '${{BuildingDockerImage.imageId}}': - CF_QUALITY: false
※執筆時現在は構成が異なってます。
※さらに使ってみてどうだったのかは別途書きたいと思ってます。
やり方
上記の YAML を例に説明していきます。詳細は公式のヘルプを見てもらったほうが良いと思います。
といっても基本的には type を parallel にするだけなんですけどね。
下記のように、type: parallel にしたら steps: 以下に並列実行するステップを書くだけです。
RunningUnitTests: type: parallel stage: test steps: BasicTest-gcc9: &basic_test
ハマったこと・感想など
以下は、導入してみて躓いたところと感想を書いていきます。git-clone したパスは共有
並列コンテナで同じ場所を使います。なので、作業が競合するような場合は注意が必要です。
iutest でも、ビルド結果の出力先が同じだったため問題になりました。
各並列コンテナごとにワークスペースを用意するなどしたほうが良さそうです。
キャッシュ
キャッシュがあるので、クリーンビルドを想定しているとハマるかもしれません。https://codefresh.io/codefresh-news/parallel-pipelines/
Codefresh runs a git reset and a git clean in your project repository everytime a pipeline starts. This means that all artifacts that you wish to be cached should be in your .gitignore file. A common example would be the node_modules folder. If you don’t place it in .gitignore, it will be deleted at the start of each build making it much slower.
git reset; git clean を行うので、.gitignore で無視指定されているものは残ったままになります。iutest ではたまたまテストのビルド結果が .gitignore にかかれていたため、キャッシュされていました。
これのおかげで爆速でテストできてました。
ただ、今は clean ビルドするようにしてます。
(※現在はどの程度のテストが並列でできるか検証しているので、ゆくゆくはキャッシュ使っていきたい)
明示的にクリーンビルドをしてあげる、またはキャッシュを利用してビルド速度を上げるなど、使いみちに合わせた運用が必要です。
Join ができる
まだ使ってないんですが、Join ができるのはかなり嬉しい。
(wercker で join ができないのがつらくてな・・・)
最後に
今(なぜか)、フリートライアル中なので今のうちにいろいろ試してみたいと思います。また、Free Plan になったときのことも考えて検証していく予定。
(すでに、SMALL RESOURCE キツイ・・・となってるので頑張る予定・・・)
0 件のコメント:
コメントを投稿