Skip to content

⚠️for personal use. User Secrets を CI で利用してみる

License

Notifications You must be signed in to change notification settings

MareMare/UsingSecretsSandbox

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

66 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Secrets をローカルとGitHubで使用する方法

⚠️ This repository is intended for me.

ローカルと GitHub 上の CI の両方でシークレットを扱う方法を考えてみます。

ソリューションの準備

dotnet new sln

アプリでのシークレット

アプリでシークレットを利用してみます。

1. プロジェクトの準備

dotnet new console -o ConsoleApp
dotnet sln add ConsoleApp

2. NuGet パッケージの参照追加

dotnet add ConsoleApp package Microsoft.Extensions.Configuration.Binder
dotnet add ConsoleApp package Microsoft.Extensions.Configuration.UserSecrets

3. シークレットの準備

dotnet user-secrets -p ConsoleApp init

4. シークレットの設定と確認

dotnet user-secrets -p ConsoleApp set "AppSettings:User" "ゆーざ"
dotnet user-secrets -p ConsoleApp set "AppSettings:ApiKey" "きー"

dotnet user-secrets -p ConsoleApp list

5. コードからシークレット取得

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 でのシークレット(環境変数版)

Unit Test でシークレットを利用してみます。 GitHub Actions からも利用したいので環境変数へアクセスできるようにします。

1. プロジェクトの準備

dotnet new xunit -o ConsoleApp.Test
dotnet sln add ConsoleApp.Test

2. NuGet パッケージの参照追加

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

3. シークレットの準備

dotnet user-secrets -p ConsoleApp.Test init

4. シークレットの設定と確認

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

5. コードからシークレット取得

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);
    }
}

GitHub Actions

1. GitHub Actions secrets の準備

2. Workflow の設定

# ...
      - 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 secrets

Dependabot には GitHub Secrets にアクセスする権限がないので前述の Workflow に ${{ secrets.SAMPLEAPIKEY }} で指定したシークレットが取得できずに dotnet test が失敗します。

1. Dependabot secrets の準備

Dependabot からシークレットへアクセスするには Dependabot secrets ストアに格納することで ${{secrets.NAME}} のようにアクセスできるようになります。

シークレット

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")

参考

参考(その2)

参考(その3)

About

⚠️for personal use. User Secrets を CI で利用してみる

Topics

Resources

License

Stars

Watchers

Forks

Languages