Slide 1

Slide 1 text

GolangCI Λ࢖ͬͯ ίʔυͷ඼࣭Λอͪͳ͕Β շదͳ Golang ੜ׆ΛૹΔ࿩ 19/01/31 Go(Un)ConferenceʢGo͋Μ͜ʣLTେձ 5kg Dai Kurosawa / @ponde_m

Slide 2

Slide 2 text

Introduce

Slide 3

Slide 3 text

Έͳ͞ΜɺLint ࢖ͬͯ·͔͢

Slide 4

Slide 4 text

ઌ೔ͷ golang.tokyo #21 Ͱ΋͜Μͳ͓࿩͕͋Γ·ͨ͠

Slide 5

Slide 5 text

՝୊ͷϑΟʔυόοΫ From: 34ਓͷGoͷ՝୊ΛϨϏϡʔͯ͠ײͨ͜͡ͱ
 (https://docs.google.com/presentation/d/1TAwxT9mRmiEjQOZurz-TbXc8SQf0mlEJDS8tL49Q-M4)

Slide 6

Slide 6 text

՝୊ͷϑΟʔυόοΫ From: 34ਓͷGoͷ՝୊ΛϨϏϡʔͯ͠ײͨ͜͡ͱ
 (https://docs.google.com/presentation/d/1TAwxT9mRmiEjQOZurz-TbXc8SQf0mlEJDS8tL49Q-M4)

Slide 7

Slide 7 text

πʔϧ࢖͍͖ͬͯ·͠ΐ͏ʂ

Slide 8

Slide 8 text

ࠓ೔͸͍ͭ͜ͷ࿩Ͱ͢

Slide 9

Slide 9 text

GolangCI ? ʕ ◔ϖ◔ʔ

Slide 10

Slide 10 text

GolangCI ͱ͸ • GitHub ͷ Pull Request ͷ໰୊Λݕ஌ͯ͠ίϝϯτͯ͘͠ΕΔ Golang ༻ ͷ CI αʔϏε • ͍ΖΜͳ Linter Λ࣮ߦͯ͘͠ΕΔ • OSS ͳΒແྉͰ࢖͑Δ • Private Repo ͸1Ϣʔβ $20/mo • GolangCI ࣗମ΋ OSS ͳͷͰιʔε͕શ෦ެ։͞Ε͍ͯΔ • https://github.com/golangci Image From: https://golangci.com/

Slide 11

Slide 11 text

࣮ߦͯ͘͠ΕΔ Linter • શ 31 छྨ (19/01/31 ݱ࣌఺ ͷυΩϡϝϯτ্) • ΊͬͪΌ͋Δ • ࣮ࡍ͸ Linter ͕ merge ͞ΕͨΓͯ͠ΔͷͰਖ਼֬ͳछྨ਺ ͱͯ͠͸΋ͬͱগͳ͔ͬͨΓ͢Δ • جຊͷ gofmt, goimports, govet ͔Β
 errorcheck ͳͲҰൠతʹ࢖ΘΕͯͦ͏ͳ΋ͷ͸໢ཏ͞Ε ͯΔ͸ͣ

Slide 12

Slide 12 text

࣮ߦΠϝʔδ

Slide 13

Slide 13 text

࢖͍ํ • https://golangci.com/ ʹߦͬͯ GitHub ೝূͯ͠ϦϙδτϦબ୒ ͢Δ͚ͩ • 30 ඵͰऴΘΔͷͰΈΜͳ΍Ζ͏ʂ

Slide 14

Slide 14 text

ద༻͢Δ Linter ͷΧελϚΠζ • .golangci.yml ʹ৭ʑॻ͍ͯ͋͛Δ • σϑΥϧτͩͱແޮʹͳ͍ͬͯΔ Linter ͕݁ߏଟ͍ͷͰ஫ҙ • https://github.com/golangci/golangci- lint#enabled-by-default-linters

Slide 15

Slide 15 text

Ͱ΋ Linter ͸ CI ͚ͩͰ͸ͳ͘ ϩʔΧϧͰ΋ಈ͔͍ͨ͠ (push ͠ͳ͍ͱ݁ՌݟΕͳ͍ͷ͸ͩΔ͍)

Slide 16

Slide 16 text

GolangCI-Lint

Slide 17

Slide 17 text

Golang-CI Lint • ϩʔΧϧͰ GolangCI Ͱಈ͘ Lint Λ࣮ߦͰ͖Δ • CircleCI ͳͲͷ CI αʔϏεʹ૊ΈࠐΉ • VSCode ͳͲͷΤσΟλͱ౷߹Ͱ͖Δ • ࣅͨΑ͏ͳ Linter ʹ gometalinter ͕ଘࡏ͢Δ͕ͦΕΑΓ΋ߴ଎ʹಈ࡞ ͢Δͷ͕ಛ௃ • ଞʹ΋৭ʑվળ͞Ε͍ͯΔ (ޙड़) • Istio ΍ kustomize Ͱ࢖ΘΕ͍ͯͨΓ͢Δ

Slide 18

Slide 18 text

gometalinter ͱͷൺֱ From: https://github.com/golangci/golangci-lint#golangci-lint-vs-gometalinter

Slide 19

Slide 19 text

gometalinter ͱͷൺֱ • 2 ~ 7ഒ͘Β͍଎͍ • 26%͘Β͍ϝϞϦফඅ͕গͳ͍ • ฏߦॲཧ਺ͪΌΜͱ੍ޚͰ͖Δ • ग़ྗϑΥʔϚοτΛΧελϚΠζͰ͖Δ • আ֎ϦετͳͲΛ࢖ͬͯҰൠతͳޡݕ஌ʹରԠ • Git ͷεςʔδϯά, τϥοΩϯά͞Εͯͳ͍ϑΝΠϧͷΈʹ࣮ߦ,
 ಛఆͷϦϏδϣϯҎ߱ͷίϛοτʹର࣮ͯ͠ߦΈ͍ͨͳઃఆ͕Ͱ͖ΔͷͰେن໛ͳίʔυ ϕʔεʹ΋ಋೖ͕Ͱ͖Δ • Linter ͷݸผͷΠϯετʔϧ͕ෆཁͰ GolangCI-Lint ͚ͩΠϯετʔϧ͢Ε͹Α͍ • YAML Ͱઃఆ͕Ͱ͖Δ From: https://github.com/golangci/golangci-lint#golangci-lint-vs-gometalinter

Slide 20

Slide 20 text

gometalinter ͱͷൺֱ From: https://github.com/golangci/golangci-lint#comparison-with-gometalinter

Slide 21

Slide 21 text

ΊͬͪΌൺֱͯ͠Δ

Slide 22

Slide 22 text

Φεεϝͷ࢖͍ํ (?) • ೴ࢮͰ enable-all • શ෦ͷ Linter ͕ಈ͘

Slide 23

Slide 23 text

ͱݴ͍͍ͨͱ͜Ζ͚ͩͲ ྲྀੴʹͭΒ͍

Slide 24

Slide 24 text

ͭΒ͍ྫ • gochecknoinits • init ؔ਺͕͋ΔͱౖΒΕΔ From: https://github.com/leighmcculloch/gochecknoinits

Slide 25

Slide 25 text

Lint ͸ద੾ʹ࢖͏ • ݫ͗͢͠Δ Lint ͸ෛ୲ʹͳΔ • ಛʹ CI ͷϫʔΫϑϩʔʹ૊Έࠐ·Ε͍ͯΔ৔߹ ͸ڧ੍ྗ͕͋ΔͷͰ஫ҙ͢Δ • νʔϜ։ൃͷ৔߹ͳͲ͸ແཧͳ͘औΓ૊ΊΔΑ͏ɺ খ͘͞গͣͭ͠ಋೖͯ͘͠ • ద੾ͳબ୒ɺΧελϚΠζΛ͠Α͏

Slide 26

Slide 26 text

Ͳͷ Linter Λ࢖͏໰୊

Slide 27

Slide 27 text

@ponde_m ͷීஈ • ΘΓͱ೴ࢮͯ͠Δ • ແޮʹ͍ͯ͠Δ Linter • gochecknoglobals • άϩʔόϧείʔϓͷม਺͕͋ͬͨΒౖΒΕΔ • gochecknoinits • init ؔ਺͕͋ͬͨΒౖΒΕΔ

Slide 28

Slide 28 text

͜ͷ··ͩͱ ͋·ΓࢀߟʹͳΒͳ͍ͷͰ

Slide 29

Slide 29 text

࢖͍ͬͯΔ Linter Λ ެ։͍ͯ͠Δձࣾ͞Μͷ঺հ

Slide 30

Slide 30 text

ϝϧΧϦ͞Μ From: Microservices implementation guide in Go at Mercari Inc
 (https://speakerdeck.com/ygnmhdtt/microservices-implementation-guide-in-go-at-mercari-inc?slide=27)

Slide 31

Slide 31 text

αΠϘ΢ζ͞Μ From: Neco ϓϩδΣΫτͷεΩϧνΣοΫγʔτ
 (https://gist.github.com/ymmt2005/bd92296166e52d1beba9df8ac516a9db)

Slide 32

Slide 32 text

͔͜͜Β͸ ࠓग़͖ͯͨ Linter + ͓͢͢Ί Linter ͷ ঺հίʔφʔ

Slide 33

Slide 33 text

gofmt • ίʔυ੔ܗ • جຊ

Slide 34

Slide 34 text

gofmt -s • -s ΦϓγϣϯΛ͚ͭΔͱίʔυΛγϯϓϧʹͯ͘͠ΕΔ

Slide 35

Slide 35 text

goimports • gofmt + import ͷमਖ਼Λͯ͘͠ΕΔ • جຊ

Slide 36

Slide 36 text

golint • Effective Go ΍ CodeReviewComments ʹج͍ͮ ͯίʔσΟϯάελΠϧΛࢦఠͯ͘͠ΕΔ From: Effective Go
 (https://golang.org/doc/effective_go.html)
 From: CodeReviewComments
 (https://github.com/golang/go/wiki/CodeReviewComments)

Slide 37

Slide 37 text

govet • ίϯύΠϥ͕ݕग़ͯ͘͠Εͳ͍ΤϥʔΛࢦఠͯ͘͠ΕΔ

Slide 38

Slide 38 text

errcheck • error ͷϋϯυϦϯάͯ͠ͳ͍ͱౖΒΕΔ

Slide 39

Slide 39 text

staticcheck • αʔυύʔςΟ੡͚ͩͲ৭ʑͳ໰୊Λݕ஌ͯ͘͠ΕΔ • govet ͬΆ͍΍ͭ • νΣοΫͯ͘͠ΕΔ΋ͷ͸ຊ౰ʹ৭ʑ͋ΔͷͰυΩϡϝϯτࢀর • https://staticcheck.io/docs/checks

Slide 40

Slide 40 text

misspell • ίϝϯτ಺ͷεϖϧϛεΛݟ͚ͭͯ͘ΕΔ

Slide 41

Slide 41 text

interfacer • ͜͜ͷҾ਺ΠϯλϑΣʔεʹͰ͖ΔΑΈ͍ͨͳͷΛڭ͑ͯ͘ΕΔ

Slide 42

Slide 42 text

prealloc • ࣄલʹׂΓ౰ͯՄೳͳεϥΠεΛݟ͚ͭͯ͘ΕΔ

Slide 43

Slide 43 text

lll • 1ߦ௕͗͢໰୊Λڭ͑ͯ͘ΕΔ

Slide 44

Slide 44 text

·ͱΊ

Slide 45

Slide 45 text

·ͱΊ • GolangCI-Lint ͸୯ମͰ·ͱΊͯ Linter Λ࣮ߦ Ͱ͖ΔΠέͯΔπʔϧ • Linter ͸ద੾ʹઃఆ͢Δ • ಋೖ͸খ͘͞গͣͭ͠ • ݸਓɺνʔϜʹ߹ΘͤͨΧελϚΠζΛ

Slide 46

Slide 46 text

͓͠·͍ ʕ ◔ϖ◔ʔ