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
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
220
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
910
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
200
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
480
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.1k
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
110
Webの技術スタックで マルチプラットフォームアプリ開発を可能にするElixirDesktopの紹介
thehaigo
2
1k
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
860
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
What's in a price? How to price your products and services
michaelherold
243
12k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
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