テスト自動化のメリット
読者の方にずばり質問させてください。
「テスト書いてますか?」
Yesの方はここはスキップしても大丈夫です。Noの方はもう少しだけお付き合いください。
筆者の経験上、CI/CDを活用していない場合、テストそのものを書いてないことが多い気がします。そのようなプロジェクトではテストは手動で行われます。自動化されたテストの重要性についてはすでに多くの情報があるので割愛しますが、ここではCI/CDの視点から自動化テストを始めるメリットについて解説したいと思います。
よくある誤解として、自動化するテストが少なければCI/CDを導入するメリットは少ないという考えがありますが、これはまったくの逆です。仮にテストがまだ存在しなくても、プロジェクトの初期状態からCI/CDを導入するべきです。CI/CDは建築に例えれば、基礎に分類される部分です。建物がある程度できたあとで基礎部分の変更が難しいように、プロジェクトが進んだ時点でCI/CDの導入するのは簡単ではありません。
まだCI/CD上で実行するテストがない場合は、まずはテストケースを1つ作成して同時にCI/CDの設定もしましょう。これができれば、CI/CD活用への大きな一歩を踏み出したことになります。あとは少しずつテストカバレッジを高めていけばいいのです。
また、常にパスした状態のCI/CDが保たれるというのは気持ちがいいものです。CI/CDでテストが通るようになったら、プロジェクトのREADMEページにCI/CDのステータスバッジを追加することをおすすめします。ステータスバッジとは、現在のCI/CDの状態を表示する埋め込みコードのことです。ステータスバッジを付けることで品質の見える化が進み、チームの意識を高めることができます。以下はFacebookのReactのREADMEです。

CI/CDは自動化ツール
コンピューターの本質がそうであるように、CI/CDの本質も自動化にあると思います。今まで手動でやっていた作業を自動化することにより、開発者はより大切な作業に時間を使うことができるようになります。ここでは簡単にCI/CDで自動化できるタスクを見てみましょう。
1つ目はテスト実行の自動化です。最近のCI/CDサービスやツールはGitHubなどのVCS(バージョン管理システム)サービスと連携していて、開発者が変更を加えるたびに、CI/CDが自動でテストを実行してくれます。また連携するCI/CD上ですべてのテストをパスしないと変更をメインのブランチにマージできないような機能もあり、これを活用すればテストが失敗したとき、その変更点を作成した開発者に修正を強制できるので、リグレッションなどを防ぎやすくなります。
以下はGitHub上で静的解析(ci/circleci: lint)のジョブが失敗しているためマージがブロックされているところです。

2つ目はリリースの自動化です。リリース作業は運用チームや開発者が手動で行うのが一般的ではないでしょうか? リリースを自動化することで工数を減らせるだけではなく、ヒューマンエラーも失くすことができます。
リリースの自動化にはいくつかのステージがあり、常に本番環境へリリース可能な状態にしておき、実際のデプロイは手動で行うこともあれば、CI/CDで一気にデプロイまでする場合もあります。どのステージがいいかは組織やプロダクトの性質ごとに異なるので一概には言えませんが、デプロイの自動化をすることで、さまざまなメリットがあります。これは大事な点なので後ほど詳しくお話しします。
3つ目にその他もろもろの作業の自動化です。コードのコンパイル、静的解析、依存関係のアップデートはもちろん、CI/CDを使うことで、さまざまなことを自動化できます。CI/CDを始めようと検討中の方に時々聞かれるのが、テストがない静的サイトのビルドができるかというご質問ですが、もちろん可能です。最近のCI/CDサービスやツールはとても柔軟に作られているので、静的サイトのビルドにかかわらず、ほとんどの作業をCI/CD上で自動化できます(ハードウェアに依存する作業などはCI/CDサービスによってはできない場合もあります)。
中には、CI/CDを使って小説の出版を行ったり、脆弱性を検知してインフラのサーバーへ自動でセキュリティアップデートをかけたりするなどの面白いの使い方をしている方ともお話したことがあります。このようにCI/CDでできることはたくさんあるので、自動化したいタスクを思いついたときは、まずCI/CDを使えないか検討してみましょう。
