前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ruby Gems缓存 (三)

Ruby Gems缓存 (三)

作者头像
CC老师
发布2021-08-25 14:55:07
6410
发布2021-08-25 14:55:07
举报
文章被收录于专栏:HelloCode开发者学习平台

当执行bundle install时,需要根据Gemfile或者Gemfile.lock下载指定的ruby gems。当在Github CI进行构建时,我们可以把需要下载的ruby gems通过使用Github action缓存到当前的CI服务器,这样当进行构建时,就能更快的加载我们需要的gems

Github一共提供了两种action可以帮助我们完成缓存操作:

  • actions/cache:最流行的缓存Ruby gem方案,仅缓存;
  • ruby/setup-ruby:可以安装指定版本的Ruby并且使用bundler缓存Ruby gem

actions/cache

actions/cacheruby gems保存到缓存中并在下一次 CI构建期间恢复它。如果要指定Ruby版本,需要在当前的仓库目录,创建一个.ruby-version文件,将依赖的ruby版本写入该文件,Kingfisher/.ruby-version

代码语言:javascript
复制
2.7.0

我们再来看一下Kingfisher中的设置:

代码语言:javascript
复制
# 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/cachev1版本,仅支持单个路径,它必须是一个目录。不能缓存单个文件。使用actions/cachev2版本,可以指定单个路径,也可以在单独的行上添加多个路径;

2. 输入参数path必要。指定缓存或还原的文件路径。路径可以是绝对路径或相对于工作目录的路径。当前是vendor/bundle

3. 输入参数key,必要。根据当前的操作系统和Gemfile.lock文件哈希的表达式生成缓存key作为搜索缓存的键。当操作系统或者Gemfile.lock发生改变时,重新生成key值;当key匹配现有缓存时,被称为缓存命中,并且操作会将缓存的文件还原到path目录;

4. restore-keys:可选。key没有发生缓存命中时用于查找缓存的其他密钥顺序列表;

  1. 如果提供restore-keysactions/cache将按顺序搜索与restore-keys列表匹配的任何缓存;
  2. 当精确匹配时,操作会将缓存中的文件恢复至设置path的目录;
  3. 如果没有精确匹配,操作将会搜索恢复键值的部分匹配。当操作找到部分匹配时,最近的缓存将恢复到设置path目录。

5. bundle config path vendor/bundle配置bundle,将需要的ruby gems安装到vendor/bundle目录;

6. cache-hitactions/cache的输出参数。获取缓存命中的结果。

  1. key不匹配现有缓存时,则被称为缓存错过,在job成功完成时将创建一个新缓存。发生缓存错过时,操作将搜索restore-keys设置的替代键值。

7. --jobs 4 --retry 3,并行安装ruby gems。如果当前有网络问题,将尝试3次。

ruby/setup-ruby

如果使用ruby/setup-ruby来管理gem缓存和ruby版本就更加直观和简洁。首先,在Githubfork Kingfisher到自己的仓库。把.github/workflows中的build.ymal修改为:

代码语言:javascript
复制
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版本。相对来说就可以避免手动设置缓存时带来的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HelloCoder全栈小集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档