Github Actionsを導入して生産性UP!
Github Actionsをご存知でしょうか?
弊社では複数の案件の開発時に導入・活用することで、開発チームは手動での作業から解放され、時間と労力を節約することができます。その結果弊社の開発生産効率が格段に向上しています。
今回は、Github Actionsとは何かから利点、基礎知識などを含め、弊社で導入しているケースの紹介とともに生産性の向上に焦点を当ててまとめていきます。
Github Actionsとは?
Github Actionsは、GitHub上でCI/CD(継続的インテグレーション/継続的デプロイ)を実現するための自動化ツールです。
GitHubのリポジトリ内で動作し、Workflow(ワークフロー)と呼ばれる設定ファイルを使用して、ビルド・テスト・デプロイ・通知などのさまざまな作業を自動化することが可能です。
GitHub Actionsの利点って何?
Github Actionsは、開発者が効率的にCI/CDを実現し、開発プロセスをスムーズにするための優れたツールです。
Github Actionsには以下のような利点があります。
シームレスな統合
Github ActionsはGitHubとシームレスに統合されています。
リポジトリ内で直接利用でき、GitHubのインターフェースから簡単に設定や管理が可能です。
ワークフローの自由度
Actionsでは、ワークフローを柔軟に定義できます。
ビルド、テスト、デプロイなどのステップを自由に組み合わせることが可能です。
多様なトリガー
Actionsはさまざまなトリガーをサポートしています。
プッシュ・プルリクエスト・スケジュールなどのイベントに反応して、実行することができます。
パブリックおよびプライベートのリポジトリで利用可能
Actionsはパブリックおよびプライベートのリポジトリで利用することができます。
開発者はオープンソースプロジェクトや企業内のプライベートプロジェクトで同様の自動化を実現することが可能です。
コミュニティのサポート
Actionsは広範なコミュニティのサポートを受けており、多くのアクションやワークフローのテンプレートが利用できます。
開発者は既存のベストプラクティスに基づいて自動化を迅速に実装することができます。
なぜCI/CDツールを導入するのか
Github Actionsの導入の前にまずCI/CDツールについて整理しておきましょう。
CI/CDツールは現代のソフトウェア開発において効率化・品質向上・迅速なデプロイ・チームの協力・安定性の確保など、さまざまな利点を提供してくれます。
自動化と効率化
CI/CDツールは、ソフトウェア開発プロセスの自動化と効率化を支援してくれます。
ビルド、テスト、デプロイなどのタスクを自動化することで、開発者は手動作業や繰り返しのタスクから解放され、時間と労力を節約できるのです。
継続的な品質向上
CI/CDツールは、ソフトウェアの品質管理に役立ちます。
コードのビルドやテストを自動化することで、エラーや問題の早期発見が可能です。
また、継続的な統合とデリバリーによって、品質の向上やバグの早期修正が促進されます。
迅速なデプロイメント
CI/CDツールは、ソフトウェアの迅速なデプロイメントを実現してくれます。
自動化されたビルドやデプロイプロセスによって、新機能や修正のリリースが容易になり、開発チームはクライアントニーズや市場の要求に素早く対応できます。
チームコラボレーション
CI/CDツールは、複数の開発者やチームの協力をサポートします。
ソースコードの共有・バージョン管理・自動マージなどの機能により、チームメンバーはシームレスに協力し、統一された開発プロセスを確保できます。
安定性と信頼性
CI/CDツールは、デプロイプロセスの安定性と信頼性を高めてくれます。
自動化されたテストやデプロイの手順によって、人為的なミスや人手による誤った設定を最小限に抑えることができます。加えて、ロールバックや回復策の自動化によって、システムの安定性を確保できます。
なぜGithub Actionsなのか
もちろん、世の中に存在するCI/CDツールはGitHub Actionsだけではありません。
Jenkins、CircleCI、Travis CI、GitLab CI/CDなど、様々なツールが存在します。その中でも弊社がGitHub Actionsを採用した理由は、以下の3つです。
- バージョン管理でGitHubを使用しているため、GitHub Actionsとの相性が良い点。
- ワークフローの柔軟性とカスタマイズ性により、複数の案件が存在する弊社においても、特定のプロジェクトやチームのニーズに合わせた最適なプロセスを作り上げることができる点。
- オープンソースエコシステムであり、多くのコミュニティがアクションやワークフローテンプレートを共有している点。
自動化と効率化の重要性を認識し、GitHubの利便性と組み合わせることで、開発プロセスの改善と高品質なソフトウェアの提供を実現しています。
Github Actionsの基礎知識
Github Actionsの動作原理
導入にあたりGitHub Actionsの動作原理はを理解しておく必要があります。
GitHub Actionsは、以下のような流れで構成されています。
①トリガーの設定
②ワークフローの定義
③ジョブとステップの実行
④環境の設定
⑤ログと通知
まず、 ワークフローの実行をトリガーする条件を指定します。
例えば、新しいコードのプッシュ、プルリクエストの作成、タグの作成などがトリガーとなります。
次に、ワークフローをYAML形式で定義します。
この定義ファイルには、ワークフローの名前、トリガー条件、実行するジョブやステップ、環境変数、デプロイ先などの情報が含まれます。
ここまでできたら、ジョブとステップの実行を行います。
ワークフローは複数のジョブで構成されます。各ジョブは一連のステップで構成され、ステップは特定のコマンドやアクションを実行します。
例えば、ソースコードのビルド、テストの実行、Dockerイメージの作成などが含まれます。
そして、環境の設定として、実行環境を指定します。
GitHub Actionsはデフォルトでいくつかの環境(Linux、Windows、macOS)を提供しており、各ジョブはこれらの環境で実行されます。また、独自のランナーを使用して独自の環境を定義することも可能です。
最後に、ログと通知です。
ワークフローの実行中および完了後、実行結果やログはGitHub上で確認することができます。また、実行の進捗や結果に応じて通知を受け取ることもできます。
GitHub Actionsは、これらの要素を組み合わせることで、ソフトウェア開発のさまざまな自動化タスクを実行してくれます。
ワークフロー、ジョブ、ステップって何?
それでは、先ほどの動作原理で出てきた要素について解説していきます。
ワークフロー(Workflow)
ワークフローは、一連のタスクや手順のフローを定義するものです。
YAML形式で記述され、リポジトリ内の特定のイベントやトリガーに基づいて実行されます。ワークフローは、複数のジョブで構成される場合もあります。
ジョブ(Job)
ジョブは、ワークフロー内の個々の作業単位です。
ジョブは独立して実行され、並列または直列に配置することができます。通常、ジョブは特定の目的やタスクに関連するステップのグループを含んでいます。
ステップ(Step)
ステップは、ジョブ内の個々の実行単位です。
ステップは、特定のコマンドやアクションを実行します。例えば、ソースコードのビルド、テストの実行、デプロイの手順などがステップとして定義されます。
ステップは直列に実行され、前のステップが完了すると次のステップが実行されます。
アクション(Action)
アクションは、ステップ内で実行される個々のコマンドやタスクです。
アクションは、再利用可能な単位であり、GitHub Marketplaceや公開されたリポジトリから取得できます。例えば、特定のビルドツールの使用や外部サービスとの統合など、さまざまなタスクを実行するためにアクションを使用することができます。
イベント(Event)
イベントは、ワークフローのトリガーとなるアクションです。
例えば、新しいコードのプッシュ、プルリクエストの作成、タグの作成などがイベントとして機能します。イベントによってワークフローがトリガーされ、定義されたジョブやステップが実行されます。
効果的なワークフローの設計
ワークフロー設計思想時に重要な6つのポイント
効果的なワークフローを設計するためにいくつかポイントがあります。
ポイント①:ワークフローの目的を明確にしましょう。
何を達成したいのか、必要なタスクや手順は何かを具体的に定義します。
ポイント②:ワークフローは1つの目的や責務に集中するように設計しましょう。
複数の目的を持つワークフローは複雑化しやすくなり、管理やトラブルシューティングが難しくなります。
ポイント③:ワークフロー内のステップは必要最小限に抑えましょう。
冗長な処理を省き、実行時間を短縮します。また、ステップの最小化は可読性とデバッグの容易さにも影響します。
ポイント④:関連性の低いジョブやステップは並列に実行しましょう。
これにより、実行時間の短縮と効率の向上が期待できます。
ポイント⑤:ワークフロー内で使用するコードや設定は再利用可能にしましょう。
一度作成した設定やアクションを他のワークフローでも利用できるようにし、一貫性を保ちつつ作業量を削減します。
ポイント⑥:ワークフローの設計後はテストとデバッグを必ず行いましょう。
ワークフローが意図した通りに動作するか確認し、必要に応じて修正や改善を行います。ログやステップの出力を活用して問題を特定し解決します。
上記のポイントを押さえて設計することで、目的に合わせたシンプルで効果的なワークフローを作成することができます。
ポピュラーなGithub Actionsユースケース
ここまで基本知識について解説しました。
次に導入についてですが、実際のところGithub Actionsをどう使うかは開発者の想像力次第です。
とはいえまだ導入したことがない方からすれば基となるユースケースは知りたいところ。
そんな方のためにポピュラーなユースケースと弊社のケースを紹介いたします。
自動テストやビルド、デプロイのワークフロー例の紹介
アプリケーションの自動テスト、ビルド、デプロイのワークフロー
※React(Next.js)+TypeScript
name: テスト、ビルド、デプロイ on: push: branches: – main jobs: build: runs-on: ubuntu-latest steps: – name: リポジトリをチェックアウト uses: actions/checkout@v2 – name: Node.jsのセットアップ uses: actions/setup-node@v2 with: node-version: ’18’ – name: 依存関係のインストール run: yarn install – name: テストの実行 run: yarn test – name: アプリケーションのビルド run: yarn build – name: デプロイ uses: vercel/action@v21 with: github_token: ${{ secrets.GITHUB_TOKEN }} vercel_token: ${{ secrets.VERCEL_TOKEN }} |
このワークフローでは、以下のような処理が行われます。
①リポジトリをチェックアウト。
②Node.jsのバージョン14をセットアップ。
③必要な依存関係をインストール(yarn install)。
④テストを実行(yarn test)。
⑤React(Next.js)アプリケーションをビルド(yarn build)。
⑥VercelのGitHub Actionsデプロイアクション(vercel/action@v21)を使用して、ビルドされたアプリケーションをデプロイ。
※このアクションでは、GitHubのトークン(${{ secrets.GITHUB_TOKEN }})とVercelのトークン(${{ secrets.VERCEL_TOKEN }})が必要です。
該当するトークンをGitHubリポジトリのSecretsに設定する必要があります。
このワークフローのトリガーは、mainブランチにプッシュされたタイミングです。
テストの実行、アプリケーションのビルド、そしてVercelを使用してデプロイまでを自動化することで、React(Next.js)TypeScriptアプリケーションの品質管理とスムーズなデプロイを実現しています。
弊社のユースケース
弊社では、以下のケースでGithub Actionsを使用しています。
※自社で導入したものの他に、参画前から導入されているものも含みます。
- リモートブランチにPushした際、ユニットテストとビルドテストを行うことでバクを早期発見し、品質をする
- 開発ブランチにプルリクエストがマージされたことをトリガーに、検証ブランチに対して一括プルリクエストを作成することで、シームレスなコードレビューと効率的なデプロイ準備を実現し、検証リリースの生産性を向上する
- 開発環境・検証環境・商用環境へのリリース作業を自動化することで、迅速なデプロイを実現し品質の向上・一貫性を確保する
カスタムアクションとベストプラクティス
カスタムアクションとは?
カスタムアクションとは、GitHub Actionsの一部であり、プロジェクト固有の処理やタスクを再利用可能な形で共有し、自動化するためのカスタマイズ可能なコードパッケージです。アクションは「Docker」「JavaScript」「複合アクション」の3種類があります。
既存のアクションの組み合わせではワークフローを適切に記述することが難しく、結果としてワークフロー内に多くのシェルコマンドを追加してしまい、メンテナンスが困難になる場面に遭遇することがあります。
カスタムアクションを作成することで、ワークフローの作成を効率化することが可能です。また、より簡潔で保守性の高いワークフローを構築することができます。
ワークフローの可読性とメンテナンス性を向上させるベストプラクティス
以下のベストプラクティスを適用することで、ワークフローの可読性とメンテナンス性を向上させ、効果的なCI/CDパイプラインの構築ができます。
- ドキュメント化
ワークフローの目的や手順を明確にするため、コメントやドキュメンテーションブロックを追加しましょう。
- 名前付け
ジョブ、ステップ、ワークフローの要素に意味のある名前を付けることで、読みやすく理解しやすいワークフローを作成しましょう。
- ワークフローテンプレートの使用
同様のタスクや処理が複数のワークフローで使用される場合、再利用可能なワークフローテンプレートを作成して共有しましょう。
- ワークフローの分割
長大なワークフローを複数のファイルやステップに分割することで、可読性とメンテナンス性を向上させましょう。
- 統一されたフォーマット
ワークフローの記述に一貫性を持たせるため、インデント、スペース、キーワードの使用などのフォーマットルールを定義しましょう。
- バージョン管理
ワークフローファイルをバージョン管理システムで追跡し、変更履歴を管理しましょう。
これにより、変更の追跡とロールバックが容易になります。
- テストとデバッグ
ワークフローを実際にテストし、必要な修正や調整を行いましょう。
デバッグ用のログステップや条件分岐を追加して、トラブルシューティングを容易にしましょう。
- セキュリティと権限管理
ワークフロー内の敏感な情報やアクセス許可を適切に管理し、必要な権限を持つユーザーにのみアクセスを許可しましょう。
注意すべきポイントと落とし穴
GitHub Actionsを活用する際には、注意すべきポイントと回避すべき落とし穴があります。
パイプラインのセキュリティ
ビルドやデプロイの過程で機密情報や認証情報が含まれる場合、適切なセキュリティ対策を講じる必要があります。
例えば、機密情報を暗号化し、環境変数やGithubのSecretsを使用して安全に管理するなど、情報漏洩のリスクを最小限に抑えるための対策が必要です。
リソース管理
高負荷のタスクや大規模なプロジェクトでは、Github Actionsのリソース制限に注意が必要です。必要なリソースが十分に確保されていない場合、ビルドやテストの遅延やエラーが発生する可能性があります。必要なリソースの適切な計画と管理が重要です。
統合テストの実行
統合テストは複数のコンポーネントやサービスを組み合わせて行われるため、設定や依存関係の管理が重要です。統合テストが正しく機能しない場合、デプロイ後に問題が発生する可能性があります。適切なテスト環境のセットアップとテストデータの管理を行うことが必要です。
パイプラインの可読性とメンテナンス性
Github ActionsはYAML形式で定義されるため、パイプラインの可読性とメンテナンス性を高めることが重要です。タスクやステップの分割、再利用可能なワークフローのテンプレート化、コメントやドキュメントの追加など、他の開発者が理解しやすく、変更や修正が容易なパイプラインを作成することが望ましいです。
まとめと次のステップ
Github Actionsの生産性向上への効果のまとめ
いかがだったでしょうか。
Github Actionsの導入により、効率的な開発プロセス、自動化されたビルドとテスト、継続的なインテグレーションとデプロイ、柔軟なカスタマイズと拡張性、そしてコラボレーションと可視性の向上といった効果が得られます。
これにより、生産性の向上と高品質なソフトウェアの開発が可能となるのです。
Github Actionsの学習と活用の継続的な重要性
ソフトウェア開発は日々進化しており、新しいテクノロジーの登場の連続です。Github Actionsもその一部であり、新しい機能が定期的にリリースされていくでしょう。
日頃から最新の機能やベストプラクティスを把握し適切にプロジェクトに反映していくことが重要です。
またチーム全体での協力や共有作業を促進する役割も果たしてくれるため、個人だけでなくチームとしてもGithub Actionsについて学習する機会も増やせるとより効果的です。
継続的な学習を通じて、Github Actionsを最大限に活用し、プロジェクトの成功に貢献しましょう。