golangci-lintをちょっくら使ってみる

## 概要
少人数でgoを使用してプロダクトの開発を行っているのですが、私を含めメンバーもgoをそんなに触ってきていないので、コードの品質はあまり良くないのが最近の悩みです...
そこでgoのlintである「golangci-lint」があるというのを聞いたので軽く導入してみようかなと思い、この記事に簡単にまとめてみます。

ちなみに基本的には以下のサイトを参考にさせていただいていて、こちらの方がとっても詳しく書かれています！
ですが私は一瞬、軽くやりたかっただけなので最低限の事だけをなぞってメモしておきます🫠

https://zenn.dev/sanpo_shiho/books/61bc1e1a30bf27/viewer/27b52f


## やること
- ローカル環境とPRを作成したときにlintを走らせて指摘してもらう


## やってみる
 
#### ● ローカルで指摘してもらうようにする
１. golangci-lintのインストール

以下を参考にしてローカルにgolangci-lintをインストールする

`go get`や`go install`でのインストールは推奨されておらず、macであればbrewなどを使ってインストールする方がいいみたいです。

> Note: such go install/go get installation aren't guaranteed to work. We recommend using binary installation.

https://golangci-lint.run/welcome/install

２. 対象のプロジェクトのディレクトでlintを走らせる

あとは以下のコマンドを実行するだけで、プロジェクトのコードに対する指摘内容がコンソールに表示されます！
```
golangci-lint run
```

３.　凝りたい場合は設定ファイルを書く
設定ファイルがなくても`golangci-lint run`は使用できますが、凝りたい場合はプロジェクトのルートディレクトリに以下のどれかのファイルを配置する
- `.golangci.yml`
- `.golangci.yaml`
- `.golangci.toml`
- `.golangci.json`

設定項目はたくさんありますが、私は実行したくないlintだけを指定するようにしました！
指定の仕方は以下の項目を使って設定します。
> disable-all →全てのlinterを無効にする(デフォルトで有効なlinterも無効になります)
enable-all →全てのlinterを有効にする
disable → 指定したlinterを無効にする
enable → 指定したlinterを有効にする

私はブラックリスト方式（一旦全部ONにして実行したくないやつだけ指定）で以下にのように指定しました！
``` yml
linters:
  enable-all: true
  disable:
    - prealloc 
    - godot 
    - depguard
〜〜〜〜〜〜〜〜〜〜〜〜
```

`disable`洗い出し方としては、一度lintを走らせてみて、細かいことや~~しょうもない~~ことを指摘しているものを実行しないように設定しました。😇
もっと詳しくlintの機能を見てみて吟味されたい方は以下の際を参考にされると良いと思います！

https://zenn.dev/sanpo_shiho/books/61bc1e1a30bf27/viewer/642fe9

#### ● githubでPRを出したときに指摘してもらうようにする

１. github action用のファイルをpushできるようにする

初めてworkflowを編集する場合personal access tokenの設定によってはファイルがpushできないので以下サイトを参考に設定を変更しておきます。

https://qiita.com/atsutama/items/10353f122fcb9f58c1d9

２. github actionに必要なファイルを作成

必要なファイルはシンプルで`.github/workflows/golangci-lint.yml` を作成するだけです！

公式のreadmeがあるので詳しくみたい方はそちらを参考にしてください🫡

https://github.com/golangci/golangci-lint-action

私は`Simple Example`を参考に作成しました。
``` yml
name: golangci-lint
on:
  push:
    branches:
      - main
      - develop
  pull_request:

permissions:
  contents: read
  pull-requests: read

jobs:
  golangci:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ^1.22
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v6
        with:
          version: v1.59
          only-new-issues: true #プルリクエストにアクセスするために必要
          github-token: ${{ secrets.github_token }} #only-new-issuesを使う時は必要
          args: --timeout=30m --config=.golangci.yml --issues-exit-code=0
```

ちなみに`secrets.github_token`はgithubが自動で発行してくれるものなので、こちらで変数に格納しておくなどは必要ないです

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


また設定ファイルを作成している場合は、github actionのymlファイルの位置は関係なくルートディレクトリの位置からのlinter用の設定ファイル（`.golangci.yml`）の位置を指定してあげれば大丈夫です！🤛

３. 何かしらのPRを出してみる
PRを出してみるとマージするボタンらへんでlintがチェックしている感じの表示が出ると思います。
`failed`となる場合はDetailからエラーの内容を確認してみましょう！　私は設定ファイルの位置がおかしくて何度もエラーになりました。🥲


### まとめ
私はgoにも明るくなく、github actionも使ったことがなかったので、今回の作業はとても勉強になりました。
またlintを導入してから、指摘内容から学ぶこともたくさんありました！　
実装もそれなりに進んでおり、指摘内容に対して修正できていない部分もあるので1つ1つ勉強しながら修正していこうと思います！🥳