Skip to Content
Nueva versión 12 disponible 🎉

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.git

Subir 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/package

La 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:

NuGet.config
<?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

AppVeyorIntegration.csproj
<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:

AppVeyorIntegration.csproj
<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:

appveyor.yml
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: zip

La 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:

AppVeyorIntegration.csproj
<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.

Last updated on