Введение
В этом руководстве показано, как получить рабочий процесс непрерывной интеграции (CI), который создает и тестирует приложение Ruby. Если тесты CI проходят правильно, может потребоваться развернуть код или опубликовать пакет.
Необходимые компоненты
Рекомендуется иметь базовое представление о Ruby, YAML, параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе:
Использование шаблона рабочего процесса Ruby
Чтобы быстро приступить к работе, добавьте шаблон рабочего процесса в .github/workflows каталог репозитория.
GitHub предоставляет шаблон рабочего процесса для Ruby, который должен работать для большинства проектов Ruby. В последующих разделах этого руководства приведены примеры настройки этого шаблона рабочего процесса.
-
На GitHubперейдите на главную страницу репозитория.
-
Под именем репозитория щелкните Actions.

-
Если в вашем репозитории уже используется рабочий процесс, нажмите кнопку Создать рабочий процесс.
-
На странице "Выбор рабочего процесса" показан выбор рекомендуемых шаблонов рабочих процессов. Найдите "ruby".
-
Отфильтруйте выбор рабочих процессов, щелкнув "Непрерывная интеграция".
-
В рабочем процессе Ruby нажмите кнопку "Настроить".
-
Измените рабочий процесс по мере необходимости. Например, измените версии Ruby, которые вы хотите использовать.
Примечание.
- Этот шаблон рабочего процесса содержит действие, которое не сертифицировано GitHub. Действия, предоставляемые сторонними сторонами, регулируются отдельными условиями обслуживания, политикой конфиденциальности и документацией по поддержке.
- При использовании действий со стороны сторонних производителей следует использовать версию, указанную с помощью фиксации SHA. Если действие будет изменено и вы хотите использовать более новую версию, необходимо обновить SHA. Вы можете указать версию, ссылаясь на тег или ветвь, однако действие может измениться без предупреждения. Дополнительные сведения см. в разделе Справочник по безопасному использованию.
-
Щелкните Зафиксировать изменения.
Файл
ruby.ymlрабочего процесса добавляется в.github/workflowsкаталог вашего репозитория.
Указание версии Ruby
Самый простой способ определить версию Ruby — использовать действие ruby/setup-ruby, предоставленное организацией Ruby на GitHub. Это действие добавляет любую поддерживаемую версию Ruby в PATH для каждого задания, выполняемого в рабочем процессе. Дополнительные сведения и доступные версии Ruby см. в описании ruby/setup-ruby.
Рекомендуется использовать действие Руби ruby/setup-ruby с GitHub Actions, так как это обеспечивает стабильное поведение между разными бегунами и разными версиями Руби.
Действие setup-ruby принимает версию Ruby в качестве входных данных и настраивает ее в средстве выполнения.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
steps:
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
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. Например, вы можете протестировать код для последних выпусков исправлений в версиях 3.1, 3.0 и 2.7.
strategy:
matrix:
ruby-version: ['3.1', '3.0', '2.7']
Каждая версия Ruby, указанная в массиве ruby-version, создает задание, которое выполняет одни и те же действия. Контекст ${{ matrix.ruby-version }} используется для доступа к версии текущего задания. Дополнительные сведения о стратегиях матриц и контекстах см. в разделе [AUTOTITLE и Синтаксис рабочего процесса для GitHub Actions](/actions/reference/workflows-and-actions/contexts).
Полный обновленный рабочий процесс с матричной стратегией может выглядеть следующим образом:
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
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@v6
- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
ruby-version: ${{ matrix.ruby-version }}
- name: Install dependencies
run: bundle install
- name: Run tests
run: bundle exec rake
Установка зависимостей с использованием средства увязки в пакеты
Действие setup-ruby установит средство увязки в пакеты автоматически. Версия определяется по файлу gemfile.lock. Если в файле блокировки отсутствует версия, будет установлена последняя совместимая версия.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
steps:
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
ruby-version: '3.1'
- run: bundle install
Кэширование зависимостей
Действия setup-ruby предоставляют метод автоматической обработки кэширования пакетов между запусками.
Чтобы включить кэширование, укажите следующее.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
steps:
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
bundler-cache: true
При этом средство увязки в пакеты будет настроено для установки пакетов в vendor/cache. Для каждого успешного выполнения рабочего процесса эта папка будет кэширована GitHub Actions и повторно загружена для последующих запусков рабочего процесса. Хэш версии gemfile.lock Ruby используется в качестве ключа кэша. Если вы устанавливаете новые пакеты или изменяете версию, кэш станет недействительным, а средство увязки в пакеты выполнит новую установку.
Кэширование без использования setup-ruby
Для более широкого контроля над кэшированием можно напрямую использовать действие actions/cache. Дополнительные сведения см. в разделе Справочник по кэшированию зависимостей.
steps:
- uses: actions/cache@v4
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
Если вы используете матричную сборку, потребуется включить матричные переменные в ключ кэша. Например, если у вас есть матричная стратегия для разных версий ruby (matrix.ruby-version) и различных операционных систем (matrix.os), шаги рабочего процесса могут выглядеть следующим образом:
steps:
- uses: actions/cache@v4
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
Матричное тестирование кода
В следующем примере выполняется матричное тестирование всех стабильных выпусков и головных версий MRI, JRuby и TruffleRuby на базе Ubuntu и macOS.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
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@v6
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
ruby-version: ${{ matrix.ruby }}
- run: bundle install
- run: bundle exec rake
Анализ кода
В следующем примере выполняется установка rubocop и его использование для анализа кода всех файлов. Дополнительные сведения см. в описании RuboCop. Вы можете настроить Rubocop, чтобы задать конкретные правила анализа.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
name: Linting
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
ruby-version: '2.6'
- run: bundle install
- name: Rubocop
run: rubocop -f github
Указание -f github означает, что выходные данные RuboCop будут находиться в GitHubформате заметки. Все ошибки подстроки будут отображаться на вкладке "Файлы изменены " запроса на вытягивание, который представляет их.
Публикация пакетов
Вы можете настроить рабочий процесс для публикации пакета Ruby в любом подходящем реестре пакетов после прохождения тестов CI.
Вы можете хранить любые маркеры доступа или учетные данные, необходимые для публикации пакета, с помощью секретов репозитория. Следующий пример создаёт и публикует пакет для GitHub Package Registry и RubyGems.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
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
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v6
- name: Set up Ruby 2.6
uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
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}}"