✍️

V8に初めてパッチを出すための手引き

に公開
2

はじめに

初めてV8にパッチを送ったのですが、公式ドキュメントだけでやるにはかなり難易度が高かったので、備忘録的に残しておきます。

これらの公式ドキュメントを元に手順をまとめました。

https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/contributing.md
https://chromium.googlesource.com/chromium/src/+/main/docs/gerrit_reauth.md
https://v8.dev/docs/source-code

V8開発の前提知識

V8はGitHubではない

GitHubにあるのはミラーであり、Pull Requestは送れません。
Gerritというシステムで構築されたChromiumリポジトリにパッチを提出します
Gerritのアカウントも作成する必要があります。

Googleアカウントが必須

commit に使用するメールアドレスと一致するメールアドレスのGoogleアカウントが必須です

その他関連サイトなど

V8/Chromium開発で使われる関連サイト(Code Search, Gitiles, crbugなど)の詳しい使い分けについては、jxckさんのこちらの記事が非常に参考になります。
Chromium にコントリビュートするための周辺知識

Step 1: 準備 - コードを手元に持ってくるまで

1. Gitの環境設定

# 改行コードの自動変換を無効化
git config --global core.autocrlf false
# ファイル権限の変更を無視
git config --global core.filemode false

2. depot_toolsのインストール

Chromium/V8の開発には depot_tools というツール群が必須です。まずこれを git clone し、パスを通します。

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$(pwd)/depot_tools:$PATH" # これは環境に合わせて設定してください

公式のドキュメントはこちら

https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up

3. ソースコードの取得

fetch コマンドでV8のソースコード一式を取得します。巨大なリポジトリなので、かなりの時間がかかります。

fetch v8

実行したディレクトリ直下に v8 ディレクトリが作成されるので、移動します。

cd v8

depot_toolsがGerritと連携するために必要な設定を追加します。

git config --local gerrit.host true

ソースコード取得後は、意図的にdetached head stateになります。

Step 2: 開発と最初のコミット

1. 依存関係の更新とブランチ作成

開発を始める前に、まずローカルのソースコードと依存関係を最新化しておきましょう。

git pull origin main
gclient sync

完了したら、作業用のブランチを切ります。
git checkout -b でも問題ありませんが、公式では git new-branch が推奨されています。

git new-branch fix/my-cool-fix

2. コード修正とAUTHORSファイルへの追記

ブランチを切ったら、コードを修正します。
同時に、初めての貢献の場合はルートディレクトリにある AUTHORS ファイルに自分の名前とメールアドレスを追記する必要があります。
これは presubmit チェックで要求されるため、最初のコミットに含める必要があります。
辞書順での記述が求められるので、自身の名前とメールアドレスを適切な箇所に追記します。

First-time contributors
Add your (or your organization's) name and contact info to the AUTHORS file for Chromium or Chromium OS. Please include this as part of your first patch and not as a separate standalone patch.

3. コミット

コミットの前に、git cl format を実行してChromiumのコーディングスタイルに整形します。

git cl format

コードの変更と AUTHORS ファイルの変更をまとめてコミットします。

git add .
git commit

コミットメッセージはV8の規約に沿って記述する必要があります。基本的には [component]: Short description という形式で、関連するIssueがあれば Bug: フッターを、手動でのテストが必要な場合は Test: フッターを追記します。

[component] Fix various typos in comments

This patch fixes several spelling mistakes in comments across the codebase.

Bug: v8:12345 # (v8: の部分はchromium:など他のプロジェクトIDになることも)
Fixed: v8:12346 # Fixed: を使うとマージ時に自動でIssueをCloseしてくれる

Step 3: 認証とPresubmit (ここからが難関)

1. Gerritアカウント作成

ここからが難関です。まずGerritにアクセスし、コミットに使うGoogleアカウントでログインしてアカウントを作成します。
(僕はこれを見落としててずっと認証できずに苦戦してました😅)

https://chromium-review.googlesource.com/

この手順を見落とすと、後々の認証プロセスで必ずつまずくため、非常に重要です。

2. CLA署名

初めてGoogleのOSSに貢献する場合、CLA (Contributor License Agreement) 署名ページで署名が必要です。

https://cla.developers.google.com/

3. 認証プロセス

次に認証を通します。

# 0. (初回のみ) Gitのグローバル設定がGerrit用に正しく設定されているか確認・設定する
git cl creds-check --global

# 1. まずはブラウザでGoogleアカウントにログインし、認証情報を作る
#    (ここでGoogleアカウントの2段階認証が求められ、物理キーの出番となる)
git credential-luci login

# 2. 認証が成功したか、Gitの設定が正しいかを確認する
git cl creds-check

4. Presubmit実行

全ての準備が整ったら、presubmit チェックを実行します。これが通れば、アップロードの準備は完了です。

git cl presubmit

Step 4: アップロード

1. レビュー担当者を探す

変更内容に関係するディレクトリにある OWNERS ファイルを確認し、適切なレビュー担当者を探します。

2. アップロード

担当者が見つかったら、-r オプションでその担当者のメールアドレスを指定してアップロードします。

git cl upload -r [コードオーナーのメールアドレスを指定]

-r オプションなしで git cl upload を実行し、後からGerritのWeb UI上でレビュー担当者を追加可能です。
また、いきなりレビューを依頼するのが不安な場合は、git cl upload -d (--draft) を使うと、自分だけが見える下書きとしてアップロードできます。

upload を実行するとVimが起動し、コミットメッセージの編集画面になります。内容を確認し、問題なければ :wq で保存して終了します。

URLが発行されれば、アップロードは完了です。

実際のパッチはこちら
https://chromium-review.googlesource.com/c/v8/v8/+/6998776

Step 5: アップロード後の流れと便利なコマンド

1. レビューの対応とCommit Queue (CQ)

アップロードが完了すると、Gerrit上でレビュー担当者からコメントが付きます。レビューでの指摘を修正し、再度 git cl upload で新しいパッチセットをアップロードする、というサイクルを繰り返します。

この繰り返しでパッチを完成させていきます。より詳しいレビューのやり取りについては、前述のjxckさんの記事が非常に参考になります。

2. 便利なコマンド

開発・レビューサイクルで役立つコマンドです。

  • git cl format: Chromiumのコーディングスタイルに合わせて自動でソースコードを整形
  • git cl owners: 変更内容に基づいて OWNERS ファイルからレビュー担当者を提案
  • git cl issue: upload した後に、現在のブランチに紐付いているレビューページのURLをターミナルで再確認可能

おわりに

以上がV8に初めてパッチを送るための手順です。
より詳しい情報は公式ドキュメントを参照してください。

https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/contributing.md
https://chromium.googlesource.com/chromium/src/+/main/docs/gerrit_reauth.md
https://v8.dev/docs/source-code

日本語での情報が少なかったので、自分なりにまとめました。
お役に立てれば幸いです。

GitHubで編集を提案

Discussion

petamorikenpetamoriken

Googleアカウントと物理キーが必須

commit に使用するメールアドレスと一致するメールアドレスのGoogleアカウント、そしてそのアカウントに紐付けられた物理的なFIDO2セキュリティキーの所持が必須です

こちらパッチを出すだけでしたらパスキー認証でも大丈夫でした。git credential-luci reauth に失敗しますがそれはレビュワーにのみ必須のようで、git cl upload は成功しました。

Specifically, actions requiring committer powers, such as reviewing Change Lists (CLs) for submission and uploading CLs (which counts as the uploader self-reviewing the CL), will necessitate ReAuth.

https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/gerrit_reauth.md#background

Riya AmemiyaRiya Amemiya

コメントありがとうございます!
そうなんですね!ありがとうございます
reauthに失敗してたのと、uploading CLs (which counts as the uploader self-reviewing the CL)の部分でてっきり必須かと思ってました。
記事修正します🙏