Go(Un)Conference(Goあんこ)LT大会 5kg で発表した資料です https://gounconference.connpass.com/event/112942/
GolangCI Λͬͯίʔυͷ࣭Λอͪͳ͕Βշదͳ Golang ੜ׆ΛૹΔ19/01/31 Go(Un)ConferenceʢGo͋Μ͜ʣLTେձ 5kgDai Kurosawa / @ponde_m
View Slide
Introduce
Έͳ͞ΜɺLint ͬͯ·͔͢
ઌͷ golang.tokyo #21Ͱ͜Μͳ͓͕͋Γ·ͨ͠
՝ͷϑΟʔυόοΫFrom: 34ਓͷGoͷ՝ΛϨϏϡʔͯ͠ײͨ͜͡ͱ (https://docs.google.com/presentation/d/1TAwxT9mRmiEjQOZurz-TbXc8SQf0mlEJDS8tL49Q-M4)
πʔϧ͍͖ͬͯ·͠ΐ͏ʂ
ࠓ͍ͭ͜ͷͰ͢
GolangCI ?ʕ ◔ϖ◔ʔ
GolangCI ͱ• GitHub ͷ Pull Request ͷΛݕͯ͠ίϝϯτͯ͘͠ΕΔ Golang ༻ͷ CI αʔϏε• ͍ΖΜͳ Linter Λ࣮ߦͯ͘͠ΕΔ• OSS ͳΒແྉͰ͑Δ• Private Repo 1Ϣʔβ $20/mo• GolangCI ࣗମ OSS ͳͷͰιʔε͕શ෦ެ։͞Ε͍ͯΔ• https://github.com/golangciImage From: https://golangci.com/
࣮ߦͯ͘͠ΕΔ Linter• શ 31 छྨ (19/01/31 ݱ࣌ ͷυΩϡϝϯτ্)• ΊͬͪΌ͋Δ• ࣮ࡍ Linter ͕ merge ͞ΕͨΓͯ͠ΔͷͰਖ਼֬ͳछྨͱͯͬ͠ͱগͳ͔ͬͨΓ͢Δ• جຊͷ gofmt, goimports, govet ͔Β errorcheck ͳͲҰൠతʹΘΕͯͦ͏ͳͷཏ͞ΕͯΔͣ
࣮ߦΠϝʔδ
͍ํ• https://golangci.com/ ʹߦͬͯGitHub ೝূͯ͠ϦϙδτϦબ͢Δ͚ͩ• 30 ඵͰऴΘΔͷͰΈΜͳΖ͏ʂ
ద༻͢Δ Linter ͷΧελϚΠζ• .golangci.yml ʹ৭ʑॻ͍ͯ͋͛Δ• σϑΥϧτͩͱແޮʹͳ͍ͬͯΔLinter ͕݁ߏଟ͍ͷͰҙ• https://github.com/golangci/golangci-lint#enabled-by-default-linters
Ͱ Linter CI ͚ͩͰͳ͘ϩʔΧϧͰಈ͔͍ͨ͠(push ͠ͳ͍ͱ݁ՌݟΕͳ͍ͷͩΔ͍)
GolangCI-Lint
Golang-CI Lint• ϩʔΧϧͰ GolangCI Ͱಈ͘ Lint Λ࣮ߦͰ͖Δ• CircleCI ͳͲͷ CI αʔϏεʹΈࠐΉ• VSCode ͳͲͷΤσΟλͱ౷߹Ͱ͖Δ• ࣅͨΑ͏ͳ Linter ʹ gometalinter ͕ଘࡏ͢Δ͕ͦΕΑΓߴʹಈ࡞͢Δͷ͕ಛ• ଞʹ৭ʑվળ͞Ε͍ͯΔ (ޙड़)• Istio kustomize ͰΘΕ͍ͯͨΓ͢Δ
gometalinter ͱͷൺֱFrom: https://github.com/golangci/golangci-lint#golangci-lint-vs-gometalinter
gometalinter ͱͷൺֱ• 2 ~ 7ഒ͘Β͍͍• 26%͘Β͍ϝϞϦফඅ͕গͳ͍• ฏߦॲཧͪΌΜͱ੍ޚͰ͖Δ• ग़ྗϑΥʔϚοτΛΧελϚΠζͰ͖Δ• আ֎ϦετͳͲΛͬͯҰൠతͳޡݕʹରԠ• Git ͷεςʔδϯά, τϥοΩϯά͞Εͯͳ͍ϑΝΠϧͷΈʹ࣮ߦ, ಛఆͷϦϏδϣϯҎ߱ͷίϛοτʹର࣮ͯ͠ߦΈ͍ͨͳઃఆ͕Ͱ͖ΔͷͰେنͳίʔυϕʔεʹಋೖ͕Ͱ͖Δ• Linter ͷݸผͷΠϯετʔϧ͕ෆཁͰ GolangCI-Lint ͚ͩΠϯετʔϧ͢ΕΑ͍• YAML Ͱઃఆ͕Ͱ͖ΔFrom: https://github.com/golangci/golangci-lint#golangci-lint-vs-gometalinter
gometalinter ͱͷൺֱFrom: https://github.com/golangci/golangci-lint#comparison-with-gometalinter
ΊͬͪΌൺֱͯ͠Δ
Φεεϝͷ͍ํ (?)• ࢮͰ enable-all• શ෦ͷ Linter ͕ಈ͘
ͱݴ͍͍ͨͱ͜Ζ͚ͩͲྲྀੴʹͭΒ͍
ͭΒ͍ྫ• gochecknoinits• init ͕ؔ͋ΔͱౖΒΕΔFrom: https://github.com/leighmcculloch/gochecknoinits
Lint దʹ͏• ݫ͗͢͠Δ Lint ෛ୲ʹͳΔ• ಛʹ CI ͷϫʔΫϑϩʔʹΈࠐ·Ε͍ͯΔ߹ڧ੍ྗ͕͋ΔͷͰҙ͢Δ• νʔϜ։ൃͷ߹ͳͲແཧͳ͘औΓΊΔΑ͏ɺখ͘͞গͣͭ͠ಋೖͯ͘͠• దͳબɺΧελϚΠζΛ͠Α͏
Ͳͷ Linter Λ͏
@ponde_m ͷීஈ• ΘΓͱࢮͯ͠Δ• ແޮʹ͍ͯ͠Δ Linter• gochecknoglobals• άϩʔόϧείʔϓͷม͕͋ͬͨΒౖΒΕΔ• gochecknoinits• init ͕ؔ͋ͬͨΒౖΒΕΔ
͜ͷ··ͩͱ͋·ΓࢀߟʹͳΒͳ͍ͷͰ
͍ͬͯΔ Linter Λެ։͍ͯ͠Δձࣾ͞Μͷհ
ϝϧΧϦ͞ΜFrom: Microservices implementation guide in Go at Mercari Inc (https://speakerdeck.com/ygnmhdtt/microservices-implementation-guide-in-go-at-mercari-inc?slide=27)
αΠϘζ͞ΜFrom: Neco ϓϩδΣΫτͷεΩϧνΣοΫγʔτ (https://gist.github.com/ymmt2005/bd92296166e52d1beba9df8ac516a9db)
͔͜͜Βࠓग़͖ͯͨ Linter+͓͢͢Ί Linter ͷհίʔφʔ
gofmt• ίʔυܗ• جຊ
gofmt -s• -s ΦϓγϣϯΛ͚ͭΔͱίʔυΛγϯϓϧʹͯ͘͠ΕΔ
goimports• gofmt + import ͷमਖ਼Λͯ͘͠ΕΔ• جຊ
golint• Effective Go CodeReviewComments ʹج͍ͮͯίʔσΟϯάελΠϧΛࢦఠͯ͘͠ΕΔFrom: Effective Go (https://golang.org/doc/effective_go.html) From: CodeReviewComments (https://github.com/golang/go/wiki/CodeReviewComments)
govet• ίϯύΠϥ͕ݕग़ͯ͘͠Εͳ͍ΤϥʔΛࢦఠͯ͘͠ΕΔ
errcheck• error ͷϋϯυϦϯάͯ͠ͳ͍ͱౖΒΕΔ
staticcheck• αʔυύʔςΟ͚ͩͲ৭ʑͳΛݕͯ͘͠ΕΔ• govet ͬΆ͍ͭ• νΣοΫͯ͘͠ΕΔͷຊʹ৭ʑ͋ΔͷͰυΩϡϝϯτࢀর• https://staticcheck.io/docs/checks
misspell• ίϝϯτͷεϖϧϛεΛݟ͚ͭͯ͘ΕΔ
interfacer• ͜͜ͷҾΠϯλϑΣʔεʹͰ͖ΔΑΈ͍ͨͳͷΛڭ͑ͯ͘ΕΔ
prealloc• ࣄલʹׂΓͯՄೳͳεϥΠεΛݟ͚ͭͯ͘ΕΔ
lll• 1ߦ͗͢Λڭ͑ͯ͘ΕΔ
·ͱΊ
·ͱΊ• GolangCI-Lint ୯ମͰ·ͱΊͯ Linter Λ࣮ߦͰ͖ΔΠέͯΔπʔϧ• Linter దʹઃఆ͢Δ• ಋೖখ͘͞গͣͭ͠• ݸਓɺνʔϜʹ߹ΘͤͨΧελϚΠζΛ
͓͠·͍ʕ ◔ϖ◔ʔ