ローカルと GitHub 上の CI の両方でシークレットを扱う方法を考えてみます。
dotnet new sln
アプリでシークレットを利用してみます。
dotnet new console -o ConsoleApp
dotnet sln add ConsoleApp
dotnet add ConsoleApp package Microsoft.Extensions.Configuration.Binder
dotnet add ConsoleApp package Microsoft.Extensions.Configuration.UserSecrets
dotnet user-secrets -p ConsoleApp init
dotnet user-secrets -p ConsoleApp set "AppSettings:User" "ゆーざ"
dotnet user-secrets -p ConsoleApp set "AppSettings:ApiKey" "きー"
dotnet user-secrets -p ConsoleApp list
using System.Reflection;
using Microsoft.Extensions.Configuration;
var config = new ConfigurationBuilder()
.AddUserSecrets(Assembly.GetExecutingAssembly())
.Build();
// インデクサによる取得
Console.WriteLine($"indexer: {config["AppSettings:User"]} {config["AppSettings:ApiKey"]}");
// POCO へのマッピングによる取得
var appSetting = config
.GetSection(nameof(AppSettings))
.Get<AppSettings>();
Console.WriteLine($"POCO: {appSetting.User} {appSetting.ApiKey}");
public class AppSettings
{
public string User { get; set; }
public string ApiKey { get; set; }
}
Unit Test でシークレットを利用してみます。 GitHub Actions からも利用したいので環境変数へアクセスできるようにします。
dotnet new xunit -o ConsoleApp.Test
dotnet sln add ConsoleApp.Test
dotnet add ConsoleApp.Test package Microsoft.Extensions.Configuration.Binder
dotnet add ConsoleApp.Test package Microsoft.Extensions.Configuration.EnvironmentVariables
dotnet add ConsoleApp.Test package Microsoft.Extensions.Configuration.UserSecrets
dotnet user-secrets -p ConsoleApp.Test init
dotnet user-secrets -p ConsoleApp.Test set "User" "Testゆーざ"
dotnet user-secrets -p ConsoleApp.Test set "ApiKey" "Testきー"
dotnet user-secrets -p ConsoleApp.Test list
using Microsoft.Extensions.Configuration;
namespace ConsoleApp.Test;
public class UnitTest1
{
private readonly IConfiguration _config;
public UnitTest1()
{
_config = new ConfigurationBuilder()
.AddUserSecrets<UnitTest1>() // (A) for local
.AddEnvironmentVariables() // (B) for dotnet test env in github actions
.Build();
}
[Fact]
public void Test_User()
{
var actual = _config["user"];
Assert.Equal("Testゆーざ", actual);
}
[Fact]
public void Test_ApiKey()
{
var actual = _config["apikey"];
Assert.Equal("Testきー", actual);
}
}
# ...
- name: 🧪 Test
working-directory: src
run: dotnet test --configuration $env:Configuration --no-build --verbosity normal
env:
user: ゆーざTest
apikey: ${{ secrets.SAMPLEAPIKEY }}
Configuration: ${{ matrix.configuration }}
# ...
Dependabot には GitHub Secrets にアクセスする権限がないので前述の Workflow に ${{ secrets.SAMPLEAPIKEY }}
で指定したシークレットが取得できずに dotnet test
が失敗します。
- GitHub Actions: Workflows triggered by Dependabot PRs will run with read-only permissions | GitHub Changelog
- Accessing secrets - GitHub Docs
Dependabot からシークレットへアクセスするには Dependabot secrets ストアに格納することで ${{secrets.NAME}}
のようにアクセスできるようになります。
- Configuring access to private registries for Dependabot - GitHub Docs
- About encrypted secrets for Dependabot - GitHub Docs
User Secrets を格納した secrets.json
は、あくまでも開発環境に限り構成プロバイダが有効になります。
実稼働では運用環境となるので環境変数にてシークレットを提供するほうが良いみたいです。
階層キー(:
区切り記号)は環境変数では対応していないので __
(ダブルアンダースコア)を指定する必要があります。
ちなみに __
は自動で :
に置換されるのでコード上の変更は不要です。
-
json
"Position": { "Title": "Editor", "Name": "Joe Smith" }
-
C#
var title = Configuration["Position:Title"]; var name = Configuration["Position:Name"];
-
.NET CLI
dotnet user-secrets set "Position:Title" "Editor" dotnet user-secrets set "Position:Name" "Joe Smith"
-
cmd.exe
setx ASPNETCORE_ENVIRONMENT Staging /M setx Position__Title Environment_Editor /M setx Position__Name Environment_Rick /M
-
pwsh
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine") [Environment]::SetEnvironmentVariable("Position__Title", "Environment_Editor", "Machine") [Environment]::SetEnvironmentVariable("Position__Name", "Environment_Rick", "Machine")
- Azure 向けの GitHub Actions の variable substitution を使用する | Microsoft Docs
- Using secrets safely in development with .NET Core – Sam Learns Azure
- Avoid Secrets in DotNet Core Tests.
- Using User Secrets Configuration In .NET - .NET Core Tutorials
- 暗号化されたシークレット - GitHub Docs
- Managing Secrets in .NET Console Apps
- integration testing - How to configure .net core 3.1 appsettings to run tests on Github actions - Stack Overflow
- Microsoft.Extensions.Configuration.UserSecrets 6.0.0-preview.1.21102.12 throwing secrets.json error in CI/CD pipelines · Issue #48485 · dotnet/runtime
- Dotnet6 upgrade with recommended solution by samsmithnz · Pull Request #3 · samsmithnz/UserSecretsRegression
- How to manage secrets in .NET locally and on GitHub? - Maytham Fahmi
- GitHub Actions: Workflows triggered by Dependabot PRs will run with read-only permissions | GitHub Changelog
- Accessing secrets - GitHub Docs
- Configuring access to private registries for Dependabot - GitHub Docs
- About encrypted secrets for Dependabot - GitHub Docs