当执行bundle install时,需要根据Gemfile或者Gemfile.lock下载指定的ruby gems。当在Github CI进行构建时,我们可以把需要下载的ruby gems通过使用Github action缓存到当前的CI服务器,这样当进行构建时,就能更快的加载我们需要的gems。
Github一共提供了两种action可以帮助我们完成缓存操作:
actions/cache
actions/cache将ruby gems保存到缓存中并在下一次 CI构建期间恢复它。如果要指定Ruby版本,需要在当前的仓库目录,创建一个.ruby-version文件,将依赖的ruby版本写入该文件,Kingfisher/.ruby-version:
2.7.0
我们再来看一下Kingfisher中的设置:
# 1
- uses: actions/cache@v1
id: bundler-cache
with:
path: vendor/bundle # 2
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} # 3
restore-keys: |
${{ runner.os }}-gems- # 4
# 5
- name: Bundle setup
run: bundle config path vendor/bundle
- name: Bundle install
if: steps.bundler-cache.outputs.cache-hit != 'true' # 6
run: bundle install --jobs 4 --retry
1. 对于actions/cache的v1版本,仅支持单个路径,它必须是一个目录。不能缓存单个文件。使用actions/cache的v2版本,可以指定单个路径,也可以在单独的行上添加多个路径;
2. 输入参数path必要。指定缓存或还原的文件路径。路径可以是绝对路径或相对于工作目录的路径。当前是vendor/bundle;
3. 输入参数key,必要。根据当前的操作系统和Gemfile.lock文件哈希的表达式生成缓存key作为搜索缓存的键。当操作系统或者Gemfile.lock发生改变时,重新生成key值;当key匹配现有缓存时,被称为缓存命中,并且操作会将缓存的文件还原到path目录;
4. restore-keys:可选。key没有发生缓存命中时用于查找缓存的其他密钥顺序列表;
5. bundle config path vendor/bundle配置bundle,将需要的ruby gems安装到vendor/bundle目录;
6. cache-hit是actions/cache的输出参数。获取缓存命中的结果。
7. --jobs 4 --retry 3,并行安装ruby gems。如果当前有网络问题,将尝试3次。
ruby/setup-ruby
如果使用ruby/setup-ruby来管理gem缓存和ruby版本就更加直观和简洁。首先,在Github中fork Kingfisher到自己的仓库。把.github/workflows中的build.ymal修改为:
name: build
on: [push, pull_request]
jobs:
run-test:
runs-on: macOS-latest
strategy:
matrix:
destination: [
'macOS',
'iOS Simulator,name=iPhone 8',
'tvOS Simulator,name=Apple TV',
'watchOS Simulator,name=Apple Watch Series 5 - 40mm'
]
swift-version: [5.0]
steps:
- uses: actions/checkout@v1
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
bundler-cache: true
- name: Run tests
env:
DESTINATION: platform=${{ matrix.destination }}
SWIFT_VERSION: ${{ matrix.swift-version }}
run: bundle exec fastlane test_ci
接下来,将修改的代码push到自己的仓库中。此时已经触发Github CI服务器,开始执行workflow:
一共有四个任务,分别对应着,我们配置在构建矩阵中的参数。
实际执行的命令信息:
可以看到,仅仅需要设置bundler-cache: true。同时不再需要文件去指定ruby版本。相对来说就可以避免手动设置缓存时带来的问题。
本文分享自 HelloCoder全栈小集 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!