# .NET 빌드 및 테스트

CI(연속 통합) 워크플로를 만들어 .NET 프로젝트를 빌드하고 테스트하는 방법을 알아보세요.

## 소개

이 가이드에서는 .NET 패키지를 빌드하고 테스트하고 게시하는 방법을 보여 줍니다.

GitHub 호스트 실행기에는 .NET Core SDK를 포함하는 소프트웨어가 사전 설치된 도구 캐시가 있습니다. 최신 소프트웨어 및 사전 설치된 버전의 .NET Core SDK에 대한 전체 목록은 [GitHub 호스트 실행기에 설치된 소프트웨어](/ko/actions/using-github-hosted-runners/about-github-hosted-runners)를 참조하세요.

## 필수 조건

YAML 구문과 이를 GitHub Actions와 함께 사용하는 방법에 대해 잘 알고 있어야 합니다. 자세한 내용은 [GitHub Actions에 대한 워크플로 구문](/ko/actions/using-workflows/workflow-syntax-for-github-actions)을(를) 참조하세요.

.NET Core SDK를 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 [.NET 시작](https://dotnet.microsoft.com/learn)을 참조하세요.

## .NET 워크플로 템플릿 사용

빠르게 시작하려면 워크플로 템플릿을 리포지토리의 `.github/workflows` 디렉터리에 추가합니다.

GitHub은(는) 대부분의 .NET 프로젝트에서 작동하는 .NET 워크플로 템플릿을 제공합니다. 이 가이드의 후속 섹션에서는 이 워크플로 템플릿을 사용자 지정하는 방법에 대한 예시를 제공합니다.

1. GitHub에서 리포지토리의 기본 페이지로 이동합니다.

2. 리포지토리 이름에서 **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> 작업**을 클릭합니다.

   !["github/docs" 리포지토리의 탭 스크린샷. "작업" 탭은 주황색 윤곽선으로 강조 표시됩니다.](/assets/images/help/repository/actions-tab-global-nav-update.png)

3. 리포지토리에 워크플로가 이미 있는 경우 **새 워크플로**를 클릭합니다.

4. "워크플로 선택" 페이지에는 권장되는 워크플로 템플릿의 선택 항목이 표시됩니다. "dotnet"을 검색합니다.

5. ".NET" 워크플로에서 **구성**을 클릭합니다.

6. 필요에 따라 워크플로를 편집합니다. 예를 들어 .NET 버전을 변경합니다.

7. ```
          **변경 내용 커밋**을 클릭합니다.
   ```

`dotnet.yml` 워크플로 파일이 리포지토리의 `.github/workflows` 디렉터리에 추가됩니다.

## .NET 버전 지정

GitHub 호스트 실행기에서 사전 설치된 버전의 .NET Core SDK를 사용하려면 `setup-dotnet` 작업을 사용하세요. 이 작업은 각 실행기의 도구 캐시에서 특정 버전의 .NET을 찾고 필수 이진 파일을 `PATH`에 추가합니다. 이러한 변경 내용은 작업의 나머지 부분에 대해 유지됩니다.

```
          `setup-dotnet` 작업은 다양한 실행기 및 다양한 버전의 .NET에서 일관된 동작을 보장하므로 GitHub Actions로 .NET을 사용하는 데 권장되는 방법입니다. 자체 호스트 실행기를 사용하는 경우 .NET을 설치하고 이를 `PATH`에 추가해야 합니다. 자세한 내용은 [`setup-dotnet`](https://github.com/marketplace/actions/setup-net-core-sdk) 작업을 참조하세요.
```

### 여러 .NET 버전 사용

```yaml
name: dotnet package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        dotnet-version: [ '3.1.x', '6.0.x' ]

    steps:
      - uses: actions/checkout@v6
      - name: Setup dotnet ${{ matrix.dotnet-version }}
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: ${{ matrix.dotnet-version }}
      # You can test your matrix by printing the current dotnet version
      - name: Display dotnet version
        run: dotnet --version
```

### 특정 .NET 버전 사용

```
          `6.0.22`과 같은 특정 버전의 .NET을 사용하도록 작업을 구성할 수 있습니다. 또는 시맨틱 버전 구문을 사용하여 최신 부 릴리스를 가져올 수 있습니다. 이 예시에서는 .NET 6의 최신 부 릴리스를 사용합니다.
```

```yaml
    - name: Setup .NET 6.x
      uses: actions/setup-dotnet@v4
      with:
        # Semantic version range syntax or exact version of a dotnet version
        dotnet-version: '6.x'
```

## 종속성 설치

GitHub 호스트 러너에는 NuGet 패키지 관리자가 설치되어 있습니다. 코드를 빌드하고 테스트하기 전에 dotnet CLI를 사용하여 NuGet 패키지 레지스트리에서 종속성을 설치할 수 있습니다. 예를 들어 아래 YAML은 `Newtonsoft` 패키지를 설치합니다.

```yaml
steps:
- uses: actions/checkout@v6
- name: Setup dotnet
  uses: actions/setup-dotnet@v4
  with:
    dotnet-version: '6.0.x'
- name: Install dependencies
  run: dotnet add package Newtonsoft.Json --version 12.0.1
```

### 종속성 캐싱

선택적 `cache` 입력을 사용하여 향후 워크플로에 대한 NuGet 종속성을 캐시할 수 있습니다. 예를 들어 아래 YAML은 NuGet `global-packages` 폴더를 캐시한 다음 `Newtonsoft` 패키지를 설치합니다. 두 번째 선택적 입력인 `cache-dependency-path`를 사용하여 종속성 파일: `packages.lock.json`의 경로를 지정할 수 있습니다.

자세한 내용은 [종속성 캐싱 참조](/ko/actions/using-workflows/caching-dependencies-to-speed-up-workflows)을(를) 참조하세요.

```yaml
steps:
- uses: actions/checkout@v6
- name: Setup dotnet
  uses: actions/setup-dotnet@v4
  with:
    dotnet-version: '6.x'
    cache: true
- name: Install dependencies
  run: dotnet add package Newtonsoft.Json --version 12.0.1
```

> \[!NOTE]
> 종속성 수에 따라 종속성 캐시를 사용하는 것이 더 빠를 수 있습니다. 종속성이 많은 프로젝트는 다운로드에 필요한 시간이 줄어들기 때문에 성능이 향상되어야 합니다. 종속성이 더 적은 프로젝트는 성능이 크게 향상되지 않을 수 있으며 NuGet 캐시된 종속성을 설치하는 방식에 따라 성능이 약간 저하될 수도 있습니다. 성능은 프로젝트마다 다릅니다.

## 코드 빌드 및 테스트

코드를 빌드하고 테스트하기 위해 로컬에서 사용하는 것과 동일한 명령을 사용할 수 있습니다. 이 예시에서는 작업에서 `dotnet build` 및 `dotnet test`를 사용하는 방법을 보여 줍니다.

```yaml
steps:
- uses: actions/checkout@v6
- name: Setup dotnet
  uses: actions/setup-dotnet@v4
  with:
    dotnet-version: '6.0.x'
- name: Install dependencies
  run: dotnet restore
- name: Build
  run: dotnet build --no-restore
- name: Test with the dotnet CLI
  run: dotnet test --no-build
```

## 워크플로 데이터를 아티팩트로 패키지

워크플로가 완료되면 분석을 위해 결과 아티팩트 업로드할 수 있습니다. 예를 들어 로그 파일, 코어 덤프, 테스트 결과 또는 스크린샷을 저장해야 할 수 있습니다. 다음 예시에서는 `upload-artifact` 작업을 사용하여 테스트 결과를 업로드하는 방법을 보여 줍니다.

자세한 내용은 [워크플로 아티팩트와 데이터 저장 및 공유](/ko/actions/using-workflows/storing-workflow-data-as-artifacts)을(를) 참조하세요.

```yaml
name: dotnet package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        dotnet-version: [ '3.1.x', '6.0.x' ]

      steps:
        - uses: actions/checkout@v6
        - name: Setup dotnet
          uses: actions/setup-dotnet@v4
          with:
            dotnet-version: ${{ matrix.dotnet-version }}
        - name: Install dependencies
          run: dotnet restore
        - name: Test with dotnet
          run: dotnet test --no-restore --logger trx --results-directory "TestResults-${{ matrix.dotnet-version }}"
        - name: Upload dotnet test results
          uses: actions/upload-artifact@v4
          with:
            name: dotnet-results-${{ matrix.dotnet-version }}
            path: TestResults-${{ matrix.dotnet-version }}
          # Use always() to always run this step to publish test results when there are test failures
          if: ${{ always() }}
```

## 패키지 레지스트리에 게시

CI 테스트에 통과하면 .NET 패키지를 패키지 레지스트리에 게시하도록 워크플로를 구성할 수 있습니다. 리포지토리 비밀을 사용하여 이진 파일을 게시하는 데 필요한 토큰 또는 자격 증명을 저장할 수 있습니다. 다음 예시에서는 `dotnet core cli`를 사용하여 패키지를 만들고 GitHub Packages에 게시합니다.

```yaml
name: Upload dotnet package

on:
  release:
    types: [created]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '6.0.x' # SDK Version to use.
          source-url: https://nuget.pkg.github.com/<owner>/index.json
        env:
          NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
      - run: dotnet build --configuration Release <my project>
      - name: Create the package
        run: dotnet pack --configuration Release <my project>
      - name: Publish the package to GPR
        run: dotnet nuget push <my project>/bin/Release/*.nupkg
```