emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go に Contribute する

f:id:ema_hiro:20211206155511p:plain

Overview

これは 2021年Goアドベントカレンダー 7日目の記事です。
つい最近だいぶ久しぶりに Go 本体に Commit する機会があったので、復習も兼ねてまとめてみました。
OSS に Commit するのは慣れないとすごい敷居が高く感じます(僕もそうでした)が、Go は一度覚えると2回目以降は難なく Commit できる仕組みが整ってているソフトウェアだなと思っているのでこのエントリで少しでも Go にコミットする人が増えればとても嬉しいです。

なお今だと GitHub からも Commit できることがありますが、今回は Contribution Guide に則った方法を記載してます。公式の https://go.dev/doc/contribute#sending_a_change_gerrit に記載されてる内容に沿ってます。

準備

この準備が(多分)一番ハードルが高いと思いますが、 Go は Contribution に関する情報が全て以下のサイトにまとまっており、基本的にはこの通りに準備をすれば Go への Contribution はできるようになります。

go.dev

簡単に順を追って説明します(僕が初めてコントリビュートした時のものをそのままトレースしてます)

CLA の同意とアカウント作成

まず Contributor License Agreements に同意してアカウントの登録をします。以下のような画面が出ると思うのでとりあえず On Yourself で登録して先に進めます。

f:id:ema_hiro:20211206044335p:plain

CLA 同意後(Google アカウント認証後) に https://go.googlesource.com (Gerrit) でもアカウントが作られていると思います。

次に googlesource.com のパスワードを設定します。https://go.googlesource.com の画面で Generate Password を押下します。

f:id:ema_hiro:20211206044416p:plain

パスワードの設定のために Google 認証を進めると、専用のパスワード生成コマンドが出力されます。
これを実行すると .gitcookies というファイルが生成されて git codereview change (後述するレビュー用の CLI ツール) するときに自動で誰が commit したのかを Gerrit 上で確認できるようになります。

ここまででコミットするためのアカウント準備およびコミットする準備の第一段階は終わりです。
このアカウント作成のフローが終わると Go の Review Dashboard にアクセスできるようになっているはずなのでアクセスしてみてください。
https://go-review.googlesource.com/q/status:open+-is:wip が今 CL(*) が上がってる一覧で、実際に開発されてる Go の機能を一覧で見ることができます。

レビューツールを入れる

Go のコントリビュートには専用のツールを使います。
ref: git-codereview

使い方ですが、まず、Contribute Guide に従って go install してきます。
インストールすると git codereview というエイリアスが使えるようになります。

GitHub で使うエイリアスとはちょっと異なりますが、おおむね以下のような対応表です。

git codereview changes = git commit
git codereview mail = git push

より詳細については git codereview help を参照してください。

早速コミットしてみる

https://go.googlesource.com/ から Go の本体を落としてきます。

# Go 本体
git clone https://go.googlesource.com/go

# tools
git clone https://go.googlesource.com/tools

Go 本体に移動してチェックアウト & Add します。ちなみにチェックアウトしたブランチ名が使われるわけではないので実際チェックアウトするかどうかは任意です。自分はわかりやすいのでチェックアウトしておくことが多いですが。
また、地味に大事なことなのですが、チェックアウトした先でコミットログを記載するときは どのパッケージに対して変更を行うのか?ということがわかるように pacakge 名を prefix で追加 します。これ怠るとレビューで Commit コメントについて指摘を貰います。こういうところまでかっちりみられるのも OSS っぽいですね。

cd PATH/TO/go.googlesource.com
git checkout

# 変更

git add -u
git codereview change 

internal/xxx: hogehoge

- TODO

git codereview mail
# これで差分が Gerrit に反映されます。
# Gerrit では GitHub のように commit message が履歴としてずらずら残っていくことがありませんので最初のコミットを書いたらそれに change を加えていく形になります。

ref: https://go.dev/doc/contribute#sending_a_change_gerrit

codereview mail コマンド実行後に上記の Dashboard を見にいくと自分の作った差分(Gerrit では ChangeList* ) が作成されているのが確認できます。
あとは自動的に bot が走ってコアメンバーの方のレビューを受けることができます。ただ、実際にアサインが確定するまでには10分程度ラグがあるのと時差があるので初回のレビューが日本時間の深夜 or 早朝、みたいなことは普通にあるので気長に In Review になるのを待ちましょう。

※ 略して CL という呼称も使われます。

余談ですが、レビューを受けてるとコメントでコミュニケーション取る機会があるのですが、コメント部分にただ記載しても Draft のままなのでちゃんと Reply するという明示的なボタンを押下しないとずっと、下書きのまま残されて続けて、差分を入れたのにレビューがされない、ということが起こります。僕はよく忘れて2,3 日後に気づくことがあります。

まとめ

もともと別で公開しようと思っていたエントリでしたが、いい機会なのでアドベンドカレンダーで公開しました。
Go 本体に Contribute できる人が増えてほしい、という思いから Go 本体に Commit する準備やら実際のレビューの進み方やらをまとめてます。コミットに関する詳細は Contribution Guide に全て書いてあるのでそちらを参照してもらうのが確実かと思いますが、やってみたいけどやり方わからない、という方のために本当に最初の最初のところ(アカウント作成周りとか)だけ簡単に説明させてもらいました。

実際にレビューを受けると Commit メッセージレベルまでレビューを受けることもあります。
本当は普段の開発からそういったところまで意識するべきとも思いますが、なかなか意識が回らないのも事実で、受けたら受けたで新鮮な気分になります。
何よりちゃんと英語勉強しよう、というモチベーションにもなります。
そして初めて Contribute した場合には Contribute に感謝するメッセージを貰えてモチベーションにも繋がりますので、是非受け取ってみてください。

僕も普段 OSS に積極的にコミットするタイプのエンジニアではありませんが、こういう OSS へのコミット方法を教えてもらえる機会がなかったのでまとめてみました。
せっかくの冬休み期間ですし普段お世話になっている恩返しついでにソフトウェアの歴史に名を残す作業をしてみてはどうでしょうか?

おしまい。

余談

VSCode で Go の最新版を開発する (Go1.18 の場合)

Go で開発する時に editor 側で使用する Go のバージョンを指定したり、自動的に指定されたりすると思いますが、ソフトウェア本体の開発をする、という場合にはまだリリースされていないバージョンを使用するのが当たり前になります。
Go は比較的簡単に開発環境をセットアップできる言語だと思っていますが、今回 Go 本体を開発する際にこの 開発されている最新版 の Go を VSCode に設定することが必要で、これで少しハマったので備忘録として残しておきます。

VSCode のセットアップ方法

gotip を使う方法も考えたのですが、うまくいかなったので現状以下のように Go の開発最新版(master ブランチ)を取得してビルド => VSCode で使用するワークスペースを設定後、ワークスペース設定で GOPATH を取得してきた本体に合わせる、という手法をとっています。

# Go 本体の時
{
    "go.goroot": "PATHTO/go.googlesource.com/go",
    "gopls": {
        "build.experimentalWorkspaceModule": true
    }
}

# Tools のとき
{
    "go.goroot": "~/src/go.googlesource.com/go",
    "gopls": {
        "build.experimentalWorkspaceModule": false
    }
}

ビルドの仕方は以下の Intall Go に記載されています。

go.dev

※ The Gopher image in this entry is created by emahiro via https://gopherize.me/. The Gopher character is based on the Go mascot designed by Renée French.