Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する ...
Search
Arthur
October 23, 2024
Programming
10
2.6k
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
https://gotalk.connpass.com/event/331992/
Arthur
October 23, 2024
Tweet
Share
More Decks by Arthur
See All by Arthur
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
Mackerel開発チームの障害対応演習 ──新卒エンジニアが障害対応指揮官を務めるに至るまでのステップ / Mackerel Drink Up 出張版@福岡
arthur1
0
250
slog登場に伴うloggerの取り回し手法の見直し / kamakura.go #6
arthur1
1
2k
otelcol receiver 自作RTA / Pepabo Tech Conference #22 春のSREまつり
arthur1
0
3k
見せ算をScalaで実装してみた / Scalaわいわい勉強会 #2
arthur1
0
2k
技術習得を支え続けた私の個人開発ヒストリー / Hatena Engineer Seminar #28
arthur1
1
1.7k
Scala の好きなところ 難しいところ / #scala_waiwai
arthur1
0
1.2k
学園祭Web開発の現場とPHPのこれまでとこれから ── 技術選定と教育から語る / PHP Conference Japan 2023
arthur1
0
1.1k
仮説検証サイクルでユーザーの声を 高速に叶える「キカク組」の取り組み / Mackerel Drink Up #11 arthur-1
arthur1
0
1.1k
Other Decks in Programming
See All in Programming
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.4k
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
CSC509 Lecture 12
javiergs
PRO
0
160
Amazon Qを使ってIaCを触ろう!
maruto
0
400
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
280
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
Better Code Design in PHP
afilina
PRO
0
120
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
430
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
890
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
220
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.7k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Code Review Best Practice
trishagee
64
17k
Writing Fast Ruby
sferik
627
61k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
How to Ace a Technical Interview
jacobian
276
23k
BBQ
matthewcrist
85
9.3k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Rails Girls Zürich Keynote
gr2m
94
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Transcript
go.mod、DockerfileやCI設定に 分散しがちなGoのバージョンを まとめて管理する id:arthur-1 株式会社はてな 2024-10-23 Go Connect #3 1
Arthurと申します 株式会社はてな アプリケーションエンジニア 好きなプログラミング言語マスコッ トはD言語くんとDenoの恐竜です 𝕏: @Arthur1__ 2
MackerelはGoを使って作ってます 3
昨日はイベントやってました 4 https://www.youtube.com/live/NJM3HK744Bs?si=Z0XYOkDOk5yOCFHL
本題 5
アプリケーションで 利用したい Goのバージョ ン どう宣言してますか? 6
go.modのgo directive 7 module github.com/Arthur1/hoge go 1.22
go.modのtoolchain directive 8 module github.com/Arthur1/hoge go 1.22 toolchain go1.23.0
Dockerfileのbase image tag 9 FROM golang:1.23-bookworm AS builder COPY .
. RUN go build -o server ./cmd/server
GitHub Actionsのsetup-go 10 - uses: actions/setup-go@v5 with: go-version: 1.23
GitHub Actionsのsetup-go 11 - uses: actions/setup-go@v5 with: go-version-file: go.mod
こんな悩みはないか? • 様々な場所にGoのバージョンが書かれてい て、アップデート時の書き換えが大変 • パッケージの自動更新をするツールでGoの バージョンも自動アップデートしていきたい 12
ソリューションを 提示する前に 13
Goビルトインの バージョン宣言方法紹介 14
go.modのgo directive > The go directive sets the minimum version
of Go required to use this module. https://go.dev/ref/mod#go-mod-file-go ビルドできる最小の言語バージョンを定義する 15
go.modのtoolchain directive > A toolchain directive declares a suggested Go
toolchain to use with a module. https://go.dev/ref/mod#go-mod-file-toolchain 推奨されるGoのツールチェーンのバージョン (の下限)を定義する 16
Goのツールチェーンの仕組み GOTOOLCHAIN=auto(デフォルト)なら、推奨され るツールチェーンかそれより新しいものがない場合に ダウンロードされる goenvやasdfで複数のGoのバイナリを使い分ける必要 は、基本はないはず 17
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.0で go directiveが1.23.0 →使用されるツールチェーンのバージョンは? 18
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.0で go directiveが1.23.0 →使用されるツールチェーンのバージョンは1.23.0 19
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.3で go directiveが1.23.0 →使用されるツールチェーンのバージョンは? 20
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.3で go directiveが1.23.0 →使用されるツールチェーンのバージョンは1.23.3 21
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.0で go directiveが1.22.0 toolchain directiveがgo1.23.3 →使用されるツールチェーンのバージョンは? 22
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.0で go directiveが1.22.0 toolchain directiveがgo1.23.3 →使用されるツールチェーンのバージョンは1.23.3 23
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.3で go directiveが1.22.0 toolchain directiveがgo1.22.0 →使用されるツールチェーンのバージョンは? 24
Goのツールチェーンの仕組み(例) 手元のGoのバイナリが1.23.3で go directiveが1.22.0 toolchain directiveがgo1.22.0 →使用されるツールチェーンのバージョンは1.23.3 25
[再掲]こんな悩みはないか? • 様々な場所にGoのバージョンが書かれてい て、アップデート時の書き換えが大変 • パッケージの自動更新をするツールでGoの バージョンも自動アップデートしていきたい 26
ソリューション 27
私の主張 アプリケーションで使用されるべき Goのバージョンは go.modのtoolchain directiveで 宣言しよう! 28
ただし 宣言したバージョンかそれ以上のツールチェーンを許容す るので、宣言したものと常にピッタリ一致させたい場合は 工夫が必要 こういうニーズもあるはずだが、今回触れるには時間が足 りなさすぎるので、後で紹介するブログを読んでください 29
この仮定って現実的? 「宣言したバージョンか、それ以上はOK」という管理方 法で大丈夫か?という話 セキュリティ対応で特定のtoolchain以上にしたいという ニーズはあるはずで、これは満たせる Goの後方互換を信じるなら十分そう 30
パブリックな開発では OSSの場合や、公開packageが他のコードから参照され ている場合に、go directiveで不必要に他人のビルド環境 を制約する必要はない go directiveは利用したい言語機能が増えたときにはじめ てアップデートすれば良い 31
toolchainはRenovateで更新可能 Renovateはtoolchain directiveを最新のものに更新 するPull Requestを勝手に作ってくれる 32
Dockerfileや CIの設定に書かれた バージョンはどうする? 33
Dockerfile 公式のGoのイメージはGOTOOLCHAIN=localに なっている(toolchainをダウンロードしない) DockerfileにENV GOTOOLCHAIN=autoと明示的 に書くことで、必要に応じてtoolchainがダウン ロードされる 34
Dockerfile(例) 35 FROM golang:bookworm AS builder ENV GOTOOLCHAIN=auto COPY .
. RUN go build -o server ./cmd/server
GitHub Actionsのsetup-go go-version-file引数にgo.modを渡してあげ たらtoolchain directiveを参照してくれる? 36
GitHub Actionsのsetup-go go-version-file引数にgo.modを渡してあげ たらtoolchain directiveを参照してくれる? →わけではない 37
GitHub Actionsのsetup-go 38 - uses: actions/setup-go@v5 with: go-version-file: go.mod go
1.21.0 toolchain go1.23.0
GitHub Actionsのsetup-go 39 - uses: actions/setup-go@v5 with: go-version-file: go.mod go
1.21.0 toolchain go1.23.0 ① setup-goがgo directiveを見て1.21.0のGoバイナリを準備する ② build時にtoolchain directiveを見て1.23.0をダウンロードする 動くには動くけど、毎回DLしてて勿体無い
GitHub Actionsのsetup-go 40 - uses: actions/setup-go@v5 with: go-version: stable 宣言したツールチェーンと同じか、それより新しいものを許容する場
合には、とりあえずここはstableでよい。古い分にはtoolchainが自 動でダウンロードされる
まとめ Goのバージョンの決定についてはGoのエコシス テムにすべて寄せることで、テストやアップデー ト時の労力を減らすことができる! 今回のやり方ならRenovateのPRをmergeするだ けで推奨ツールチェーンが勝手に上がっていく 41
合わせて読んでね 1. アプリケーションではなくライブラリの場合 2. strictにGoのバージョンを指定したい場合 にも触れています: • Go製アプリケーション/ライブラリにおけるメンテナ ンス性を重視したGoのバージョン管理戦略 •
GitHub ActionsのGoのバージョンをtoolchainディ レクティブの指定ぴったりで固定したい場合 42
おしまい 43