GitHub ActionsのPRコメントで差分を可視化する

Understand

はじめに

以前の投稿では、GitLab環境を前提にした構築方法を紹介しましたが、今回はGitHubユーザー向けにGitHub、GitHub Actionsを使用した連携方法を試してみました。プルリクエスト発生時にUnderstandからソースコード差分情報を取得し、プルリクエストのコメントに自動的に添付する方法をこちらに記載します。

環境

本記事では、以下の環境にて実施しています。

  • Windows 11
  • Understand 7.0 (Build 1220) ※「Understand フローティング with API」ライセンスが必要です。
  • GitHub
  • GitHub Actions
  • Amazon S3

処理の流れ

どのような処理の流れになるかを説明します。

  1. プルリクエスト発生時に、GitHub ActionsにてS3にアクセスし、マージ先(mainブランチ)のUnderstandプロジェクトを取得
  2. マージ元と、マージ先のプロジェクトをUnderstandにて解析
  3. Understand APIより差分のグラフイメージ(.svg)を作成し、保管のためS3へ出力
  4. コメント文作成のため、Understandより差分情報の抽出、S3よりグラフイメージを取得
  5. コメント文をプルリクエストのコメントとして投稿
  6. mainブランチへのコミット時に最新のUnderstandプロジェクトを作成、S3へ保管

準備

環境を構築するうえで必要な準備をします。CIに必要なファイルの配置、ツール間の通信許可などの設定が必要となります。

Yamlファイルの配置

まずはGitHub Actionsが動作するように、リポジトリのルートにワークフローとなるYamlファイルを置きます。今回作成したものはこちらより取得可能です。ファイルを展開し、以下のファイル構造となるように配置します。
※Yamlファイルに対しての開設は以前の投稿とほぼ同じとなりますため、割愛します。

[リポジトリルート]
  - [.github]
   - [workflows]
      - [understand-analyze.yml]   // mainブランチの解析、保管用
      - [understand-review-pr.yml]

スクリプトファイルの配置

リポジトリのルートに「understand」という名前のフォルダーを作成し、その中に実際にUnderstandを動作させるスクリプト群を配置します。
※スクリプトに関しては公開しておりません。ご利用になりたい場合はScitools 製品カスタマーセンター までお問い合わせください。

AWSへのアクセス許可

Amazon S3へのアクセスを確立するための設定をおこないます。

AWSのIDプロバイダの作成

AWSへのアクセスを確立する方法はいくつかありますが、今回はIDプロバイダを使用した方法を試してみました。
参考:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers.html
AWSアカウントのIAMより、「IDプロバイダを作成」から新規に作成します。

  • プロバイダ名:token.actions.githubusercontent.com(任意の名前)
  • プロバイダのタイプ:OpenID Connect
  • ロール:このプロバイダ用のロールを作成します

ロールには信頼関係ポリシーを以下のように設定します。ここでは、GitHubユーザーコンテンツへのアクセスを許可しています。対象のリポジトリ「github_user/fastgrep」に対してすべて許可するようにしています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:github_user/fastgrep:*"
                }
            }
        }
    ]
}

ロールにはポリシーも割り当てます。割り当てるポリシーにはS3へのアクセスを有効にするようにしてください。このポリシーにより、GitHubからのS3バケットへのアクセスが可能になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::understand-github-demo",
                "arn:aws:s3:::understand-github-demo/*"
            ]
        }
    ]
}

S3バケットのバケットポリシーの設定

S3バケットは初期設定で外部からのアクセスができないようになっています。プルリクエスト画面にて、グラフの表示をする際に、HTTPにてブラウザー上からS3バケットへ画像データを取得するようにしています。そのため、取得コマンド(GetObject)を許可する必要があります。
バケットを作成したら、バケットポリシーを設定し、GetObjectを許可します。ここではunderstand-github-demoというバケットを作成しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowClientGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::understand-github-demo/*"
        }
    ]
}

GitHubランナーのインストール

GitHub Actionsのパイプラインにて実際にUnderstandが動作する環境を別に構築する必要があります。今回はAWS EC2インスタンス(Red Hat Enterprise Linux 9)を構築しました。そのため、ランナーはセルフホステッドランナーを選択します。

  1. 対象リポジトリの画面より、[Settings] – [Actions] – [Runners] – [New self-hosted runner]ボタンを選択します。
  2. 下記の画面になるので、Runner imageでLinuxを選択します。
  3. 下部のようにセットアップに必要なコマンド群が表示されますので、ランナー環境にて順次実行します。

run.shを実行すると、ランナーが起動し、GitHub Actions上で、ランナーがアイドル状態(緑)なります。
ランナー側で常時実行できるようにサービスにしておくと良いです。

AWS CLIのインストール

ランナー側にAWS CLIをインストールします。S3バケットへのアクセス時にaws cliを使用しているためインストールしておきます。

curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
aws --version

実行

準備ができたので、実際にプルリクエストを発行してみます。devブランチを作成し、ソースコードを変更したものをmainブランチに対してプルリクエストを発行しました。このコメントは、Understand APIを使用したスクリプトで作成したテキストファイルを送信したものです。

GitHubへ送信したテキストファイルはこちらです。マークダウン形式となっています。グラフへのリンクのHTTPにてS3バケットを参照しています。

以下の関数が変更されました。

| 関数 | Percent Changed | ファイル |
| -------- | -------- | -------- |
| main | 9.30% | timer.c |

### main (timer.c)

![](https://understand-github-demo.s3.amazonaws.com/user01/fastgrep/ce88a28edc08b01b13b543dc7199f848e693cc0f/images/_lmain_kmain_f__timer_c.svg)

-----

まとめ

今回はGitHub Actionsでの環境の構築方法を記載しました。GitHub、GitHub Actions、AWS S3と異なるツールの認証が煩わしい部分もありますが、一度構築したあとは、今回紹介したプルリクエスト時のコメント機能などが以後自動的に動作するため、より効率的なレビューをおこなうことができると思います。
また、弊社では、このようなCI環境を構築する有償サービスなども承っております。
CI環境など自動化にご興味がありましたら、Scitools 製品カスタマーセンター までお気軽にお問合せください。