Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Roslyn 4.8.0 (?) から *.pdb ファイルの SourceLink にローカルのファイルパスと GitHub の URL が埋め込まれるようになり、ビルドの再現性が失われる問題が起きていた。
問題のある PDB に含まれていた情報
https://github.com/opentween/OpenTween/actions/runs/6983842016 でビルドされた OpenTween.pdb から抜粋。
PDF ファイル内にローカルのファイルパスの
"D:\\a\\OpenTween\\OpenTween\\*"
という文字列が埋め込まれている。これによってビルド結果がローカルのソースコードのパスに依存して変化してしまい、Reproducible build の妨げとなっている。このビルドに使用した csc.exe のバージョンは
4.8.0-7.23558.1+e091728607ca0fc9efca55ccfb3e59259c6b5a0a
となっている。問題が起こる前の PDB
この問題が起きていない最後に確認できたビルドは https://github.com/opentween/OpenTween/actions/runs/6314744567 であり、この時の OpenTween.pdb には前述のような JSON は埋め込まれていなかった。
このビルドで使用した csc.exe のバージョンは
4.7.0-3.23416.8+43b0b05cc4f492fd5de00f6f6717409091df8daa
となっている。PDB に埋め込まれた JSON について
Portable PDB の仕様より、埋め込まれている JSON は SourceLink と呼ばれる情報らしい。
https://github.com/dotnet/runtime/blob/v8.0.0/docs/design/specs/PortablePdb-Metadata.md#source-link-c-and-vb-compilers
SourceLink については以下のドキュメントがあり、Deterministic build についても言及されている。
https://github.com/dotnet/sourcelink/blob/8.0.0/docs/README.md
最終的に、ドキュメントに記載されている DeterministicSourcePaths を有効化することでローカルのファイルパスに依存しない再現性のあるビルド結果を得ることができた。
修正後の PDB ファイル
修正前は
"D:\\a\\OpenTween\\OpenTween\\*"
となっていた箇所が、修正後には"/_/*"
に置き換わっていることが確認できる。