Go 빌드 및 테스트하기

Go 빌드 및 테스트하기

Go 프로젝트를 빌드하고 테스트하는 지속적 통합(CI) 워크플로를 만드는 방법을 알려드릴게요. Go 패키지를 빌드·테스트·게시하는 과정을 한 번에 확인할 수 있어요.

출처: 문서

본문

Go 프로젝트를 빌드하고 테스트하는 지속적 통합(CI) 워크플로를 만드는 방법을 알아봅니다.

소개

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

GitHub 호스팅 러너에는 Go의 의존성을 포함한 사전 설치된 소프트웨어가 있는 도구 캐시가 있습니다. 최신 소프트웨어의 전체 목록과 사전 설치된 Go 버전은 GitHub-hosted runners를 참고하세요.

사전 요구 사항

YAML 구문과 GitHub Actions에서의 사용법에 이미 익숙해야 합니다. 자세한 내용은 Workflow syntax for GitHub Actions를 참고하세요.

Go 언어에 대한 기본적인 이해를 권장합니다. 자세한 내용은 Getting started with Go를 참고하세요.

Go 워크플로 템플릿 사용하기

빠르게 시작하려면 저장소의 .github/workflows 디렉터리에 워크플로 템플릿을 추가하세요.

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

  1. GitHub에서 저장소의 메인 페이지로 이동합니다.

  2. 저장소 이름 아래에서 Actions를 클릭합니다.

    Screenshot of the tabs for the "github/docs" repository. The "Actions" tab is highlighted with an orange outline.

  3. 저장소에 이미 워크플로가 있다면 New workflow를 클릭합니다.

  4. "Choose a workflow" 페이지에 추천 워크플로 템플릿 목록이 표시됩니다. "go"를 검색하세요.

  5. Continuous integration을 클릭해서 워크플로 선택을 필터링합니다.

  6. "Go - by GitHub Actions" 워크플로에서 Configure를 클릭합니다.

    Screenshot of the "Choose a workflow" page. The "Configure" button on the "Go" workflow is highlighted with an orange outline.

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

  8. Commit changes를 클릭합니다.

    go.yml 워크플로 파일이 저장소의 .github/workflows 디렉터리에 추가됩니다.

Go 버전 지정하기

Go 버전을 지정하는 가장 쉬운 방법은 GitHub가 제공하는 setup-go 액션을 사용하는 것입니다. 자세한 내용은 setup-go 액션을 참고하세요.

GitHub 호스팅 러너에서 사전 설치된 Go 버전을 사용하려면 setup-go 액션의 go-version 속성에 해당 버전을 전달합니다. 이 액션은 각 러너의 도구 캐시에서 특정 Go 버전을 찾아 필요한 바이너리를 PATH에 추가합니다. 이러한 변경은 잡의 나머지 기간 동안 유지됩니다.

setup-go 액션은 다양한 러너와 다양한 Go 버전에서 일관된 동작을 보장하는 데 도움이 되므로 GitHub Actions에서 Go를 사용하는 권장 방법입니다. 셀프 호스팅 러너를 사용한다면 Go를 설치하고 PATH에 추가해야 합니다.

여러 Go 버전 사용하기

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의 최신 패치 릴리스를 사용합니다:

      - 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을 사용해서 의존성을 설치할 수 있습니다:

    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/[email protected]

의존성 캐싱하기

setup-go 액션을 사용해서 의존성을 캐시하고 복원할 수 있습니다. 기본적으로 setup-go 액션을 사용하면 캐싱이 활성화됩니다.

setup-go 액션은 저장소 루트에서 의존성 파일 go.sum을 검색하고 의존성 파일의 해시를 캐시 키의 일부로 사용합니다.

여러 의존성 파일이 사용되거나 다른 하위 디렉터리에 있을 때는 cache-dependency-path 파라미터를 사용할 수 있습니다.

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

사용자 지정 요구 사항이 있거나 캐싱을 더 세밀하게 제어해야 한다면 cache 액션을 사용할 수 있습니다. 자세한 내용은 Dependency caching reference를 참고하세요.

코드 빌드 및 테스트하기

로컬에서 코드를 빌드하고 테스트하는 데 사용하는 것과 같은 명령을 사용할 수 있습니다. 이 예시 워크플로는 잡에서 go buildgo test를 사용하는 방법을 보여줍니다:

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 액션을 사용해서 테스트 결과를 업로드하는 방법을 보여줍니다.

자세한 내용은 Store and share data with workflow artifacts를 참고하세요.

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@v4
        with:
          name: Go-results-${{ matrix.go-version }}
          path: TestResults-${{ matrix.go-version }}.json

더 알아보기 (Learn more)