{"meta":{"title":"Ruby 빌드 및 테스트","intro":"CI(연속 통합) 워크플로를 만들어 Ruby 프로젝트를 빌드하고 테스트할 수 있습니다.","product":"GitHub Actions","breadcrumbs":[{"href":"/ko/actions","title":"GitHub Actions"},{"href":"/ko/actions/tutorials","title":"자습서"},{"href":"/ko/actions/tutorials/build-and-test-code","title":"코드 빌드 및 테스트"},{"href":"/ko/actions/tutorials/build-and-test-code/ruby","title":"루비"}],"documentType":"article"},"body":"# Ruby 빌드 및 테스트\n\nCI(연속 통합) 워크플로를 만들어 Ruby 프로젝트를 빌드하고 테스트할 수 있습니다.\n\n## 소개\n\n이 가이드에서는 Ruby 애플리케이션을 빌드하고 테스트하는 CI(연속 통합) 워크플로를 만드는 방법을 보여 줍니다. CI 테스트에 통과하면 코드를 배포하거나 gem을 게시할 수 있습니다.\n\n## 필수 조건\n\nRuby, YAML, 워크플로 구성 옵션과 워크플로 파일을 만드는 방법을 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 다음을 참조하세요.\n\n* [GitHub Actions 알아보기](/ko/actions/learn-github-actions)\n* [20분 안에 Ruby](https://www.ruby-lang.org/en/documentation/quickstart/)\n\n## Ruby 워크플로 템플릿 사용\n\n빠르게 시작하려면 워크플로 템플릿을 리포지토리의 `.github/workflows` 디렉터리에 추가합니다.\n\n{data variables.product.prodname\\_dotcom %}은(는) 대부분의 Ruby 프로젝트에 적합한 Ruby용 워크플로 템플릿을 제공합니다. 이 가이드의 후속 섹션에서는 이 워크플로 템플릿을 사용자 지정하는 방법에 대한 예시를 제공합니다.\n\n1. GitHub에서 리포지토리의 기본 페이지로 이동합니다.\n\n2. 리포지토리 이름에서 **<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> 작업**을 클릭합니다.\n\n   ![\"github/docs\" 리포지토리의 탭 스크린샷. \"작업\" 탭은 주황색 윤곽선으로 강조 표시됩니다.](/assets/images/help/repository/actions-tab-global-nav-update.png)\n\n3. 리포지토리에 워크플로가 이미 있는 경우 **새 워크플로**를 클릭합니다.\n\n4. \"워크플로 선택\" 페이지에는 권장되는 워크플로 템플릿의 선택 항목이 표시됩니다. \"ruby\"를 검색합니다.\n\n5. ```\n          **지속적 통합**을 클릭하여 워크플로 선택을 필터링합니다.\n   ```\n\n6. \"Ruby\" 워크플로에서 **구성**을 클릭합니다.\n\n7. 필요에 따라 워크플로를 편집합니다. 예를 들어 사용하려는 Ruby 버전을 변경합니다.\n\n   > \\[!NOTE]\n   >\n   > * 워크플로 템플릿에는 GitHub에서 인증되지 않은 작업이 포함되어 있습니다. 제3자가 제공하는 작업은 별도의 서비스 약관, 개인 정보 보호 정책 및 지원 문서를 적용합니다.\n   > * 타사의 작업을 사용하는 경우 커밋 SHA에서 지정한 버전을 사용해야 합니다. 작업을 수정하고 최신 버전을 사용하려는 경우 SHA를 업데이트해야 합니다. 태그 또는 분기를 참조하여 버전을 지정할 수 있지만 경고 없이 작업이 변경될 수 있습니다. 자세한 내용은 [안전 사용 참조](/ko/actions/security-guides/security-hardening-for-github-actions#using-third-party-actions)을(를) 참조하세요.\n\n8. ```\n          **변경 내용 커밋**을 클릭합니다.\n   ```\n\n`ruby.yml` 워크플로 파일이 리포지토리의 `.github/workflows` 디렉터리에 추가됩니다.\n\n## Ruby 버전 지정\n\nRuby 버전을 지정하는 가장 쉬운 방법은 GitHub Ruby 조직에서 제공하는 `ruby/setup-ruby` 작업을 사용하는 것입니다. 이 작업은 워크플로에서 실행되는 각 작업에 대해 지원되는 모든 Ruby 버전을 `PATH`에 추가합니다. 자세한 내용 및 사용 가능한 Ruby 버전은 [`ruby/setup-ruby`](https://github.com/ruby/setup-ruby)를 참조하세요.\n\nRuby의 `ruby/setup-ruby` 동작을 사용하는 것이 다른 주자 및 다른 버전의 Ruby에서 일관된 동작을 보장하기 때문에 GitHub Actions Ruby를 사용하는 것이 좋습니다.\n\n이 `setup-ruby` 작업은 Ruby 버전을 입력으로 사용하고 실행기에서 해당 버전을 구성합니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\nsteps:\n- uses: actions/checkout@v6\n- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n  with:\n    ruby-version: '3.1' # Not needed with a .ruby-version file\n- run: bundle install\n- run: bundle exec rake\n```\n\n또는 `.ruby-version` 파일을 리포지토리의 루트로 체크 인하면 `setup-ruby`에서 해당 파일에 정의된 버전을 사용합니다.\n\n## 여러 버전의 Ruby로 테스트\n\n둘 이상의 Ruby 버전으로 워크플로를 실행하는 매트릭스 전략을 추가할 수 있습니다. 예를 들어 3.1, 3.0, 2.7 버전의 최신 패치 릴리스에 대해 코드를 테스트할 수 있습니다.\n\n```yaml\nstrategy:\n  matrix:\n    ruby-version: ['3.1', '3.0', '2.7']\n```\n\n```\n          `ruby-version` 배열에 지정된 Ruby의 각 버전은 동일한 단계를 실행하는 작업을 만듭니다. `${{ matrix.ruby-version }}` 컨텍스트는 현재 작업의 버전에 액세스하는 데 사용됩니다. 행렬 전략 및 컨텍스트에 대한 자세한 내용은 [AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions) 및 [AUTOTITLE](/actions/learn-github-actions/contexts)을(를) 참조하세요.\n```\n\n매트릭스 전략을 사용하여 업데이트된 전체 워크플로는 다음과 같습니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\n\n# 커밋 SHA에 작업을 고정하는 것이 좋습니다.\n# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.\n# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.\n\nname: Ruby CI\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  test:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        ruby-version: ['3.1', '3.0', '2.7']\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Ruby ${{ matrix.ruby-version }}\n        uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n        with:\n          ruby-version: ${{ matrix.ruby-version }}\n      - name: Install dependencies\n        run: bundle install\n      - name: Run tests\n        run: bundle exec rake\n```\n\n## 번들러를 사용하여 종속성 설치\n\n```\n          `setup-ruby` 작업은 자동으로 번들러를 설치합니다. 버전은 `gemfile.lock` 파일에 의해 결정됩니다. 잠금 파일에 버전이 없으면 호환되는 최신 버전이 설치됩니다.\n```\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\nsteps:\n- uses: actions/checkout@v6\n- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n  with:\n    ruby-version: '3.1'\n- run: bundle install\n```\n\n### 종속성 캐시 처리\n\n```\n          `setup-ruby` 작업은 실행 간에 gem의 캐싱을 자동으로 처리하는 메서드를 제공합니다.\n```\n\n캐싱을 사용하도록 설정하려면 다음을 설정합니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\nsteps:\n- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n  with:\n    bundler-cache: true\n```\n\n그러면 `vendor/cache`에 gem을 설치하도록 번들러가 구성됩니다. 워크플로를 성공적으로 실행할 때마다 이 폴더는 GitHub Actions에 의해 캐시되고 후속 워크플로 실행을 위해 다시 다운로드됩니다.\n`gemfile.lock` 및 Ruby 버전의 해시가 캐시 키로 사용됩니다. 새 gem을 설치하거나 버전을 변경하는 경우 캐시가 유효하지 않게 되고 번들러가 새 설치를 수행합니다.\n\n```\n          **setup-ruby를 사용하지 않는 캐싱**\n```\n\n캐싱에 대한 제어를 강화하기 위해 `actions/cache` 작업을 바로 사용할 수 있습니다. 자세한 내용은 [종속성 캐싱 참조](/ko/actions/using-workflows/caching-dependencies-to-speed-up-workflows)을(를) 참조하세요.\n\n```yaml\nsteps:\n- uses: actions/cache@v4\n  with:\n    path: vendor/bundle\n    key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n    restore-keys: |\n      ${{ runner.os }}-gems-\n- name: Bundle install\n  run: |\n    bundle config path vendor/bundle\n    bundle install --jobs 4 --retry 3\n```\n\n매트릭스 빌드를 사용하는 경우 캐시 키에 매트릭스 변수를 포함해야 합니다. 예를 들어 다양한 Ruby 버전(`matrix.ruby-version`)과 운영 체제(`matrix.os`)에 대한 매트릭스 전략이 있는 경우 워크플로 단계는 다음과 같을 수 있습니다.\n\n```yaml\nsteps:\n- uses: actions/cache@v4\n  with:\n    path: vendor/bundle\n    key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}\n    restore-keys: |\n      bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}-\n- name: Bundle install\n  run: |\n    bundle config path vendor/bundle\n    bundle install --jobs 4 --retry 3\n```\n\n## 코드 매트릭스 테스트\n\n다음 예시 매트릭스는 Ubuntu 및 macOS에서 MRI, JRuby, TruffleRuby의 모든 안정적인 릴리스 및 헤드 버전을 테스트합니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\n\n# 커밋 SHA에 작업을 고정하는 것이 좋습니다.\n# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.\n# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.\n\nname: Matrix Testing\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  test:\n    runs-on: ${{ matrix.os }}-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu, macos]\n        ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]\n    continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}\n    steps:\n      - uses: actions/checkout@v6\n      - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n        with:\n          ruby-version: ${{ matrix.ruby }}\n      - run: bundle install\n      - run: bundle exec rake\n```\n\n## 코드 린트\n\n다음 예시에서는 `rubocop`을 설치하고 이를 사용하여 모든 파일을 린트합니다. 자세한 내용은 [RuboCop](https://github.com/rubocop-hq/rubocop)을 참조하세요. 특정 린팅 규칙을 결정하도록 [Rubocop을 구성](https://docs.rubocop.org/rubocop/configuration.html)할 수 있습니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\n\n# 커밋 SHA에 작업을 고정하는 것이 좋습니다.\n# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.\n# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.\n\nname: Linting\n\non: [push]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n        with:\n          ruby-version: '2.6'\n      - run: bundle install\n      - name: Rubocop\n        run: rubocop -f github\n```\n\n```\n          `-f github`를 지정하면 RuboCop 출력은 GitHub의 주석 형식이 됩니다. 해당 오류를 도입한 풀 리퀘스트의 **변경된 파일** 탭에 모든 린팅 오류가 인라인으로 표시됩니다.\n```\n\n## Gems 게시\n\nCI 테스트에 통과하면 원하는 패키지 레지스트리에 Ruby 패키지를 게시하도록 워크플로를 구성할 수 있습니다.\n\n리포지토리 비밀을 사용하여 패키지를 게시하는 데 필요한 모든 액세스 토큰 또는 자격 증명을 저장할 수 있습니다. 다음 예제에서는 패키지를 만들고 `GitHub Package Registry` 및 `RubyGems` 게시합니다.\n\n```yaml\n# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.\n# 작업은 타사에서 제공하며\n# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.\n# 참조하세요.\n\n# 커밋 SHA에 작업을 고정하는 것이 좋습니다.\n# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.\n# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.\n\nname: Ruby Gem\n\non:\n  # Manually publish\n  workflow_dispatch:\n  # Alternatively, publish whenever changes are merged to the `main` branch.\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n    name: Build + Publish\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Ruby 2.6\n        uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n        with:\n          ruby-version: '2.6'\n      - run: bundle install\n\n      - name: Publish to GPR\n        run: |\n          mkdir -p $HOME/.gem\n          touch $HOME/.gem/credentials\n          chmod 0600 $HOME/.gem/credentials\n          printf -- \"---\\n:github: ${GEM_HOST_API_KEY}\\n\" > $HOME/.gem/credentials\n          gem build *.gemspec\n          gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem\n        env:\n          GEM_HOST_API_KEY: \"Bearer ${{secrets.GITHUB_TOKEN}}\"\n          OWNER: ${{ github.repository_owner }}\n\n      - name: Publish to RubyGems\n        run: |\n          mkdir -p $HOME/.gem\n          touch $HOME/.gem/credentials\n          chmod 0600 $HOME/.gem/credentials\n          printf -- \"---\\n:rubygems_api_key: ${GEM_HOST_API_KEY}\\n\" > $HOME/.gem/credentials\n          gem build *.gemspec\n          gem push *.gem\n        env:\n          GEM_HOST_API_KEY: \"${{secrets.RUBYGEMS_AUTH_TOKEN}}\"\n```"}