GitHub Actionsでリンターの修正を自動化してみた（Ollamaあり）

# はじめに

勉強用に個人で作成したTerraformやCloudFormationのファイルが増えてきました。
業務に活かすためきれいに書きたいと思っていましたが、なかなか時間が取れていませんでした。
そこで、GitHub Actionsを使ってファイル修正とプルリクエストの作成を試みました。
CloudFormationのlinter（cfn-lint）には自動修正機能がないため、生成AI（Ollama）を使ってみることにしました。（LLMをあまり使ったことがなかったので勉強してみたい気持ちを優先しました👍）

# 成果物

以下のワークフローのファイルを作成しました。

1. `terraform fmt`、`tflint`を実行しファイル修正後、プルリクエストを作成するワークフロー（Terraform linter and PR）
https://github.com/kohei39san/mystudy-handson/blob/main/.github/workflows/terraform-linter-pr.yml

2. `cfn-lint`を実行し、ollamaでファイル修正後、プルリクエストを作成するワークフロー（CloudFormation linter and PR）
https://github.com/kohei39san/mystudy-handson/blob/main/.github/workflows/cfn-linter-pr.yml

# Terraform linter and PRを動かしてみる

## 概要

```plantuml
@startuml
start
:Terraformをセットアップ;
:terraform fmtを実行する;
:tflintのセットアップ;
:tflintの実行;
if (ファイルの変更があるか?) then (yes)
  :コミットする;
  :プルリクを作成する;
endif
end
@enduml
```

## プルリクができているか

ファイル変更を行い、プッシュしてみました。
その後、`terraform fmt`、`tflint`されたプルリクエストが作成されていました。

![スクリーンショット 2025-02-24 112919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/a09f3741-17fc-440b-a496-e4becce5828e.png)

プルリクはgithub-actionsユーザー作成となっていました。
デフォルトでは、`github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>`がユーザー、メールアドレスとして使われるようです。
https://github.com/peter-evans/create-pull-request

それ以外でGithub Actionsで使えるユーザー、メールアドレスは以下の記事が参考になりました。
https://qiita.com/thaim/items/3d1a4d09ec4a7d8844ce

ファイル修正もいい感じです！

![スクリーンショット 2025-02-24 113004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/2e935100-5627-44b9-b536-a1395617efff.png)

マージもできました！

![スクリーンショット 2025-02-24 113128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/4b8b5953-bf92-404b-90f9-a4cbae10f4f2.png)

プルリクなので元に戻すこともできそうです！

![スクリーンショット 2025-02-24 113150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/1d729607-ddb1-4bf9-afb3-396531d3eb4d.png)

## 詰まった点1: Githubにおける認証情報の種類

Githubにある色々な権限の違いを理解するのに時間がかかりました。
何をしたいかによって権限の与え方が変わります。

1. GITHUB_TOKEN: 定義済みトークン
1. Github Appの登録

他にもたくさん種類があるようです。（覚えきれない。。）

https://qiita.com/suin/items/1ce9e11bd1c203fb1167

https://docs.github.com/ja/apps/creating-github-apps/authenticating-with-a-github-app/making-authenticated-api-requests-with-a-github-app-in-a-github-actions-workflow

今回は自前のトークンを管理したくなかったので、GITHUB_TOKENを使うことにしました。
GITHUB_TOKENで、ブランチ、プルリクの作成権限がついているかの確認方法は以下の通りです。
https://dev.classmethod.jp/articles/mapping-secrets-github-token/

ブランチの書き込みが分かりづらいですが、以下記事からAPIの分類`POST /repos/{owner}/{repo}/git/refs`を調べて、
https://blog.p1ass.com/posts/create-branch-using-github-api/

以下記事と見比べると、`contents`に分類され、GITHUB_TOKENでも読み書きできることが分かります。
https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents

## 詰まった点2: push前のリポジトリの権限修正

まずはリポジトリでGithub Actionsを有効にする必要があります。

https://zenn.dev/ring_belle/articles/github-actions-createpr-disabled

また、GITHUB_TOKENは権限のカスタマイズができ、デフォルトですべての権限使えるわけではありませんでした。
ワークフローから書き込みの権限を許可する必要がありました。

https://developer.mamezou-tech.com/blogs/2023/06/28/set-minimum-permissions-to-github-actions-workflow/

※その他参考

https://docs.github.com/ja/actions/security-for-github-actions/security-guides/automatic-token-authentication

https://docs.github.com/ja/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token

# CloudFormation linter and PRを動かしてみる

## 概要

```plantuml
@startuml
start
:cfn-lintのセットアップ;
:cfn-lintを実行する;
:tflintのセットアップ;
:tflintの実行;
if (cfn-lintで指摘があったか?) then (yes)
  if (Ollamaがインストールされていない) then (yes)
    :Ollamaをインストールする;
  endif
  :Ollamaに修正後のファイルを生成してもらう;
  :修正前のファイルを修正後のファイルに置き換える;
endif
if (ファイルの変更があるか?) then (yes)
  :コミットする;
  :プルリクを作成する;
endif
end
@enduml
```

## プルリクができているか

`push`してみると、プルリクエストが作成されていました！

![スクリーンショット 2025-02-24 115011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/d6a5bcb1-35a2-4ed5-a2cb-bc8ff0cf3e1b.png)

![スクリーンショット 2025-02-24 115033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/46c48882-2170-46ff-bd0c-bd735bf59f65.png)

しかし、以下の問題が発生しました。
- ollamaが起動していないことがあった

![スクリーンショット 2025-02-24 114528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/cb7abea5-3ac0-4cfc-9b06-ed3abf70b038.png)

ひとまずOllama実行までに待機時間（なんとなく5秒にしました。。）を設けました。

- 指示していない修正があった

もともとyamlファイルにあったコメントも指示だと思って修正したようです。

- 間違った修正案を提示してくることも多かった

# おわりに

自動化できて便利だと感じましたが、課題もあるので改良が必要だと感じました。
ただ、自動である程度直してくれるのは助かりますし、Botでも誰かと作業している感があってわくわくするので、使ってみようと思います！
これからも勉強します！