El error de secretos de usuario se genera en una canalización de CI/CD, cuando no se debe esperar el archivo secrets.json.
Pasos:
El código se ejecuta localmente, pero falla en las canalizaciones de CI/CD, con el siguiente error:
"No se encontró el archivo de configuración 'secrets.json' y no es opcional".
Previsto:
El código se ejecuta sin que esté presente el archivo secrets.json Configuración .NET 6, Microsoft.Extensions.Configuration.UserSecrets: 6.0.0-preview.1.21102.12
¿Regresión? Esto funciona en .NET 5, Microsoft.Extensions.Configuration.UserSecrets: 5.0.0.*
System.IO.FileNotFoundException: The configuration file 'secrets.json' was not found and is not optional. The physical path is '/home/runner/work/UserSecretsRegression/UserSecretsRegression/UserSecrets/UserSecrets.Tests/bin/Release/net6.0/secrets.json'. Stack Trace: at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at UserSecrets.Tests.UnitTest1.TestMethod1() in /home/runner/work/UserSecretsRegression/UserSecretsRegression/UserSecrets/UserSecrets.Tests/UnitTest1.cs:line 13
https://github.com/dotnet/runtime/issues/48485
Básicamente, es una característica nueva en .NET6 que 'secrets.json' no es opcional de forma predeterminada.
AddUserSecrets(this IConfigurationBuilder configuration, Assembly assembly, bool optional);
Ese parámetro 'opcional' debe establecerse en 'verdadero' en su código.
var configuration = new ConfigurationBuilder() .AddEnvironmentVariables() .AddCommandLine(args) .AddJsonFile("appsettings.json") .AddUserSecrets<Program>(true) .Build();
A diferencia de las variables de entorno, los secretos de usuario se colocan en un archivo de configuración similar a appsettings.json
. Tener configuraciones fuera del proyecto estructuradas similares es excelente cuando necesita copiar claves y valores entre archivos y hay soporte para agregar, eliminar y enumerar valores, como le mostraré más adelante en esta publicación.
Para comprender los secretos de los usuarios, retomemos el ejemplo de la publicación anterior. Allí tenía un archivo appsettings.json
con este aspecto:
{ "AppSettings": { "ConnectionString": "http://localhost:9000" }, ... }
Para anular la AppSettings:ConnectionString
en máquinas individuales, cada usuario debe agregar un secreto de usuario con el mismo nombre. El enfoque más sencillo es hacer clic con el botón derecho en el proyecto y seleccionar Administrar secretos de usuario :
Esto crea y abre un nuevo archivo JSON vacío llamado secrets.json
. El archivo se coloca debajo de C:\Users\<username>\AppData\Roaming\Microsoft\UserSecrets\<id>
donde <username>
coincide con su usuario de Windows y es un GUID generado aleatoriamente. Lo importante a tener en cuenta aquí es que el archivo se encuentra fuera del directorio de su proyecto. Para "vincular" la ubicación del archivo secrets.json
a su proyecto, Visual Studio agregó un poco de marcado al archivo csproj
:
<PropertyGroup> <UserSecretsId>dda25df4-9a88-4a7e-8502-2134b74e4729</UserSecretsId> </PropertyGroup>
En caso de que no esté usando Visual Studio, puede generar un GUID aleatorio y agregar el <UserSecretsId>
manualmente.
En caso de que desee anular la AppSettings:ConnectionString
, agregue una estructura similar al archivo secrets.json
:
{ "AppSettings": { "ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234" } }
También puede colapsar configuraciones como esta:
{ "AppSettings:ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234" }
Finalmente, agregue secrets.json
creado en la raíz de su proyecto.
En .net 6.0, la aplicación necesita secret.json para ejecutarse. en cualquier caso, si estás migrando desde .net core 3.1 o .net 5.0 para ejecutar tu aplicación en .net 6.0:
dotnet user-secrets init
en la carpeta de su proyecto usando herramientas de línea de comandos.secret.json
en el dominio de su aplicación ...\bin\Debug\net6.0
. No importa si su archivo secret.json
está vacío por ahora.¡Presiona F5 y ejecuta tu aplicación!