こんにちは、技術本部 OpenSaaS Studioでサーバサイドエンジニアをしている安里です。2019年5月に開催された社内勉強会のレポートをお届けします。

技術本部ではエンジニアの技術向上を目的として定期的に勉強会を開催しており、
今回は同じくOpenSaaS Studioのメンバーである安井さん(@gkuga)に講師をお願いし、ProwというKubernetesベースのCI/CDシステムの勉強会を行いました。

勉強会の様子

Prowについて

勉強会の前半では、こちらの資料をもとにProwの成り立ちや機能、仕組みが説明されました。

KubernetesのCI/CDは元々Jenkinsで行なっていましたが、以下のような運用上の課題を抱えており、これらを解決するためにProwが開発されたとのことです。

  • Jenkinsのバージョンを上げる際に全ノードを停止する必要がある
  • Githubと連携するのが難しい
  • スケールアウトが難しい
  • スレーブ接続が切れた後の復旧が手間
  • デバッグの属人化

Kubernetesはスケールアウトが容易で、コンテナの自動回復など耐障害性に優れた特性を持ち、スケジュールや設定の管理などCIに必要な機能が既に存在していたことから、Prowのプラットフォームとして採用されたとのことでした。

また、Prowは様々な点でKubernetesの仕組みをうまく利用しているとのことですが、CIのジョブをProwJobというCRDとして定義し、ProwJobを元に作成したPodの実行結果をProwJobのステータス(=ジョブのステータス)として扱う点が特に興味深かったです。

Prowのアーキテクチャ図:CI/CDを実現するために様々なマイクロサービスが組み合わされている。
Prowのアーキテクチャ

機能面ではGithubボットを使ったPRに対するオペレーションが特徴的で、ワークフローやマージの自動化、 “/foo” 形式のコマンド実行が可能とのことです。
例えば、PRを作成すると自動でレビュアーを割り当てたり、 “/kind bug” とコメントするとbugラベルが設定されたり、全てのチェックにパスすると自動でマージしたり、といったことができ、Pluginを追加することで機能の追加も可能になるようです。
私がジョインしているプロジェクトでもProwを使っていますが、PRだけでオペレーションができ、その履歴やCIの結果が集約されるためPRだけに集中して快適に開発できています。

PRの一部を抜粋した画像:PRに/holdとコメントするとbotがdo-not-merge/holdというラベルを設定している。その後、レビュー指摘に対応して/hold cancelとコメントするとbotが先ほど設定したラベルを削除している。holdラベルが取り除かれたのでレビュアーが内容を確認して/approveとコメントすると、PRの確認が完了したのでbotがマージなどの後続処理を進めている。
holdラベルを設定してレビュー指摘に対応後ラベルを外し、レビュアがapproveしたところ

ハンズオン

勉強会の後半では、こちらの資料を元にGKEにProwを構築してPRの自動マージを試してみる、というハンズオンを行いました。

ハンズオンの最中にTerraformがうまく反映できなかったり、GCPの無料枠が上限を迎えたり、といったトラブルがありましたが、slackで参加者同士アドバイスしあって解決しながら進んでいきました。
Prowをデプロイする、プラグインを使ってみる、ジョブを作る、自動マージを試す、という4つのステップがありましたが、私はトラブル対応に時間がかかってしまい1ステップ目のProwをデプロイしたところでタイムアップとなりました。

懇親会

懇親会では寿司やピザが振舞われ、参加者の体験談や色々なCI/CDシステムについての議論などで盛り上がりました。

懇親会の様子

最後になりますが、勉強会を開催して頂いた関係者の方々、および講師の安井さんありがとうございました。

ryo_asato
2017年中途入社。OpenSaaS Studio所属のサーバサイドエンジニアです。課金基盤系のシステムを担当した後、現在は画像配信システムの開発をしています。