Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8899

Github Actionsで.NET CoreのCI/CDを行う

$
0
0

この記事で作ったサンプルリポジトリは以下になります。
dotnet-ci-example

TL:DR

  • Windows / Linux(ubuntu) / MacOS のそれぞれで単体テストを実行
  • v0.1.0のようなタグがあった場合はGithub Releaseを作成
  • それぞれのOS向けの実行ファイルをビルド・アップロード

するGithubのWorkflowを作ります。

プロジェクトの作成

#ソリューション, コンソールプロジェクト, テストプロジェクトを作成
> dotnet new sln
> dotnet new console -o ./Sample.Core
> dotnet new xunit -o ./Sample.Test
#ソリューションに2つのプロジェクトを紐付け
> dotnet sln add ./Sample.Core/Sample.Core.csproj ./Sample.Test/Sample.Test.csproj
#テストプロジェクトにコンソールプロジェクトを紐付け
>cd ./Sample.Test/
> dotnet add reference ../Sample.Core/Sample.Core.csproj

dotnet-formatのローカルインストール

.NET Core版ESLint。
設定は.editorconfigファイルから読み込むので、別途用意してください。
(自分は別プロジェクトでVisual Studioから作成したものを引っ張ってきました)

#ローカルインストールに必要なマニフェストファイルを作成
#ちなみにリストアはdotnet tool restoreでできます
> dotnet new tool-manifest
#インストール
> dotnet tool install dotnet-format

ロジックとテストの実装

説明は割愛。

ワークフローの作成

Github上で作成します。(vscodeで作ってpushしようとしたらエラーになった)
流用する際は適宜パスやバージョン等変更してください。

YAMLファイル
dotnet.yaml
name:.NET Core CI/CDon:[push,pull_request]jobs:test:name:Debug Build & Testruns-on:${{ matrix.os }}strategy:matrix:os:[ubuntu-latest,windows-latest,macos-latest]dotnet-version:['3.0.100','3.1.100-preview3-014645']env:DOTNET_CLI_TELEMETRY_OPTOUT:1DOTNET_SKIP_FIRST_TIME_EXPERIENCE:1NUGET_XMLDOC_MODE:skipsteps:-uses:actions/checkout@v1-name:Setup .NET Core ${{ matrix.dotnet-version }}uses:actions/setup-dotnet@v1with:dotnet-version:${{ matrix.dotnet-version }}-name:Restore Toolrun:dotnet tool restore-name:Lintrun:dotnet format --check --dry-run-name:Buildrun:dotnet build -c Debug-name:Testrun:dotnet test -c Debug --no-buildrelease:name:Create Github Releaseif:contains(github.ref, 'tags/v')needs:[test]runs-on:ubuntu-lateststeps:-name:Create Releaseid:create_releaseuses:actions/create-release@v1.0.0env:GITHUB_TOKEN:${{ secrets.GITHUB_TOKEN }}with:tag_name:${{ github.ref }}release_name:Release ${{ github.ref }}draft:falseprerelease:false-name:Output Release URL Filerun:echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt-name:Save Release URL File for publishuses:actions/upload-artifact@v1with:name:release_urlpath:release_url.txtpublish:if:contains(github.ref, 'tags/v')needs:[test,release]runs-on:ubuntu-lateststrategy:matrix:rid:[win-x64,linux-x64,osx-x64]env:DOTNET_CLI_TELEMETRY_OPTOUT:1DOTNET_SKIP_FIRST_TIME_EXPERIENCE:1NUGET_XMLDOC_MODE:skipsteps:-uses:actions/checkout@v1-name:Load Release URL File from release jobuses:actions/download-artifact@v1with:name:release_url-name:Setup .NET Core 3.0 (current)uses:actions/setup-dotnet@v1with:dotnet-version:3.0.100-name:Buildrun:|dotnet publish ./Sample.Core/Sample.Core.csproj  -c Release -r ${{ matrix.rid }} /p\:PublishSingleFile=true /p\:PublishTrimmed=true -o ./${{ matrix.rid }}zip -r ${{ matrix.rid }} ./${{ matrix.rid }}-name:Get Release File Name & Upload URLid:get_release_inforun:|echo ::set-output name=file_name::${REPOSITORY_NAME##*/}-${TAG_REF_NAME##*/v}value=`cat release_url/release_url.txt`echo ::set-output name=upload_url::$valueenv:TAG_REF_NAME:${{ github.ref }}REPOSITORY_NAME:${{ github.repository }}-name:Upload Release Assetid:upload-release-assetuses:actions/upload-release-asset@v1.0.1env:GITHUB_TOKEN:${{ secrets.GITHUB_TOKEN }}with:upload_url:${{ steps.get_release_info.outputs.upload_url }}asset_path:./${{ matrix.rid }}.zipasset_name:${{ steps.get_release_info.outputs.file_name }}-${{ matrix.rid }}.zipasset_content_type:application/zip

実録

ちなみにプログラムは1-20までFizzBuzzするだけのものです。

所感

  • 並列テストの実行速度がMacOS > ubuntu >> Windowsといった感じ。
    • Windowsもうちょっとがんばって
  • NuGetのキャッシュをするなどしてもっと速度改善したほうがいいかも

Viewing all articles
Browse latest Browse all 8899

Trending Articles