mnagaaのメモ

技術的なことはこのブログで書きます

golangci-lintとRenovate

たまにはGo関係のことも書くかということで書く。

golangci-lintについて

github.com

  • golangci-lintを使って、CIでコードスタイルや静的解析を行うことで、コード品質を高めている。これにより、プロジェクト全体のコードの一貫性と品質が向上する。
  • CIにはGitHub Actionsを使用し、lintのスタイルに合わない書き方があるとエラーとして検出される。これにより、コードレビュー前に自動的に品質を保証できる。
  • レビュイーには、lintが通るまで修正を続けてもらい、統一されたアウトプットを確保する。これにより、コードの一貫性が保たれる。
  • Goで推奨される書き方を自然に学ぶことができる。golangci-lintは、gofmtやgovetなどの基本的なツールから、errcheckやstaticcheckといった高度なツールまで、多くのリンターを統合している。
  • ある程度のレベルでのコードが上がってくるため、レビューの負担が減り、レビューで焦点を当てるポイントがハイレベルなものに絞られるので非常に楽になる。

運用方針

.golangci.ymlというファイルで設定をすることができるが、以下のようにenable-all: trueと設定し、無効にするlinterをリストアップする形式で運用している。

linters:
  enable-all: true
  disable:
    - wsl
    - wrapcheck
    - unparam
    - varnamelen

他の人の発表などを見ると、disable-all: trueにして、使いたいlinterだけをリストアップする運用方法を提案していることがある。その人たち曰く、「何も修正せずともバージョンアップできる」ということであるが、バージョンアップ時に追加されるlinterがあるならば、修正しつつ追加するべきだと思うので、disable-all: true派には自分は反対意見を持っている。

この後に紹介するが、Renovateという自動でバージョン更新のPRを作成してくれるツールがある。これを用いてバージョン更新をすることで、enable-all: trueと設定していれば、新しいlinterを漏れなく追加することが可能である。

Renovate

github.com

Renovateは、オープンソースの依存関係管理ツールで、プロジェクト内の依存関係の更新を自動化するために使用される。 Renovateを使用することで、依存関係のバージョンを定期的にチェックし、最新バージョンへの更新を提案するPR(プルリクエスト)を自動で生成する。

Goだけではなくて、Terraformなどの他の依存のPRも作成してくれる。

毎週月曜日など、PRを作成する時間指定が可能で、パッケージなどのバージョン更新があった場合にPRがくる。

GitHub ActionsのCIが通れば、マージするようにしている。

renovate

golangci-lintとRenovate

golangci-lintに新しいlinterが追加された場合、enable-all: trueに設定していれば、新しいlinterを含めてlint checkが行われるため、修正が必要かどうかをCIで検知することができる。

修正が必要で、かつ追加したいlinterであれば、修正してからマージする。これにより、抜け漏れなくlinterのバージョン更新が可能。

Renovateを使用してgolangci-lintのバージョンを自動更新する設定を行えば、新しいlinterの追加や既存のlinterのアップデートが自動的にPRとして提案される。PRが作成されると、自動化されたテストとlintチェックが行われ、問題がなければマージする。 これにより、手動での更新作業を減らし、常に最新の状態を維持することができる。

このように、Renovateとgolangci-lintを組み合わせて使用することで、コード品質を高く保ちながら、依存関係の管理を効率化し、プロジェクトの健全性を維持することができる。