GitHub Actionsの機能を利用してCI/CDをパッケージ化する
株式会社ココナラ / takumi.yoshikawa
チームリーダー / インフラエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
| 利用プラン | ツールの利用規模 | ツールの利用開始時期 | 事業形態 | 
|---|---|---|---|
Enterprise  | 51名〜100名 | 2021年 | C to C  | 
| 利用プラン | Enterprise  | 
|---|---|
| ツールの利用規模 | 51名〜100名 | 
| ツールの利用開始時期 | 2021年 | 
| 事業形態 | C to C  | 
アーキテクチャ
アーキテクチャの意図・工夫
1. 共通化
共通化をするにあたり、以下のどちらの機能に主眼をおくこととするか悩みました。
どちらにもメリット/デメリットが存在するので、統一するのではなく使い分けることとしました。 感じていることの一部を以下に記載します。
- composite action
- ◯:1つのワークフロー内で組み合わせて使えるので使い勝手がいい
 - ✕:コンソール上のログが見づらくなる
 
 - reusable workflow
- ◯:決まりきった処理であれば、コールする側はほとんどコードを書かなくて済む
 - ✕:コール側で少しだけ追加の処理を追加したい場合には不向き
 
 
2. 分岐をなくしてシンプルに
例えば、「本番と開発で処理はまったく同じなのだが、デプロイするAWSアカウント/GCPプロジェクトだけ異なる」というケースは度々あるかと思います。 この場合、↓のようにifで分岐して変数をセットして、その変数を使って次のstepにうつる必要があるかに見えます。
- id: set-env
  run: |
    if [ ${{ github.ref_name == 'main' }} == "main" ]; then
       echo "target=production" >> "$GITHUB_OUTPUT"
    else
       echo "target=develop" >> "$GITHUB_OUTPUT"
    fi
- uses: ORG/REPO/.github/actions/hoge@main
  with:
    target: {{ steps.set-env.outputs.target }}
が、Environments機能を使うと、
- 同じ変数名だけど、環境ごとに実態値が異なる
 
という扱いをすることができるため、次のように記述をシンプルにすることが可能です。 変数が多いほど有用になります。(SettingsからEnvironmentsの設定はしておく必要がある)
environment: |-
      ${{
          github.ref_name == 'main'  && 'production'
      ||  'develop'
      }}
steps:
  - uses: ORG/REPO/.github/actions/hoge@main
    with:
      target: {{ vars.TARGET }}
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
- リポジトリごとに利用するCI/CDサービスが異なっている
 - リポジトリごとにCI/CD設定ファイルの記載がまちまちである
 - だれがいつデプロイを実行したのか記録されるところがバラバラである
 
どのような状態を目指していたか
- 特殊なリポジトリを除いては、特定のCI/CDツールに統一する
 - リランではなく、手動でトリガーすることができる
 - 基本的なフローは共通化し、各リポジトリではそれを利用するような記述としてメンテナンスがしやすくなる
 - デプロイ記録をSlackチャンネルに統一する
 
比較検討したサービス
- CircleCI
 - AWS CodePipeline
 
比較した軸
- 一定の処理フローをパッケージ化できること
- 複数リポジトリで似たような処理を行うことが多かったため
 
 - SREではないメンバーでもある程度修正ができること
 
選定理由
- GitHubに統合された機能である
 - 再利用可能なワークフローモジュール開発の容易である
 - 定期的なパッケージアップデートが行いやすい
 
導入の成果
導入できているリポジトリでは以下のような効果があります。
- インフラ系リポジトリでは、共通リポジトリに管理されているreusable workflowをコールする記述をするだけで差分情報を見られるようになる
 - シンプルなフローのみのリポジトリでは、CIファイルが30~50行程度のシンプルなymlの記述にとどまる
 - 利用するパッケージを統一化したので、これを置き換えるだけでCD通知先もあわせて統一されていく
 
導入に向けた社内への説明
上長・チームへの説明
もともとコードホスティングサービスとしてGitHubを利用していて、かつプラン内に利用可能枠がかなりある状態だったため、とくに導入に対してのハードルはありませんでした。 開発者側にもGitHub Actionsなら修正できるよ、というメンバーも多かったです。
活用方法
よく使う機能
- composite action
 - reusable workflow
 - Environments
- 本稿に記載しているものです。
 
 - workflow dispatch
- 手動トリガーを設定することが可能です。
 
 - matrix strategy
- 複数の環境や設定で処理を並列化したい場合に非常に便利です。
 
 
ツールの良い点
- GitHubを利用していれば追加設定不要で利用可能
 - サードパーティパッケージが充実している
 - 「よく使う主要機能」に記載の通り、カスタマイズがしやすい
 
ツールの課題点
- 実行時間などの解析をするには工夫が必要
- 1つ1つのジョブの記録はもちろん残るのですが、全体を俯瞰するためには測定用のactionを組み込むなど一工夫必要です。なお、このあたりは比較しているCircleCIが得意な分野です。
 
 - 共通action部分を変更した場合、参照している箇所すべてに影響が出るため、参照方法か修正方法に取り決めが必要
 
ツールを検討されている方へ
リポジトリが多数存在し、同じような処理をしていることが多いんだけどなあ、というように感じられる場合は、本稿で紹介した機能を利用したGitHub Actionsで共通化・省力化を行いやすいです。
株式会社ココナラ / takumi.yoshikawa
チームリーダー / インフラエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
よく見られているレビュー
株式会社ココナラ / takumi.yoshikawa
チームリーダー / インフラエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
レビューしているツール
目次
- アーキテクチャ
 - 導入の背景・解決したかった問題
 - 活用方法
 



