Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
BB流 golangci-lintのイロハ
Search
Taisuke Okamoto a.k.a BigBaBy
February 07, 2024
Technology
2.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BB流 golangci-lintのイロハ
- golangci-lintについての紹介と、BB流の使い方についてご紹介
Taisuke Okamoto a.k.a BigBaBy
February 07, 2024
More Decks by Taisuke Okamoto a.k.a BigBaBy
See All by Taisuke Okamoto a.k.a BigBaBy
1つのPodを移行しようとしたら、別のPodが止まった
b1gb4by
0
87
さくらのクラウドでつくるCloudNative Daysのオブザーバビリティ基盤
b1gb4by
0
370
情熱と工夫で走り抜け! コミュニティをささえるObservability実践録
b1gb4by
1
590
Rancherと出会って - BB流 初心者でもわかる、虜になる瞬間
b1gb4by
0
320
リアルイベントのパワー! オフラインイベントの不思議な魅力に迫る
b1gb4by
0
3.3k
CloudNative Daysを支える Observabilityの取り組み 2023年度編
b1gb4by
0
260
Other Decks in Technology
See All in Technology
形式手法を使って仕様をコーディングしよう
mikanichinose
0
180
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
140
IR Today: Theory, Practice, and Agents
dtunkelang
0
350
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.2k
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
420
FactoryBotアンチパターン / factory_bot anti-patterns
toshimaru
0
140
Codex概要
ymiya55
0
440
SREでアラート疲れを 解決しよう!
kairim0
1
210
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
450
全人類(ほぼ)AWS Organizations の上でAWSを利用している、その世界を知る話
htan
0
120
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
290
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
280
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
290
The World Runs on Bad Software
bkeepers
PRO
72
12k
KATA
mclloyd
PRO
35
16k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
600
Automating Front-end Workflow
addyosmani
1369
210k
Building the Perfect Custom Keyboard
takai
2
890
Embracing the Ebb and Flow
colly
88
5.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Transcript
2024/02/07 【Oracle Cloud Hangout Cafe Season 8 #1 】 株式会社IDCフロンティア
岡本泰典 BB流 golangci-lintのイロハ
Agenda • WHORU? • golangci-lintってなに? • BBが思う「これはいいぞ」Linter 集 • BB流
golangci-lint の活用方法 • まとめ
岡本泰典 a.k.a BigBaBy 株式会社IDCフロンティア KaaS Engineer (Storage, Network etc...) ◆趣味
DJ、たまにVJ(Visual Jockey)もします ◆最近の出来事 Cloud Native Days Tokyo 2024 Co-chair に就任しました @taisuke_bigbaby WHORU?
本LTのgolangci-lintに関することはBB本人の経 験と調査に基づくものであり、全ての見解は、BB自 身のものです。 CAUTION
golangci-lintってなに?
• Goの便利な静的解析ツールの1つ • 1つで多くのLinterを管理・実行が可能 • 複数のLinterを並列に実行可能 • キャッシュで高速化を実現 • YAMLファイルでの設定管理
◦ TOML, JSONでも可 • 様々なエディタやIDEでサポート golangci-lint https://github.com/golangci/golangci-lint/blob /master/assets/go.png
デフォルトで有効化されているLinter Description Preset 未チェックエラーをチェックする bugs, error Linter errcheck gosimple govet
ineffassign staticcheck unused 不要なコードを簡素化してくれる style コンパイラとは別の観点でチェックを行い サジェストをしてくれる bugs, metalinter 不要な代入をチェック unused govetよりも包括的にチェックを行う bugs, metalinter 未使用の変数や定数、関数や型などをチェック する unused
• 下のコマンドを実行するだけで良い 一般的な操作 # 設定ファイルがない場合、全てデフォルトの設定値で実行 # 実行したディレクトリ直下に設定ファイルがある場合、そのファイルを参照 $ golangci-lint run
• --fix オプションをつけることで自動的に修正 # Auto Fixに対応しているLinterにのみ有効 $ golangci-lint run --fix
設定ファイルの構成 run: # golangci-lintの実行に関する設定 option: value output: # 出力時の設定 option:
value linters-settings: # Linter固有の設定 option: value linters: # 使用するLinterに関する設定 option: value issues: # Linterの報告に関しての設定 (特定の報告を無視するなど) option: value severity: # issuesに対する重要度の設定 option: value
Field: run (一部抜粋) • concurrency ◦ 実行時に使用するCPU数 (Default: マシンの論理CPU数) •
timeout ◦ タイムアウト時間 (Default: 1min) • tests ◦ テストファイル(XXX_test.go)を解析に含むかどうか (Default: true) • skip-dirs / skip-files ◦ 除外するディレクトリ・ファイルの設定 (Default: []) • allow-parallel-runners ◦ 並列実行の可否 (Default: false) ▪ デフォルトでは、シーケンシャルな実行を行っている • go ◦ Goのバージョン制御を行う
Field: output (一部抜粋) • format ◦ 出力時の形式を設定 (Default: colored-line-number) ▪
line-number, json, colored-tab, tab, checkstyle, code-climate, junit-xml, github-actions, teamcity ◦ カンマ区切りで複数指定することができ、フォーマット名とパスをコロン記号で区切る ことで、それぞれに出力を与えることができる output: format: checkstyle:report.xml, json:stdout, colored-line-number
Field: linters • disable-all ◦ すべてのLinterを無効化 (Default: false) • enable-all
◦ すべてのLinterを有効化 (Default: false) • enable ◦ 指定したLinterを有効化 • disable ◦ 指定したLinterを無効化 • presets ◦ Preset別にLinterを有効化 • fast ◦ 有効化されたLinterから実行結果が早かったもののみを実行する (Default: false) ▪ なので、最初の実行は高速にならない
Field: linters-settings • Linterごとの固有の設定を記述 ◦ 詳しい設定は公式ドキュメントを参考にするのが良い ▪ Linters | golangci-lint
Field: issues (一部抜粋) • exclude ◦ 特定の文言を含むissueを無視する • exclude-rules ◦
path ▪ 特定のLinterを指定したファイルには実行しない ◦ path-except ▪ 特定のLinterを指定したファイル以外には実行しない ◦ text ▪ 特定のLinterの文言を含むissueを無視する ◦ source ▪ 特定のLinterの箇所のissueを無視する • 例: ^//go:generate
Field: severity (一部抜粋) • default-severity ◦ issueのデフォルトの重大度を設定する (Default: "") ◦
深刻度のルールが定義されており、問題が一致しない場合やルールに深刻度が提供さ れていない場合は、これが適用されるデフォルトの深刻度になる • rules ◦ Linterごとにseverityを設定可能 severity: rules: - linters: - dupl severity: info
BBが思う「これはいいぞ」Linter 集
gofumpt • gofmtをもう少し厳格化したLinter ◦ ただし、gofmtと後方互換性をもっているgofmtとの違い ◦ 1. フォーマットのスタイル ▪ Goの公式のformatterに厳格で一貫性のあるスタイルルールを追加している
◦ 2. セミコロンの自動挿入は行わない ▪ Goのコーディングスタイルではセミコロンを明示的に記述する必要がないため ◦ 3. インポート文の整理 ▪ インポート文を整理し、アルファベット順に並べ替える ▪ また、不要なインポート文を削除する ◦ 4. スペースの挿入と削除 ▪ コード内のスペースの挿入と削除を行い、一貫性のあるスペースの配置を確保する • Auto Fixに対応
gci • goimportsと同じで、Goパッケージのインポート順序を制御 ◦ 結果が一意に決定される • Auto Fix対応 package main
import ( "fmt" go "github.com/golang" _ "github.com/golang/blank" . "github.com/golang/dot" "github.com/daixiang0/gci" _ "github.com/daixiang0/gci/blank" . "github.com/daixiang0/gci/dot" ) package main import ( "fmt" go "github.com/golang" "github.com/daixiang0/gci" _ "github.com/daixiang0/gci/blank" _ "github.com/golang/blank" . "github.com/daixiang0/gci/dot" . "github.com/golang/dot" )
その他のBBおすすめLinter • dupl ◦ 重複しているコードを検知し、冗長化を防ぐ • misspell ◦ スペルミスを検知 (Auto
Fix対応) ▪ localeのオプションはUSとUKを選べるが、USでいいかも? • unconvert ◦ 不要な型の変換を検知 • whitespace ◦ 関数や、if文、for文などに不要な改行がないかを検知 • go-critic ◦ 「これでもか!」ってくらいに解析をしてほしい人向け ◦ より細かい範囲まで検知をおこなってくれます
BB流 golangci-lint の活用方法
• 基本的に、デフォルトで有効になっているLinterはそのままでいい ◦ ソフトウェア品質を担保するためのツールは十二分に用意されている まず、「郷に入っては郷に従え」(Goだけに)
◦ GitHub Actionsの場合 ▪ GitHubではすでにプラグインが存在しているため導入も簡単 • キャッシュなども設定でよしなに設定してくれるので楽ちん ▪ 下図のような感じでUIでもわかりやすく検知箇所を教えてくれる CIには必ず組み込むべし
https://github.com/golangci/golangci-lint-action/blob/master/static/annotations.png
• 様々なエディタに簡単に組み込むことが可能 • VSCodeの場合 ◦ プロジェクト配下に.vscodeディレクトリを作成し、以下のsetting.jsonを追加 ▪ チームでの検知差分をなくす ローカルとCIの環境は統一化する {
"go.lintTool": "golangci-lint", "go.lintFlags": [ "--config=${workspaceFolder}/.golangci-lint.yaml", "--fast" ] }
◦ //nolintって? ▪ golangci-lintにおいて記述した箇所の検知を無視することができる • 「//nolint:linter」で特定のLinterのみ無視することも可能 ◦ ただ、むやみにつけることは良くない ▪ nolintの記載した理由は明記しておくことがベスト
• 「やむを得ない」ときに使いましょう ◦ nolintを付与するときの基準 ▪ 意図的な例外 ▪ 外部ライブラリや自動生成コードの適用 //nolintはむやみに使わない
◦ メンバーとの検知差分をなくすため、ファイルは必ず作成したほうが良い ◦ 最初の linters-settings の設定は最低限で ▪ 使用していく中で、各Linterをチューニングしていくのが良い ◦ disable-all
VS enable-all ▪ disable-all • 必要最低限のLinterを絞りたい人はオススメ • 既存のバグの修正等のみを求める場合は、この設定でOK ▪ enable-all • 新しいLinterを積極的に使いたい • ただし、アップデート時の追従は少し辛さを感じることも... 設定ファイルはシンプルに
まとめ
◦ まずは触ってみよう ▪ デフォルトの設定のままでも良い ◦ Linterにも似たものはたくさんある ▪ デフォルトのLinterは厳格なものはあまり入っていない ▪ チーム、環境にあった強度のものを選ぶのが良い
◦ Linterに興味を持った方 ▪ ぜひ自分で作成してみましょう!! • https://tenntenn.dev/ja/analysis/ まとめ