最小の対応で Github Actions による CI/CD のとっかかりを作る(バッジも添えて)

この記事は [セゾン情報システムズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sisco) 7日目の記事です。

# 概要
[4日目の記事](https://qiita.com/Akifumi_Nakamura/items/5f0f7fafd6bee18f5d95)にもあるように CI を導入することでソフトウェア開発の生産性を高めることができます。
しかし、CI/CD 導入の有用性を理解しつつも導入が難しいというケースはままあると思います。
(プロジェクトの中で開発が始まっている、予定外の工数確保が難しい、ノウハウが無い、、、)

そこで、弊社でも採用している Github の Actions を利用してまずは最小の対応で CI を実現したいと思います。

# 実現すること
- Github Actions の導入
    - ソースコードのビルド
        - 今回は gradle による java のリポジトリを想定
    - Pull Request 関連対応時に自動実行
    - ビルド(Actions のワークフロー)失敗時に Pull Request のマージをブロックする
    - バッジを README に載せる
        - このような
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/c5fe5c22-007e-e6df-5af9-9fdab37bf322.png)

# ソースコードをビルドするワークフローの作成
1. github のリポジトリのページから、`Actions` を選択して `set up workflow yourself` のリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/116d25bf-620a-fa4e-ad97-962df0ad0920.png)
1. エディタに遷移するので、以下内容を貼り付けてコミットする。
    ```yaml
    name: Build
    
    on:
      # Pull Request に関連する変更があった場合に実行する
      pull_request:
      # 手動で実行可能にする
      workflow_dispatch:
    
    jobs:
      build:
        # セルフホストランナーを導入している場合は対応したラベル
        runs-on: セルフホストランナーのラベル
        steps:
        # ソースコードをチェックアウトする
        - uses: actions/checkout@v3
        
        # java をセットアップして利用可能にする
        - name: Set up JDK 11 
          uses: actions/setup-java@v3
          with:
            distribution: 'corretto'
            java-version: '11'
            
        # gradle wrapper のコマンドを実行してソースコードをビルドする
        - name: Execute gradle wrapper command.
          run: |
            chmod +x gradlew
            ./gradlew build
    ```
1. Actions タブからワークフローが手動実行できるので以下画像を参考に実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/0b6410c5-77f4-e374-ec04-b8dbeae54b6a.png)
1. 処理が成功したかを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/1acbd93a-cc0e-2a87-3145-b2c7238c50dd.png)
1. Pull Request 作成時、対応ブランチへの push 時にも実行されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/fa65e8ff-6366-659a-d858-044bcf2d37c5.png)

# ビルド(Actions のワークフロー)失敗時に Pull Request のマージをブロックする
手動・自動でワークフローが実行できるようになりましたが、ワークフロー失敗時には Pull Requset をマージできないようにしたいです。
(ソースコードに問題がある状態でマージしたくない)
Github の機能を使って以下手順で実現できます。
1. 以下画像を参考に Branch protection rules をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/3a52335e-60c5-23e4-aa76-d7d78a95f7a3.png)
1. 保護するブランチのパターンを入力(今回は main ブランチのみを保護)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/bf0b796b-0074-2ab4-579a-d8b2322893bf.png)
1. Require status checks to pass before merging をチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/2b4e2bed-e596-a83e-f75d-f0288e0edd70.png)
1. テキストボックスに `build` と入力し、表示された `build` を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/a59412d3-9a3f-4b1a-0631-1ed5c7f8e68c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/c71d5ea0-1258-910a-ded5-2b4492c3bf56.png)
1. 下までスクロールして `Create` ボタンをクリック
1. Pull Request の対象ブランチに push した場合などにワークフローが実行される。実行中はマージ不可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/bc0e1c89-cbb6-a934-d1d6-11e098b31e87.png)
1. ワークフローが失敗した場合もマージ不可となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/00701f5f-93d8-e2cd-e15d-216f41be98c9.png)

# バッジの作成
Github のリポジトリに `README.md` ファイルが存在する場合はデフォルトで内容を表示してくれます。
そこに、ワークフローの実行結果をバッジとして README に記述して表示させましょう。
1. 以下画像を参考に `Create status badge` をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/95570b62-13a9-e033-0e8b-6ed5a877f9d5.png)
1. markdown の記述がポップアップするので `Copy status badge Markdown` ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/50c47777-f145-1412-a667-c351c140c522.png)
1. Copy された markdown を READM.md を編集して貼り付けてコミット・push する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/12bf1f59-b080-098c-abbf-d9a4ebf9bd48.png)
1. リポジトリのページにバッジが表示されます!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/72d3eb1b-f422-4d57-9da6-b053f03c64a1.png)

# おわりに
まずは CI/CD の土台が整えることが出来ました。
今回の対応のみでもビルド失敗を早めに検知できます。(ライブラリ追加時のビルドファイルコミット漏れなど)
今後は、ユニットテストの作成・実行・カバレッジ計測、ソースコードの静的解析などに順次対応していき、CD などにも対応していきたいです。
何かの参考になれば幸いです。
引き続き Advent カレンダーをよろしくお願いします。