目次

  1. CI/CDについて
  2. GitHub Actionsとは何か
  3. GitHub Actionsを活用したCI/CDの実現
    ①    コードプッシュ時にテストを自動実行
    ②    リリース・デプロイを自動化
  4. GitHub Actionsのメリット
  5. 他のCI/CD実現ツールとの比較
  6. 感想・まとめ
     

1. CI/CDについて

CI/CDという開発手法はアジャイル開発時の課題(頻繁なテスト・ビルド・デプロイによるコスト)を解決するのに最適な手法であり、アジャイル開発によって増えた作業を一部自動化することでより正確に、より効率よく進められます。
開発に自動化を導入することで、アプリケーションを頻繁に提供することや、チーム全体の生産性向上を図ることができます。

以下にCIとCDのそれぞれの意味を紹介します。

 

  • CI

Continuous Integration(継続的インテグレーション)の略で、ソフトウェアのビルドやテストを自動化して頻繁に実行することでソフトウェアの品質向上や開発効率化を目指す手法。

 

  • CD

Continuous Delivery(継続的デリバリー)の略で、CIに加えてリリースやデプロイまで自動化する手法。

 

簡単に言うと、CIはソフトウェアのビルド、テストを自動化すること、CDはそれに加えてリリースやデプロイまでを自動化することです。

実際に私の参画しているプロジェクトもアジャイル開発でCI/CDを導入しており、以下のような場面で役に立っていると実感します。

  • コードプッシュ時に自動でテストが実行されることでコードの品質を保つことができる
  • ヒューマンエラーを防いでテスト環境や本番環境にデプロイができる

今回は私が実際に活用しているCI/CDを交えながらその手法やメリット・デメリットについて紹介します。

2. GitHub Actionsとは何か

GitHub Actions(GHA)はGitHubの提供するサーバー上に用意された仮想マシン内でビルド・テスト・デプロイを自動で実行できるプラットフォームです。
ワークフローを作成することで、リポジトリに対するコードのプッシュやプルリクエストの操作、指定時刻などをトリガーとしてテストや運用環境へのデプロイなどを自動化できます。
ワークフローとは1つ以上のジョブ(処理)を実行できる自動化プロセスのことを指し、YAML形式で定義されます。
ワークフロー内ではシェル経由で任意のコマンド実行や、定義済みの処理実行が可能です。

 

以下の図がワークフローの構成になります。

  • Event:ワークフロー実行のトリガー。トリガーできるイベントについてはこちらで詳しく紹介されています。
  • Runner:ワークフローがトリガーされると実行されるサーバー。一度に一つのJobを実行することができ、Linux、Windows、macOS ランナーが提供されている。別のオペレーティング システムまたは特定のハードウェア構成が必要な場合、独自のランナーをホストできる。
  • Job:同じランナーで実行される、ワークフロー内で実行されるシェル スクリプト、または実行される アクションのまとまり。

公式サイトにはより詳しいGHAの概要が説明されているため、こちらを参照してください。
 

図1:GHAのコンポーネント

3. GitHub Actionsを活用したCI/CDの実現

次にGHAの活用方法を簡単に紹介します。

 

  • コードプッシュ時にテストを自動実行(CI)

コードのプッシュ時にテストが自動で実行できます。
こちらはワークフロー定義でコードのプッシュをトリガーに設定し、メインとなる処理(job)で指定したシェルが実行されることでテストが自動実行されます。
コードのプッシュ後、CIでエラーがないこと一目で確認することができ、漏れなくCI(テスト)の実行結果を確認することができることでコードの品質に問題がないか確認できます。
 

図2:CI実行後エラーがない場合

図3:CI実行後エラーがある場合

  • リリース・デプロイを自動化(CD)

アプリデプロイ時にワークフローを使用して各環境へのデプロイ作業の実施ができます。
こちらはワークフロー定義でデプロイ時に設定したいパラメータを設定できるように記述し、デプロイ先の環境ごとに設定するパラメータを変えることで複数の環境に同一のワークフローでデプロイできるようになっています。
実行時に指定した任意のブランチ/タグがデプロイ対象となり、ワークフローに定義した処理を実行してデプロイしたい環境に向けてデプロイを行います。
セキュアな情報を必要とする場合は、GitHub上に格納しておき必要に応じて参照することも可能です。
アジャイル開発の場合、複数の開発環境にむけて複雑かつ頻繁にデプロイを行うことがあります。ですが、GHAを使用することで異なる環境へのデプロイでもワークフロー実行時のパラメータを変更するだけよいため、ヒューマンエラーを防ぐことができ、同一のワークフローを使用することで作業の簡素化が可能です。

4. GitHub Actionsのメリット

GHAについて簡単な概要を紹介しましたが、GHAを導入するメリットとして以下があります。

 

1.手軽である

usesというGHAのMarketplaceにて一般公開されているアクションも使用することができ、自分で処理を書かずにワークフローを実行できます。
他にもこちらのリポジトリでGHAのワークフロー設定例が公開されており、ワークフロー作成をスムーズに進めます。

図4:GitHub Actions Marketplace

図5:リポジトリで公開されているYAMLファイル

2.    ヒューマンエラーを防ぎつつ、手軽に作業を行える

異なる環境へデプロイする場合でもワークフロー (処理)は毎回同じものを使用し、パラメータを環境に合わせて変えるだけでよいため実行手段を統一できます。
また、可変の部分のみをパラメータとして設定でき、本番環境に向けたデプロイ時には承認を得るステップを追加するなどヒューマンエラーの削減に効果があります。


3.    GHAのみで完結できる
セキュアな情報をGitHubに格納し、それをワークフローの実行時に参照することができるため、他のクラウドサービスがなくても導入が可能です。


4.    他のサービスを組み込みやすい
Azureなど他のクラウドサービスから情報を取得したい場合でも、外部サービスを参照するシェルを用意すれば参照できます。
また、必要に応じてslackへ通知を送るなど外部サービスへの連携も可能です。

 

私が一番大きく感じるメリットは2のヒューマンエラーを防ぎつつ、デプロイを手軽に行うことができる点です。
複数の環境に向けて頻繁なデプロイを行う上で最小限の設定項目(パラメータ)を変更するだけでよく、初めて行う作業者でも比較的簡単にデプロイ作業を行えます。
また、一度ワークフローを作成しておけば、複数の環境に向けたデプロイを自動化することが出来るため、デプロイに関わる手間を省けます。

5. 他のCI/CD実現ツール

GHAのメリットについて紹介しましたが、他のクラウドサービスが提供しているCI/CDツールと比較したメリット・デメリットについても簡単に紹介します。

 

  • Azure Pipelines

AzureにはAzure Pipelinesというツールがあり、これでCI/CDを実現できます。
Azure PipelinesはGHAと同様にYAMLファイルでワークフローを定義し、GitHub上のリポジトリに操作することで自動的にパイプラインを実行し、アプリケーションのビルド、およびビルドしたアプリケーションの実行環境へのデプロイ・展開が可能です。
GHAと比較するとAzureの他サービスとの連携が可能である点やログが永続的に保持されることなどがメリットであり、実現できる内容はGHAと大きな相違はありません。

 

  • AWS CodePipeline

AWS CodePipelineでは、ワークフロー(処理)はUIから手動で定義するかAWSのサービスであるCloudFormationで定義し、AWSの各種サービスとの連携が可能です。
AWS内の他ツールとの連携が柔軟であり、AWS内の他ツールにログを連携し分析、保持し、AWS内でCI/CD+αの処理を完結できます。ですが、AWS CodePipelineではAWS内で完結することがベストプラクティスとされているため、GitHubのリポジトリへの操作をトリガーとした自動実行は推奨されておらず、Azure Pipelinesと比較するとAWS内で完結することが重視されており他社ツールとの連携やカスタマイズ性は劣る部分があります。

 

  • GitHub Actions

Azure PipelinesとAWS CodePipelineと比較すると、GHAはGitHubとの直接的な統合によりリポジトリ内でCI/CDの設定が可能であるため、シームレスな開発フローの実現が可能です。リポジトリ内でCI/CDを実現できるためコストを抑えることもでき、自由に必要な実行環境を設定することができるのもメリットです。ですが、ログの保持期間があることや、CI/CDの実行結果から他の処理の実行、ログを活用した分析などはGHA内では実現することはできません。その点ではクラウドサービスの提供するCI/CDツールが優れているといえます。

6. 感想・まとめ

今回はGHAについてご紹介しました。
GHAを活用することで、アジャイルでの開発作業に伴う頻繁なテスト実行やデプロイ作業の自動で行いつつ、コードの品質を高めることができ、ヒューマンエラーの防止にも繋がります。また、ワークフローの設定例やライブラリなどもあるため手軽に導入でき、柔軟に使うことができる点もメリットとして挙げられます。
GHA以外のツールでも、どのツールでCI/CDを実現するかによってできることが変わってくるため、プロジェクトにあったツールを使用することで更なる生産性向上が可能です。
今回はGHAでのCI/CD導入事例やメリットについて紹介しました。本記事がCI/CD導入のきっかけになればと思います。