注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。
简介
本指南介绍如何创建用来生成和测试 Ruby 应用程序的持续集成 (CI) 工作流程。 如果 CI 测试通过,您可能想要部署代� �或发布 gem。
基本要求
建议基本了解 Ruby、YAML、工作流程配置选项以及如何创建工作流程文件。 更多信息请参阅:
Using the Ruby starter workflow
GitHub provides a Ruby starter workflow that will work for most Ruby projects. For more information, see the Ruby starter workflow.
To get started quickly, add the starter workflow to the .github/workflows directory of your repository. 下面显示的工作流假定仓库的默认分支是 main。
# 此工作流使用未经 GitHub 认证的操作。 # 它们由第三方提供,并受 # 单独的服务条款、隐私政策和支持 # 文档管理。 name: Ruby on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Ruby uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 with: ruby-version: '3.1' - name: Install dependencies run: bundle install - name: Run tests run: bundle exec rake 指定 Ruby 版本
指定 Ruby 版本的最简单方法是使用 Ruby 组织在 GitHub 上提供的 ruby/setup-ruby 操作。 该操作将任何受支持的 Ruby 版本添� 到工作流程中运行的每个作业的 PATH。 For more information and available Ruby versions, see ruby/setup-ruby.
使用 Ruby 的 ruby/setup-ruby 操作是 Python 与 GitHub Actions 结合使用时的推荐方式,� 为它能确保不同运行器和不同版本的 Ruby 行为一致。
setup-ruby 操作采用 Ruby 版本作为输入,并在运行器上配置该版本。
steps: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 with: ruby-version: '3.1' # Not needed with a .ruby-version file - run: bundle install - run: bundle exec rake 或者,您也可以将 .ruby-version 文件检入仓库的� �目录,而 setup-ruby 将使用该文件中定义的版本。
使用多个版本的 Ruby 进行测试
您可以添� 矩阵策略,以在多个版本的 Ruby 上运行工作流程。 For example, you can test your code against the latest patch releases of versions 3.1, 3.0, and 2.7.
strategy: matrix: ruby-version: ['3.1', '3.0', '2.7'] ruby-version 阵列中指定的每个 Ruby 版本都会创建一个运行相同步骤的作业。 ${{ matrix.ruby-version }} 上下文用于访问当前作业的版本。 For more information about matrix strategies and contexts, see "Workflow syntax for GitHub Actions" and "Contexts."
包含矩阵策略的完整更新工作流程可能看起如下:
# 此工作流使用未经 GitHub 认证的操作。 # 它们由第三方提供,并受 # 单独的服务条款、隐私政策和支持 # 文档管理。 name: Ruby CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest strategy: matrix: ruby-version: ['3.1', '3.0', '2.7'] steps: - uses: actions/checkout@v2 - name: Set up Ruby ${{ matrix.ruby-version }} uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 with: ruby-version: ${{ matrix.ruby-version }} - name: Install dependencies run: bundle install - name: Run tests run: bundle exec rake 使用 Bundler 安装依赖项
setup-ruby 操作将自动为您安装 Bundler。 版本由您的 gemfile.lock 文件决定。 如果您的锁定文件中没有版本,则会安装最新的兼容版本。
steps: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 with: ruby-version: '3.1' - run: bundle install 缓存依赖项
如果您使用的是 GitHub 托管的运行器, setup-ruby 操作提供了在运行之间自动处理 gem 缓存的方法。
要启用缓存,请设置以下内容。
steps: - uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 with: bundler-cache: true 这将配置 Bundler 以安装 gem 到 vendor/cache。 对于工作流程的每次成功运行,此文件夹将由 Actions 缓存,并重新下载用于后续的工作流程运行。 gemfile.lock 和 Ruby 版本的哈希值用作缓存密钥。 如果安装任何新 Gem 或更改版本,缓存将失效,Bundler 将进行全新安装。
� setup-ruby 的缓存
为了� 强缓存控制,如果您使用的是 GitHub 托管的运行器,可以直接使用 actions/cache 操作。 更多信息请参阅“缓存依赖项以� 快工作流程”。
steps: - uses: actions/cache@v2 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} restore-keys: | ${{ runner.os }}-gems- - name: Bundle install run: | bundle config path vendor/bundle bundle install --jobs 4 --retry 3 如果您使用的是矩阵构建,您将会想要在缓存密钥中包含矩阵变量。 例如,如果您e 不同 ruby 版本 (matrix.ruby-version) 和不同系统 (matrix.os) 的矩阵策略,您的工作流程步骤可能看起来如下:
steps: - uses: actions/cache@v2 with: path: vendor/bundle key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} restore-keys: | bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}- - name: Bundle install run: | bundle config path vendor/bundle bundle install --jobs 4 --retry 3 测试代� �的矩阵
下面的示例矩阵在 Ubuntu 和 macOS 上测试 MRI、JRuby 和 TruffleRuby 的所有稳定版本和头部版本。
# 此工作流使用未经 GitHub 认证的操作。 # 它们由第三方提供,并受 # 单独的服务条款、隐私政策和支持 # 文档管理。 name: Matrix Testing on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ${{ matrix.os }}-latest strategy: fail-fast: false matrix: os: [ubuntu, macos] ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head] continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }} steps: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6 with: ruby-version: ${{ matrix.ruby }} - run: bundle install - run: bundle exec rake 嵌入代� �
下面的示例安装 rubocop 并用它来嵌入所有文件。 For more information, see RuboCop. 您可以配置 Rubocop 来决定特定的嵌入规则。
# 此工作流使用未经 GitHub 认证的操作。 # 它们由第三方提供,并受 # 单独的服务条款、隐私政策和支持 # 文档管理。 name: Linting on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6 with: ruby-version: 2.6 - run: bundle install - name: Rubocop run: rubocop 发布 Gem
您可以配置工作流程在 CI 测试通过时将 Ruby 包发布到您想要的任何包注册表。
您可以使用仓库密� �存储发布软件包所需的访问令牌或凭据。 下面的示例创建包并将其发布到 GitHub Package 注册表和 RubyGems。
# 此工作流使用未经 GitHub 认证的操作。 # 它们由第三方提供,并受 # 单独的服务条款、隐私政策和支持 # 文档管理。 name: Ruby Gem on: # Manually publish workflow_dispatch: # Alternatively, publish whenever changes are merged to the `main` branch. push: branches: [ main ] pull_request: branches: [ main ] jobs: build: name: Build + Publish runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Ruby 2.6 uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6 with: ruby-version: 2.6 - run: bundle install - name: Publish to GPR run: | mkdir -p $HOME/.gem touch $HOME/.gem/credentials chmod 0600 $HOME/.gem/credentials printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials gem build *.gemspec gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem  env: GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}" OWNER: ${{ github.repository_owner }} - name: Publish to RubyGems run: | mkdir -p $HOME/.gem touch $HOME/.gem/credentials chmod 0600 $HOME/.gem/credentials printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials gem build *.gemspec gem push *.gem  env: GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"