AppVeyor
Babel Obfuscator の NuGet パッケージを AppVeyor のアカウントフィードに置き、ライセンスをセキュア変数で渡して、AppVeyor で難読化します。
AppVeyor は .NET SDK でソリューションをビルドし、Babel.Obfuscator パッケージがそのビルドに Babel タスクを追加します。ほかのビルドサーバーと同じく、必要な作業は 2 つだけです。パッケージを置いたプライベートフィードにビルドエージェントがアクセスできるようにすることと、リポジトリに書き込まずに Babel へライセンスを渡すことです。
このページで使用するサンプルは、小さなコンソールアプリケーションです。
git clone https://github.com/babelfornet/appveyor-integration.gitパッケージを AppVeyor フィードにアップロードする
AppVeyor のアカウントには、それぞれ専用の NuGet フィードがあります。「Account Settings > NuGet」でフィードの URL と API キーをコピーし、パッケージをプッシュします。
dotnet nuget push Babel.Obfuscator.12.0.0.nupkg \
--api-key APPVEYOR_API_KEY \
--source https://ci.appveyor.com/nuget/ACCOUNT/api/v2/packageアカウントフィードはプライベートですが、パッケージとインターネットを隔てているのはこのフィードだけです。Babel.Obfuscator を nuget.org や組織外のフィードには決してプッシュしないでください。
同じフィードをパッケージソースとして登録し、開発者のコンピューターでもビルドエージェントでも同じようにソリューションを復元できるようにします。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="appveyor" value="https://ci.appveyor.com/nuget/ACCOUNT/api/v2" />
</packageSources>
</configuration>フィードの資格情報をこのファイルに書かないでください。また、appveyor.yml 内の nuget sources add コマンドラインで渡すこともしないでください。どちらもコミットされることになり、パブリックリポジトリにあるパスワードは、すでに読まれたパスワードです。次に示すように、AppVeyor の暗号化された変数を使用してください。
「Account Settings > Encrypt YAML」でフィードのパスワードを暗号化し、暗号化された値をビルドの構成から参照します。AppVeyor がこの値を復号するのは自分のリポジトリのビルドに対してだけで、フォークからのプルリクエストに対しては復号しません。
パッケージを参照する
<ItemGroup>
<PackageReference Include="Babel.Obfuscator" Version="12.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>必要なのはパッケージを参照することだけです。Babel タスクがビルドに組み込まれ、プロジェクトの出力アセンブリを難読化します。ローカルでビルドした時点で出力は難読化され、Babel のログがビルド出力に表示されます。ビルドサーバーを使う前に、この段階で構成を確認しておくのが適切です。
ライセンスを渡す
「Settings > Environment」で、ライセンスキーを BABEL_LICENSE という名前のセキュア変数として追加し、プロジェクトファイルから読み取ります。
<PropertyGroup Condition="'$(BABEL_LICENSE)' != ''">
<BabelLicense>$(BABEL_LICENSE)</BabelLicense>
</PropertyGroup>この条件により、開発者のコンピューターはこれまでどおり動作します。変数が設定されていない場合、Babel はプロジェクトフォルダーまたは親フォルダーにある babel.licenses ファイルを使用します。BabelLicense には、floating:<user key> の形式で書いたフローティングライセンスのユーザーキーも指定できます。複数のビルドエージェントで 1 つのライセンスを共有する場合は、こちらのほうが適しています。パッケージのセットアップを参照してください。
以前のガイドが勧めていたように babel.licenses をリポジトリに追加すると、リポジトリを読み取れる人やフォークできる人すべてにライセンスが漏れてしまいます。後からファイルを削除しても、漏えいは取り消せません。その blob は、すべてのフォークとリポジトリ自体の履歴の中で引き続き参照できるからです。
ビルドの構成
リポジトリのルートにある appveyor.yml は、AppVeyor の UI で設定した内容をすべて置き換えます。
version: '1.0.{build}'
image: Visual Studio 2022
branches:
only:
- main
configuration: Release
environment:
feed_user: ACCOUNT
feed_password:
secure: <paste the value produced by Encrypt YAML>
install:
- ps: dotnet nuget update source appveyor --username $env:feed_user --password $env:feed_password --store-password-in-clear-text
before_build:
- ps: dotnet restore AppVeyorIntegration.sln
build_script:
- ps: dotnet build AppVeyorIntegration.sln --configuration $env:CONFIGURATION --no-restore
artifacts:
- path: AppVeyorIntegration\bin\$(configuration)\net10.0
name: Build_$(configuration)_$(appveyor_build_version)
type: zipVisual Studio 2022 イメージには現行の .NET SDK が含まれています。イメージに含まれていない SDK が必要な場合にだけ、dotnet-install のステップを追加してください。難読化は dotnet build の中で実行されるため、Babel 用のステップを追加する必要はなく、ライセンスに問題があればビルドは失敗します。
artifacts ブロックはビルド出力を zip にまとめ、「Artifacts」タブに公開します。そのため、難読化されたアセンブリをダウンロードして確認できます。
--store-password-in-clear-text は、フィードのパスワードをビルドエージェントの NuGet.config に書き込みます。ビルドの終了時に破棄される使い捨てのビルド VM であれば許容できますが、このコマンドを開発者のコンピューターで決して実行してはならない理由もここにあります。
難読化を設定する
Babel の設定は MSBuild プロパティであり、デバッグに影響しないように構成ごとに適用します。
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<BabelEnabled>false</BabelEnabled>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<StringEncryption>stream</StringEncryption>
<ControlFlowObfuscation>if=on;goto=on;switch=on;case=on;call=on</ControlFlowObfuscation>
<ControlFlowIterations>3</ControlFlowIterations>
</PropertyGroup>すべてのプロパティはパッケージリファレンスに一覧があり、それぞれの働きは難読化の設定で説明しています。アセンブリ全体に対する設定では粗すぎる場合は、難読化ルールのファイルを使って、対象を必要な型とメンバーに絞り込めます。
結果の確認
成果物をダウンロードし、アセンブリが難読化されているものと思い込まずに、実際に確認してください。Babel による難読化の検出のサンプルはこの確認を自動化します。これをビルドの中で実行すれば、難読化されないまま気付かれずに出てしまうリリースは、失敗するビルドに変わります。