JJUG CCC 2019 Spring に登壇しました
学生の頃から参加していたCCCに今回登壇させていただきました!
発表資料はこちらです.
ありがたいことに当日はMルームが立ち見を含めて満員になるほどでした.
緊張してお世辞にも上手い発表とはいきませんでしたが、何か持って帰っていただけたならば幸いです.
発表内容
内容は発表資料を見ていただけば大体わかるのですが、一番伝えたかったのがパイプラインの実行方法なので、そこをアニメーションで補足します.
(SlideShareにアニメーション付きで投稿できればいいのに)
Compile -> UT -> Package -> ITa -> Publish の一連の流れを全てコンテナでやっているのが今回のポイントです.
コンテナを用いることでポータビリティーとスケーラビリティーを確保しています.
(発表の最後でも述べましたが、スケーラビリティーを本当に確保しようとするとK8s等のオーケストレーション・ツールが必要になります)
質問いただいたこと
CI/CDを取り組む上でお客様とのやり取りで苦労はないか?
もともとDevOpsに積極的なお客様ということもあり、大きな苦労はありませんでしたが工夫した点としては、MSAのAPIということで提案の段階でCI/CDの必要性は強調し、要件定義の段階からCI/CDありきでプロジェクトを進行させていました.
実装が始まってしまった段階でのCI/CD導入は時既に遅しになる可能性が高いので、要件定義の段階から取り組んでおく必要はあるように思えます.
あえてGitLab Runnerを使っていないことに意図はありますか?
アセットの標準構成(Jenkinsを使うパターン)をそのまま用いたというのが正直なところです.
後付けにはなりますが、Jenkinsを用いることでGitLabにロックインされないというポータビリティは付加されたと思います.
開発規模はどのくらいですか?
今、開発チームは9人です.
それとは別にCI/CD担当が私含め2人います.
MSAを採用していますが、開発チームは従来のモノリシックな構成なんです.
そのため、ドメインごとにチームが分割されているわけではありません.
1回のパイプラインの実行に掛かる時間はどれくらいですか?
実装途中の段階の実測値ですが、1回に5分くらい掛かっています.
最終的には倍くらいになるのではないかと思っています.
テストコード実行の長時間化を抑制するために事前に注意出来ることはありますか?
前提として、
- テスト単体の時間は短縮されることはない
(テストの実行時間がテストの充実度と比例する場合がほとんどだから) - 逆にいうと、テスト品質をトレードオフにしない
上記前提を置いた上で、レベル感の異なる観点がいくつかあると思います.
1. テスト環境の系全体の観点
テスト環境そのものにスケーラビリティーがあるかという観点です.
- 各ミドルの起動停止はSPOFにならないか
- テストデータ(テストDB)を共用していないか
- スケールアップ/アウトによって課金が発生するミドルをつかっていないか
(IaaSやPaasレベルでの課金は発生するが、テスト要件に見合うなら許容とする)
2. アプリアーキテクチャの観点
テストを並列実行できるような適切な単位に分割出来ているかという観点です.
- MSAになっているのが理想的であろう
- モノリシックであっても、.earが適切な単位で.jarに分割出来ているか
- 実装難度・保守管理性・非機能を度外視すると、分割すればするほどテストの並列実行性は上がる
3. テスト実装・CI/CD環境実装の観点
UTの実装方法やCI/CD環境の実装を如何に高パフォーマンスにするかという観点です.
- 処理性能の良いUTを書く(具体的にはわかりませんが…)
- CI/CD環境におけるDockerの起動に掛かる時間を短縮する
Docker周りについては、(1) ベースのイメージと、(2) (1)をもとにテストスクリプトを読み込むイメージの2種類用意しています(インストール等の時間がかかる処理はベースのイメージとして用意しプライベートのレジストリにプッシュしてます).
パイプラインで実行されるコンテナではFromで「ベースのイメージ」を指定し、テストスクリプトの読み込み処理を行うようにしています.
また、「最も変更されるもの(アプリコードのcopy)をDockerfileの最後に書くべし」ということで、WildflyのDockerfileも工夫しています.
以下のリンクが参考になるはずです.
知らないと損する Docker イメージのレイヤ構造とは
感想
今回の発表させていただいたテスト自動化周りですが、自分たちで言うのはなんですが、結構頑張っている方かなと思っています(笑)
なので、以下のようなコメントをいただけたことがとても嬉しかったです.
結構網羅率の高いテストをやってるんやね。 #ccc_m4
— て@Java好き (@tethon) 2019年5月18日
正常系だけでも全部やるの頑張ってると思う #ccc_m4
— て@Java好き (@tethon) 2019年5月18日
テストをどこまでやるかは常に悩みどころな気がしますが、うちはこういう考え方でここまでやってるよ、というのを示せたのではないかと思います.
そして今回の発表の本丸であったCI/CD環境は、一般化出来得る問題として、ポータビリティーとスケーラビリティーを兼ね備えたアーキテクチャを示しました. 実際に運用が本格化すると問題が出てくるでしょうし、他プロジェクトへの適用時にもプロジェクト固有の問題は必ず発生するでしょう. これは今後課題に直面した中で洗練していきたいと思います.
そして一番気になる問題としては、本当にスケールするのか?というところですね. 開発が本格化してコミットが活発になったり、ソースコードの量が増えたときに問題が起こらないか、オーケストレーション・ツールの適用は上手くいくのか、その辺は正直未知数なので今後の課題として検証したいと思います.
今回、貴重な機会をいただきましたJJUG幹事の皆さま、CCC運営・スタッフの皆さまに感謝申し上げます. 貴重な経験をさせていただきました.
1,200人越えの参加者とだったいうことで大変だったと思います. 本当に頭が下がります.
また、新リーダーのKeynoteでJJUG/CCCが変わっていく印象を受けました.
新しい流れに着いていけるように今まで以上に勉強しなくてはいけないという気持ちです…!
英語も技術も頑張ります.
以上です.
PS. スピーカーTシャツをさっそく使いました(笑)
かっこいいです!!