GitHub Actions上でgo mod tidyしてPRを作るActionです
モチベーション
dependabotでgoのモジュールを定期的にアップデートしていると go.sum
に古いバージョンのゴミが残り続けます。
github.com/aws/aws-lambda-go v1.11.1 h1:wuOnhS5aqzPOWns71FO35PtbtBKHr4MYsPVt5qXLSfI= github.com/aws/aws-lambda-go v1.11.1/go.mod h1:Rr2SMTLeSMKgD45uep9V/NP8tnbCcySgu04cx0k/6cw= github.com/aws/aws-lambda-go v1.12.0 h1:CgKAMdFIWExd4U6c9DUE+ax8N0fsmkYirqcfmReRCeo= github.com/aws/aws-lambda-go v1.12.0/go.mod h1:050MeYvnG0NozqUw+ljHH9x0SwxeBnbxHVhcjn9nJFA= github.com/aws/aws-lambda-go v1.12.1 h1:rMToYOcPFYDixQ7VNNPg78LmiqPgWD5f8zdLL+EsDAk= github.com/aws/aws-lambda-go v1.12.1/go.mod h1:z4ywteZ5WwbIEzG0tXizIAUlUwkTNNknX4upd5Z5XJM= github.com/aws/aws-lambda-go v1.13.0 h1:yjvZBGAxmrVQnakZ6/SE2S6L7Iwyx4CkJEcCQCc7WtU= github.com/aws/aws-lambda-go v1.13.0/go.mod h1:z4ywteZ5WwbIEzG0tXizIAUlUwkTNNknX4upd5Z5XJM= github.com/aws/aws-lambda-go v1.13.1 h1:qVIOD3UrEUo4amwgEBu6AI0CfnBsp71XJEYU05RbQ1k= github.com/aws/aws-lambda-go v1.13.1/go.mod h1:z4ywteZ5WwbIEzG0tXizIAUlUwkTNNknX4upd5Z5XJM= github.com/aws/aws-lambda-go v1.13.2 h1:8lYuRVn6rESoUNZXdbCmtGB4bBk4vcVYojiHjE4mMrM= github.com/aws/aws-lambda-go v1.13.2/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
go mod tidy
すればゴミは消えるのですが、ローカルで定期的に叩くのも面倒です。
本来ならこの手の機能はdependabotで欲しくて実際に要望は上がってるんですが、dependabot側の対応は割と大変そうな感じがしました。
そのためGitHub Actionsの勉強がてら自分で作りました。
使い方
下記のようなymlをリポジトリに置くだけです。
パラメータの詳しい説明はMarketplaceかリポジトリを見てください。
# .github/workflows/go-mod-tidy-pr.yml name: go-mod-tidy-pr on: schedule: - cron: "0 0 * * 1" # Weekly build jobs: go-mod-tidy-pr: name: go-mod-tidy-pr runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run go-mod-tidy-pr uses: sue445/go-mod-tidy-pr@master with: github_token: ${{ secrets.GITHUB_TOKEN }} git_user_name: GitHub Actions git_user_email: github-actions@example.cpm # reviewer: foo # assign: foo # milestone: some_milestone # labels: go-mod-tidy # draft: "true" # go_mod_directory: "/dir/to/go-mod" # debug: "true" # duplicate: "true"
技術的なこと
なぜGitHub Actionsを使ったか?
API経由でPullRequestを作るにはトークンが必要なのですが、GitHub Actionsであればパーソナルアクセストークンの発行が不要なので色々便利だからです。
これはCircleCIとかにはないメリットなので、CI上でGitHubのAPIを使いたい場合にはGitHub Actions一択だと思います。
余談ですがGitHubのパーソナルアクセストークンはリポジトリ単位の権限の設定がないため発行しないにこしたことはないです。(自分のパーソナルアクセストークンが漏れると自分がアクセス可能なリポジトリが全て第三者からもアクセス可能になるので大惨事)
aptで入るhubが古くてGitHub Actionsで動かなくてハマった
GitHub Actionsで hub pull-request
すると下記のようなエラーが出てしばらくハマってました。
> GET https://api.github.com/user > Authorization: token [REDACTED] > Accept: application/vnd.github.v3+json;charset=utf-8 < HTTP 403 {"message":"Resource not accessible by integration","documentation_url":"https://developer.github.com/v3/users/#get-the-authenticated-user"} Error getting current user: Forbidden (HTTP 403) Resource not accessible by integration
https://github.com/github/hub/releases/tag/v2.12.3 でこの現象の修正が入っているのですが、aptで入るhubが2.7.0なのでaptを使わずにhubを入れる必要があったのがちょっとしたハマりでした
$ apt-cache show hub | grep Version Version: 2.7.0~ds1-1+b10
使った図
チリツモのゴミが消えてスッキリしました