# Go 빌드 및 테스트

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

> \[!NOTE]
> GitHub Enterprise Server 호스트 실행기는 현재 GitHub에서 지원되지 않습니다.

## 소개

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

GitHub-hosted runners에는 Go에 대한 종속성을 포함하는 사전 설치된 소프트웨어가 있는 도구 캐시가 있습니다. 최신 소프트웨어 및 사전 설치된 Go 버전의 전체 목록은 [GitHub 호스팅 실행기](/ko/enterprise-server@3.22/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images)을(를) 참조하세요.

## 필수 조건

YAML 구문과 이 구문이 사용되는 GitHub Actions방법에 대해 이미 잘 알고 있어야 합니다. 자세한 내용은 [GitHub Actions에 대한 워크플로 구문](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/workflow-syntax)을(를) 참조하세요.

Go 언어를 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 [Go 시작](https://golang.org/doc/tutorial/getting-started)을 참조하세요.

## Go 워크플로 템플릿 사용

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

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

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. "워크플로 선택" 페이지에는 권장되는 워크플로 템플릿의 선택 항목이 표시됩니다. "go"를 검색하세요.

5. **지속적 통합**을 클릭하여 워크플로 선택을 필터링합니다.

6. "Go - by GitHub Actions" 워크플로에서 **구성**을 클릭합니다.

   !["워크플로 선택" 페이지의 스크린샷. "이동" 워크플로의 "구성" 버튼은 주황색 윤곽선으로 강조 표시되어 있습니다.](/assets/images/help/actions/starter-workflow-go.png)
   "Go - by GitHub Actions" 워크플로 템플릿을 찾을 수 없으면, 다음 워크플로 코드를 리포지토리의 `go.yml` 디렉터리에 있는 `.github/workflows`라는 새 파일에 복사하세요.

   ```yaml copy
   name: Go

   on:
     push:
       branches: [ "main" ]
     pull_request:
       branches: [ "main" ]

   jobs:
     build:

       runs-on: self-hosted
       steps:
         - uses: actions/checkout@v6

         - name: Set up Go
           uses: actions/setup-go@v5
           with:
             go-version: '1.20'

         - name: Build
           run: go build -v ./...

         - name: Test
           run: go test -v ./...
   ```

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

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

## Go 버전 지정

Go 버전을 지정하는 가장 쉬운 방법은 `setup-go`에서 제공하는 GitHub 작업을 사용하는 것입니다. 자세한 내용은 [`setup-go` 작업](https://github.com/actions/setup-go/)을 참조하세요.

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

이 `setup-go` 작업은 Go와 함께 GitHub Actions사용하는 권장 방법입니다. 이는 다른 실행기 및 다른 버전의 Go에서 일관된 동작을 보장하는 데 도움이 되므로 권장됩니다. 자체 호스트 실행기를 사용하는 경우 Go를 설치하고 이를 `PATH`에 추가해야 합니다.

### 여러 버전의 Go 사용

```yaml copy
name: Go

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [ '1.19', '1.20', '1.21.x' ]

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

### 특정 Go 버전 사용

`1.20.8`과 같은 특정 버전의 Go를 사용하도록 작업을 구성할 수 있습니다. 또는 시맨틱 버전 구문을 사용하여 최신 마이너 릴리스를 가져올 수 있습니다. 이 예에서는 Go 1.21의 최신 패치 릴리스를 사용합니다:

```yaml copy
      - name: Setup Go 1.21.x
        uses: actions/setup-go@v5
        with:
          # Semantic version range syntax or exact version of Go
          go-version: '1.21.x'
```

## 종속성 설치

종속성을 설치하는 데 `go get`을 사용할 수 있습니다.

```yaml copy
    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21.x'
      - name: Install dependencies
        run: |
          go get .
          go get example.com/octo-examplemodule
          go get example.com/octo-examplemodule@v1.3.4
```

### 종속성 캐시 처리

[
`setup-go`작업](https://github.com/actions/setup-go)을 사용하여 종속성을 캐시하고 복원할 수 있습니다. 기본값으로 캐싱은 `setup-go` 작업을 사용할 때 활성화됩니다.

`setup-go` 작업은 리포지토리 루트에서 종속성 파일 `go.sum`을 검색하고 종속성 파일의 해시를 캐시 키의 일부로 사용합니다.

여러 종속성 파일이 사용되거나 서로 다른 하위 디렉터리에 있는 경우 `cache-dependency-path` 매개 변수를 사용할 수 있습니다.

```yaml copy
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.17'
          cache-dependency-path: subdir/go.sum
```

사용자 지정 요구사항이 있거나 캐싱에 대한 세부적인 제어가 필요한 경우 [`cache` 작업](https://github.com/marketplace/actions/cache)을 사용할 수 있습니다. 자세한 내용은 [종속성 캐싱 참조](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching)을(를) 참조하세요.

## 코드 빌드 및 테스트

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

```yaml copy
name: Go
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21.x'
      - name: Install dependencies
        run: go get .
      - name: Build
        run: go build -v ./...
      - name: Test with the Go CLI
        run: go test
```

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

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

자세한 내용은 [워크플로 아티팩트와 데이터 저장 및 공유](/ko/enterprise-server@3.22/actions/tutorials/store-and-share-data)을(를) 참조하세요.

```yaml copy
name: Upload Go test results

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [ '1.19', '1.20', '1.21.x' ]

    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
      - name: Install dependencies
        run: go get .
      - name: Test with Go
        run: go test -json > TestResults-${{ matrix.go-version }}.json
      - name: Upload Go test results
        uses: actions/upload-artifact@v3
        with:
          name: Go-results-${{ matrix.go-version }}
          path: TestResults-${{ matrix.go-version }}.json
```