前回の記事では CircleCI を使った Kubernetes へのアプリケーションへデプロイする記事を書きました。
これはこれでよかったのですが、次の2点で少し悩んでいました。
- docker build のキャッシュを有効にするのは有料
- job を手動でトリガーしずらい
後者に関しては API が提供されていてそこにリクエストする job を起動することはできます。
ただ手動で実行する時は job 内の環境変数を一時的に変更したかったりするので、その度にCircleCIの環境変数を変更するのは少し面倒でした。
これは運用でカバーで良いのですが、前者は結構つらくて、毎回キャッシュなしでビルドしているようなものなのでそこそこ時間がかかります。
お金をかければDocker Layer Caching (DLC)を有効にして docker build でキャッシュをきかせることができるので良いですがお金がかかる。。。
ということで 無料で使えて docker buildで良い感じにキャッシュしてくれて、手動実行も良い感じにしてくれる 方法を探しました。
Codefresh
前回も検討にはいれていたけどその時は不具合で使えなかった Codefresh を使うことにしました。
Codefresh は CI/CD pipeline のプラットフォームを提供するサービスで2016? 2017? 年からあるっぽい
Pricing
まず気になる料金ですが、プライベートで使う分には問題ないくらいの機能を無料で使えるようになってます。
よくあるやつだと xxx 時間は無料!みたいな感じですが、 Codefresh はその制限がないようです。
Codefresh は処理を並列で走らせることができるのですが、無料枠の時はそれができません。
現状の僕の使い方だと特に直列で実行するものだったのであまり問題はないですが、例えば Rails の Rake タスクを いくつか同時に実行して全部成功したら次の処理みたいなパイプラインをくみたい時はちょっと困るかもしれません。
手動で実行
Codefresh はパイプラインを手動で実行することも出来てブラウザからだと↓な感じでモーダルが開いて手動実行したこの回だけ環境変数を指定するみたいなこともできます。
さらに Codefresh は CLI も提供していて↓な感じで pipeline を実行することができます。
# 認証 $ codefresh auth create-context --api-key ${CODEFRESH_API_KEY} # hoge という pipeline を実行して環境変数に HOGE=fuga を指定する $ codefresh run hoge -v HOGE=fuga
docker build 時のキャッシュ
The Docker daemon used in a pipeline caches all layers by default (exactly as you would build images in your local workstation).
ドキュメントにも書かれていますが何もしなくても docker build 時にキャッシュがききます!!!
これは嬉しい!!!!
実際にパイプラインをくんでみて
今回はこんな感じにデプロイ用のパイプラインをくんでみました。
やってることは リポジトリを clone してきて docker build して ECR にて push して kubernetes のクラスタへ manifest を apply してます。
git clone や docker build とか registry への push などは Codefresh では step と呼ばれています。
いくつかの step を stage という単位でまとめます。
基本的な step は Marketplace で公開されていて例えば git clone だとこんな感じで定義することができます。
main_clone: type: "git-clone" description: "Cloning main repository..." repo: "hatappi/hoge" stage: "clone"
ここに提供されていないことをしたい時は freestyle という step を使うと任意の docker image 上で 任意のコマンドを実行することができます。
後は各 step で生成された成果物を共有する方法ですが、 codefresh は docker engine でコンテナを立てて各 step を実行するのですが、全 step で共通の volume がマウントされるので、そこに成果物をおけば他の step で使うことができます。
参考: Sharing the workspace between build steps
最後に
今回は Codefresh を使ってデプロイパイプラインをくみました。