Github Actionsでgolangのcode formatを自動化したのでメモ
やったこと
Golang で PR オープン時と Push 時にコード整形してコミットを追加することを Github Actions で自動化しました。
動機はなんとなくです。
Github Actions の設定
Github Actions の設定は以下のようになっています
name: Format code
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
formatter:
name: formatter
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./app
steps:
- name: checkout
uses: actions/checkout@v3
with:
ref: ${{ github.head_ref }}
- name: set up go
uses: actions/setup-go@v4
with:
go-version: ">=1.17"
- name: Install goimports
run: go install golang.org/x/tools/cmd/goimports@latest
- name: Format code
run: goimports -w .
- name: Auto commit
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "Apply Code formatter changes"
軽く中身を見ていく
主に steps について触れていきます
チェックアウト
steps:
- name: checkout
uses: actions/checkout@v3
with:
ref: ${{ github.head_ref }}
この部分ではpull request
の HEAD
ブランチにチェックアウトしています。
name
はタスク名を定義できます。
actions/checkoutはジョブで利用しているリポジトリのチェックアウトするときに使用できるアクションです。
uses
でアクションを実行できます。
with
キーワードはアクションに対して設定を入力できます。
${{ github.head_ref }}
は Pull Request イベントで{HEAD_BRANCH_NAME}
が取得できます。
ここではワークフローを実行するブランチをさしています。
golang のセットアップ
- name: set up go
uses: actions/setup-go@v4
with:
go-version: ">=1.17"
この部分では golang の実行環境を用意しています。
actions/set-up-goでセットアップを行っています。
go-version
は今回は適当に>=1.17
としていますが、go.mod
からバージョン取得できるみたいなので、そちらにした方がいいかもなと思っています。
goimports のインストール
- name: Install goimports
run: go install golang.org/x/tools/cmd/goimports@latest
この部分ではgoimportsをインストールしています。
Go 言語の準標準パッケージ(サブレポジトリ)である Go Tools に内包されている静的解析ツールです。
goimports はおおまかにいうと下記のようなことをしてくれます。
- 不要なパッケージの import を削除
- 必要なパッケージの import を追加
- gofmt のルールに沿ったコードのフォーマット
go コードの自動整形
- name: Format code
run: goimports -w .
リポジトリ配下の.go
ファイルをフォーマットをして、変更があれば修正した内容で上書きするというものです(-w
オプション)
変更差分をコミット
- name: Auto commit
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "Apply Code formatter changes"
GitHub Actions でコミットするためにstefanzweifel/git-auto-commit-actionアクションをつかってコミットします。
コミットメッセージをwith
キーワードで指定しています。
以上で PR にコミットしたファイルを自動で整形する Actions の設定でした。
最後に
なんとなく個人開発でやっているので筆者にとっては恩恵は大きくはないですが、チーム開発などで設定するようにすれば少しはうれしいかも?
そもそもちゃんと linter を各自入れておけば済む話ではありますが。
当然ですが、goimports による差分が発生した場合はリモートブランチとローカルブランチで差分が発生するので pull を忘れないようにしましょう。
参考
こちらの記事が大変参考になりました。
https://zenn.dev/satto_sann/articles/36c68c73dc5125
Discussion