かまたま日記3

プログラミングメイン、たまに日常

RenovateでGoのプロジェクトの依存性を更新する

弊社でRenovateを使ってるので、知見のメモです

Privateリポジトリを含む場合

Renovateを適用したいGoのリポジトリのgo.modに同じorganizationの別のprivate repositoryを含む場合*1、その参照されているリポジトリにもRenovateを適用すれば、Renovateが持つGitHubトークンでそのprivate repositoryもgo mod download出来ます。

Support private go modules on github.com · Issue #3202 · renovatebot/renovate · GitHub

you don't need to check in a github token - Renovate will reuse the existing token for github.com. If you are running via the app, that means it uses the same token as Renovate uses to access the current repository, so you need to make sure Renovate is installed into the source repo too (Renovate can be disabled, but it must be installed in order to have permissions to read the contents).

一部のライブラリ更新頻度高すぎ問題

弊社の場合、主に golang.org/x/aws-sdk-goなんですが、頻繁に更新が来すぎて鬱陶しいです。他にも適宜更新にしていると結構業務時間取られるので、弊社では以下のようなポリシーにしています

  • 外部パッケージは週末にアップデート (して週明けにまとめてマージ)
  • 内部モジュールは更新され次第

renovate.json的にはこんな感じです (抜粋)

{
    "extends": [
        "config:base",
        "schedule:weekends",
    ],
    "postUpdateOptions": [
        "gomodTidy"
    ],
    "packageRules": [
        {
            "packagePatterns": [
                "^github.com/seqsense/"
            ],
            "schedule": [
                "at any time"
            ]
        }
    ],
    "timezone": "Asia/Tokyo"
}

go.sumのpackage sumが抜ける問題

RenovateでpostUpdateOptionsgomodTidy を指定している場合 *2 go mod tidy するときにリソースの都合で依存パッケージを全てはダウンロードしていないために、 go.sum からパッケージのsumが抜けることがあります。

これはかなり困る問題なんですが、Renovate側では今の所対策する予定は無いそうです。ということで、同僚がgo.sumを修正する用のGitHub Actionを作ってくれました。

github.com

このActionを以下のような感じで仕込めば、RenovateのPRに対して、go mod tidyを行って変更があったらコミットしてpushしてくれます.

name: go-mod-fix
on:
  push:
    branches:
      - renovate/*

jobs:
  go-mod-fix:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 2
      - name: fix
        uses: at-wat/go-sum-fix-action@v0
        with:
          git_user: @@MAINTAINER_NAME@@
          git_email: @@MAINTAINER_EMAIL_ADDRESS@@
          github_token: ${{ secrets.GITHUB_TOKEN }}
          commit_style: squash
          push: force

patchバージョンのみをAutomergeしたい場合

デフォルトではminorとpatchは同じブランチで管理されるので、patchのみをアップデートする場合 separateMinorPatch: true が必要。 ということでaws-sdk-goのpatch versionのみをautomergeしたい場合は以下のように書きます。

{
  "packageRules": [
    {
      "packagePatterns": [
        "^github.com/aws/aws-sdk-go"
      ],
      "separateMinorPatch": true,
      "patch": {
        "automerge": true
      }
    }
  ]
}

最後に

色々問題もありましたが、Renovateのおかげで弊社のGoプロジェクトはかなり健全な状態にできてるかと思います。もしRenovateを使おうと検討している場合、参考になれば幸いです。

*1:よくあるのは複数のプロジェクトから参照される共通コアライブラリ的なの

*2:というかこれをしたくない場合ってあるのかな?