AppVeyor
Ofusque en AppVeyor alojando el paquete NuGet de Babel Obfuscator en la fuente de su cuenta de AppVeyor y pasando la licencia mediante una variable segura.
AppVeyor compila la solución con el SDK de .NET, y el paquete Babel.Obfuscator añade la tarea Babel a esa compilación. Como en cualquier otro servidor de compilación, el trabajo se reduce a dos cosas: permitir que el agente acceda a la fuente privada que contiene el paquete y dar a Babel una licencia sin escribirla en el repositorio.
El ejemplo que se usa en esta página es una pequeña aplicación de consola:
git clone https://github.com/babelfornet/appveyor-integration.gitSubir el paquete a la fuente de AppVeyor
Cada cuenta de AppVeyor tiene su propia fuente de NuGet. En Account Settings → NuGet (configuración de la cuenta), copie la URL de la fuente y la clave API y, a continuación, suba el paquete:
dotnet nuget push Babel.Obfuscator.12.0.0.nupkg \
--api-key APPVEYOR_API_KEY \
--source https://ci.appveyor.com/nuget/ACCOUNT/api/v2/packageLa fuente de la cuenta es privada, pero es lo único que separa el paquete de Internet. No suba nunca Babel.Obfuscator a nuget.org ni a ninguna fuente ajena a su organización.
Registre la misma fuente como origen de paquetes para que la solución se restaure de la misma manera en el equipo de un desarrollador y en el agente de compilación:
<?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>No escriba las credenciales de la fuente en este archivo ni las pase en una línea de comandos nuget sources add dentro de appveyor.yml. En ambos casos acaban en el repositorio, y una contraseña en un repositorio público es una contraseña que ya se ha leído. Use las variables cifradas de AppVeyor, como se indica más abajo.
Cifre la contraseña de la fuente con Account Settings → Encrypt YAML (cifrar YAML) y, a continuación, haga referencia al valor cifrado desde la configuración de compilación. AppVeyor lo descifra solo en las compilaciones de su propio repositorio, y nunca en las solicitudes de incorporación de cambios procedentes de bifurcaciones.
Hacer referencia al paquete
<ItemGroup>
<PackageReference Include="Babel.Obfuscator" Version="12.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>Basta con hacer referencia al paquete: la tarea Babel se inserta en la compilación y ofusca el ensamblado de salida del proyecto. Una compilación local ya produce una salida ofuscada, y el registro de Babel aparece en la salida de la compilación. Ese es el momento adecuado para comprobar la configuración, antes de recurrir al servidor de compilación.
Proporcionar la licencia
Añada la clave de licencia como variable segura en Settings → Environment (configuración, entorno), con el nombre BABEL_LICENSE, y léala después desde el archivo de proyecto:
<PropertyGroup Condition="'$(BABEL_LICENSE)' != ''">
<BabelLicense>$(BABEL_LICENSE)</BabelLicense>
</PropertyGroup>La condición permite que los equipos de los desarrolladores sigan funcionando sin cambios: si la variable no está definida, Babel recurre al archivo babel.licenses que encuentre en la carpeta del proyecto o en una carpeta superior. BabelLicense también acepta una clave de usuario de licencia flotante escrita como floating:<user key>, que es la mejor opción cuando varios agentes de compilación comparten una licencia. Consulte Configuración del paquete.
Añadir babel.licenses al repositorio, como sugerían las guías antiguas, expone la licencia a cualquiera que pueda leerlo o bifurcarlo. Eliminar el archivo más tarde no deshace la exposición: el blob sigue siendo accesible en todas las bifurcaciones y en el historial del propio repositorio.
La configuración de compilación
El archivo appveyor.yml de la raíz del repositorio sustituye todo lo que esté configurado en la interfaz de AppVeyor:
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: zipLa imagen Visual Studio 2022 incluye los SDK de .NET actuales; añada un paso dotnet-install solo si necesita un SDK que la imagen no tenga. La ofuscación se realiza dentro de dotnet build, de modo que no hay que añadir ningún paso de Babel y un fallo de licencia hace fallar la compilación.
El bloque artifacts reúne la salida de la compilación en un zip que se publica en la pestaña Artifacts (artefactos), de modo que puede descargar el ensamblado ofuscado e inspeccionarlo.
--store-password-in-clear-text escribe la contraseña de la fuente en el NuGet.config del agente. Es aceptable en una máquina virtual de compilación desechable, que se destruye cuando termina la compilación, pero por eso mismo este comando no debe ejecutarse nunca en el equipo de un desarrollador.
Configurar la ofuscación
Los ajustes de Babel son propiedades de MSBuild, que se aplican por configuración para que la depuración no se vea afectada:
<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>La lista completa está en Referencia del paquete; Configuración de la ofuscación explica qué hace cada una. Cuando un ajuste que afecta a todo el ensamblado resulta demasiado general, un archivo de reglas de ofuscación lo limita a los tipos y miembros que importan.
Verificar el resultado
Descargue el artefacto y confirme que el ensamblado está ofuscado en lugar de darlo por supuesto. El ejemplo Detección de la ofuscación de Babel automatiza esa comprobación, y ejecutarla en la compilación convierte una versión que se habría publicado sin ofuscar y sin aviso en una compilación fallida.