GitHub Actions 实际操作
感恩节假期期间,我花了一些时间熟悉 GitHub Actions,并设置了一些工作流程。以下是使用 GitHub Actions 为 Rails 项目运行 rspec 测试所需的步骤以及我的一些观察。
但首先,什么是 GitHub Actions?
GitHub Actions 是一些小型的可组合任务,可以组合起来创建工作流程。这些工作流程允许您将团队或项目的软件开发生命周期 (SDLC) 直接嵌入到代码库中。您可以使用这些工作流程进行构建、测试、打包、发布和部署,还可以自动化流程的其他部分,例如分配审阅者、向 Slack 发送通知、检查文件或检查代码覆盖率。
我的第一次刺伤
我第一次尝试运行 rspec 测试的工作流程是这样的:
- 在 GitHub 中的“操作”选项卡中,单击“设置此工作流程”以获取建议的 Ruby 工作流程。
- 配置为在对主分支的拉取请求(或对已创建拉取请求的分支的任何推送)上运行
- 更新为使用我的特定版本的
ubuntu-18.04
ruby 2.5.7 - 改为
bundle exec rake
bundle exec rspec spec
- 提交并创建此分支的 master 拉取请求
- 观看所引发的动作!
- 然后失败了。WOMP WOMP。😞
第一个失败是虚拟机上没有 Ruby 2.5.7。
##[error]Version 2.5.7 not found
经过一番研究,我发现(目前)ubuntu-18.04
虚拟机仅支持 Ruby 2.5.5。该项目依赖于最新的安全补丁版本 2.5.7。GitHubactions/setup-ruby
建议的标准版本不起作用。于是,我从市场上找到了另一个版本(此人也在那里遇到了同样的问题),并安装了特定且正确的 Ruby 版本。通过此操作,我能够使用正确的 Ruby 版本,并将其缓存起来actions/cache
。虽然仍然有点慢,但总算成功了。
下一个障碍是无法找到我的 Gemfile 所需的正确捆绑器版本:
Could not find 'bundler' (1.17.3) required by your Gemfile.lock
哎呀。添加-v 1.17.3
到 bundler 安装后就解决了这个问题。
然后尝试安装pg
gem 时失败了:
An error occurred while installing pg (1.0.0), and Bundler cannot continue.
Make sure that `gem install pg -v '1.0.0' --source 'https://rubygems.org/'`
succeeds before bundling.
为了解决这个问题,我们可以使用块将带有 postgresql 的容器拉入我们的工作流中services
,该块可用于在另一个容器中托管其他服务,如数据库或缓存。
在我们的工作流文件中,它看起来像这样:
services:
postgres:
image: postgres:10.11
ports: ["5432:5432"]
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
然后我们必须安装postgresql客户端:
- name: Install PostgreSQL 10 Client
run: |
sudo apt-get -yqq install libpq-dev
注意:我最初构建时无法安装pg
gem 是因为这个libpq-dev
包不可用。
并设置数据库:
- name: Setup Database
env:
PGHOST: localhost
PGUSER: postgres
RAILS_ENV: test
run: |
gem install bundler -v 1.17.3
bundle install --jobs 4 --retry 3
bin/rails db:setup
根据您在此处的需求,您可能需要bin/rails db:create db:schema:load
。
添加最后三个块(service
、安装 postgresql 客户端和设置数据库),我们的测试现在可以运行了!
提交你的.github/workflows/ruby.yml
更改。如果你使用 GitHub Actions 编辑器,你将自动创建一个包含此更改的拉取请求,并触发你的操作。如果你在本地进行这些更改,请将它们推送上去并创建拉取请求,然后你就会看到操作的执行效果。
最终版本
没耐心继续看下去,或者只想看最终版本?来吧!文件位于:.github/workflows/ruby.yml
name: Run Rspec Tests
on:
pull_request:
branches:
- master
jobs:
build:
runs-on: ubuntu-18.04
services:
postgres:
image: postgres:10.11
ports: ["5432:5432"]
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v1
- name: Cache Ruby
uses: actions/cache@preview
id: cache
with:
path: ~/local/rubies
key: ruby-2.5.7
- name: Set up Ruby 2.5.7
uses: clupprich/ruby-build-action@master
id: ruby
with:
ruby-version: 2.5.7
cache-available: ${{ steps.cache.outputs.cache-hit == 'true' }}
- name: Print ruby version
run: ${{ steps.ruby.outputs.ruby-path }} --version
- name: Install PostgreSQL 10
run: |
sudo apt-get -yqq install libpq-dev
- name: Setup Database
env:
PGHOST: localhost
PGUSER: postgres
RAILS_ENV: test
run: |
gem install bundler -v 1.17.3
bundle install --jobs 4 --retry 3
bin/rails db:create db:schema:load
- name: Build and test with rspec
env:
PGHOST: localhost
PGUSER: postgres
RAILS_ENV: test
run: |
gem install bundler -v 1.17.3
bundle install --jobs 4 --retry 3
bundle exec rspec spec
一些观察
这个编辑器……有点不稳定,很烦人,不过在我完全搞清楚自己想做什么之前,我会坚持用它。它总是在我输入和复制粘贴步骤的时候碍事。另外,所有文档都在侧边栏,完整文档在这里。
我喜欢 GitHub Actions,因为我无需跳转到其他工具或服务来运行测试并查看结果。我喜欢工作流程就在那里,并且与我的代码一起进行版本控制。这感觉对我的大脑和实际设置来说都轻松多了,不用再跳转到 Circle CI 之类的工具了。
市场上有其他人已经写好的动作。不过,正如你搜索 所见slack
,那里有大量的动作可供选择,所以谁知道它们的质量如何呢!进入市场并获得验证有一些要求,但我尝试的前几个要求很难被满足。
是否选择在项目中使用 GitHub Actions 可能还取决于你的工具箱里还有哪些其他工具。如果你已经在 CI 中使用 Heroku Pipelines,那么这种方法可能就不再合适了。
下一步是什么?
如果你对代码库的测试方式足够自信,那么下一步或许可以在拉取请求合并到主分支时,自动部署到你的应用。或者,你也可以在构建开始、成功或失败时发送 Slack 通知!
文章来源:https://dev.to/jennapederson/github-actions-in-action-2c5