銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

GitHub Actionsで作成したNuGetパッケージをGitHub Packagesに公開する

久しぶりにNuGetパッケージを公開したくなったのですが、最近だとGitHubで公開しているのならGitHub Actionsでビルドするのが簡単なようです。

tech.guitarrapc.com

最終的には作成したパッケージは nuget.org に公開するのですが、いったんprivateなNuGetリポジトリに配置して自分でテストしてから公開しようと考えました。となるとGitHub Packagesを使うのが便利そうな気がします。

help.github.com

ただ、気になったのがGitHub PackagesでのNuGetの認証方法で、ユーザーと平文パスワードによる認証しかサポートしていないようです。いくつか記事を確認しましたが、ユーザーと平文パスワードの組み合わせを.NET CLIで使う場合、nuget.configファイルを配置して対応するしかなさそうです。

timheuer.com

blog.mjjames.co.uk

GitHub Actionsの中でこのようなXMLファイルを生成するのめんどくさいな*1と思っていたら、↑の記事でWindows環境ならnuget.exenuget sources addコマンドで対応できることがわかりました*2

そこで、Windows環境で.NET Core CLIとnuget.exeをセットアップしてパッケージングとGitHub Packageに公開するjob定義はこのようになります。ビルドのパスや、GitHub Packagesのユーザー名は適当に置き換えてください。

jobs:
  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup NuGet
      uses: NuGet/setup-nuget@v1.0.2
      with:
        nuget-api-key: ${{ secrets.NUGET_API_KEY }}
        nuget-version: latest 
    - name: Setup .NET Core SDK
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.101
    - name: Build
      run: dotnet build .\Serilog.Sinks.NewRelicLab.Logs\Serilog.Sinks.NewRelicLab.Logs.csproj --configuration Release
    - name: Pack
      run: dotnet pack .\Serilog.Sinks.NewRelicLab.Logs\Serilog.Sinks.NewRelicLab.Logs.csproj  --output .\artifacts --configuration Release
    - name: Add GPR Source
      run: nuget sources Add -Name "GPR" -Source  https://nuget.pkg.github.com/tanaka-takayoshi/index.json -UserName tanaka-takayoshi -Password ${{ secrets.GITHUB_TOKEN }}
    - name: Publish
      run: nuget push ".\artifacts\" -Source "GPR" -SkipDuplicate 

Serilog.Sinks.NewRelicLab.Logs/dotnetcore.yml at master · tanaka-takayoshi/Serilog.Sinks.NewRelicLab.Logs · GitHub

これでGitHub Packageに公開できるようになりました。

github.com

*1:パスワードの部分をシークレットを使って置換などしないといけないので

*2:この筆者はパッケージへの署名がしたくて、署名はWindowsでのみ実行できるのでWindows環境を使っているらしい

AZ-301に合格して、Azure Solutions Architect Expertを取得しました

先日、AZ-300に合格しました。

tech.tanaka733.net

かなりぎりぎりで合格したので、もっと準備してからAZ-301を受けるつもりだったのですが、AZ-300と301がAZ-303と304に更新されるニュースがありその時点ではAZ-300とAZ-304の組み合わせでOKか不明だったので早めにAZ-301を受験することにしました。結果は今回もかなりぎりぎりですが合格し、無事にAzure Solutions Architect Expertを取得しました。

なお、AZ-303と304の変更については、そのあと更新があり、AZ-300と304のような組み合わせでもAzure Solutions Architect Expertを取得できるとのことです。こちらのブログの最後にある「Updates to Azure certification exams announced in January 2020」のリンクからみられるPDFの「7. Do exams AZ-300 and AZ-301 and new exams AZ-303 and AZ-304 need to be a matched set in order to achieve the Azure Solutions Architect Expert certification?」をご確認ください。

www.microsoft.com

AZ-301のために行った勉強ですが、基本的にAZ-300のときと同じです。資格試験のページに対応するMicrosoft Learnのラーニングパスが載っていますが、AZ-300と同じです。

docs.microsoft.com

AZ-300のときに一通りやっていたので、今回はもう一度おさらいしました。ハンズオン部分は、時間がなかったこともあり実際にはやらず手順を読んで確認するにとどめました。

AADやExpress Route、Azure Site Recoveryなどは仕事でそういう要件を求められないとなかなか使わない*1ので、念入りに勉強しました。

最上位資格を取れたので、いったんAzure系の資格はこれで止める予定です。

*1:実際AADは基本機能だけ、それ以外はまったく使ったことがない

ASP.NET Core 3 Web APIで例外をスローして、指定したステータスのレスポンスを返す

ASP.NET Core Web APIでアプリケーションロジック内では例外を投げておいて、共通処理として例外をキャッチして例外に応じたステータスコードとメッセージのレスポンスを返したい場合があるかと思います。ASP.NET Framework やCore 2.2まであったHttpResponseExceptionを使うようなユースケースです。

docs.microsoft.com

ASP.NET Core 3ではなくなっていますが、自前で作ることでより自分のユースケースにあった処理が作れることが次のドキュメントに記載されています。

docs.microsoft.com

今回これをすこしアレンジした使い方をしたので紹介してみます。

続きを読む