Travis CI在指定位置缓存单个文件

时间:2018-05-23 15:54:33

标签: caching bundler travis-ci

我正在使用Travis CI构建一个Ruby项目,我使用Gemfile和Bundler来管理依赖项。我的.travis.yml只包含一行关于缓存的内容:

cache: bundler

我在其他地方(Travis的默认install命令,缓存目录以及上传缓存之前的额外bundle clean)依赖于此。

默认情况下,Gemfile.lock未缓存。我想缓存它以使Bundler跳过依赖项解析并使用缓存的Gemfile.lock。我还没有找到有效的解决方案。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我注意到this question下的唯一评论并提出了一个想法,但我认为它更像是一种解决方法,而不是解决方案。

Gemfile.lock阶段从 /tmp/cached复制before_install Gemfile.lock阶段的副本/tmp/cached before_script。这样它将由Travis CI缓存,Bundler将使用缓存。

我仍在寻找真正的解决方案。

答案 1 :(得分:0)

Travis' cacher implementation的AFAICS,

  • 如果您在cache: directories:下指定文件名而不是目录名,它将起作用。 1

一个警告:

  • 最初,当没有缓存时(因此该文件尚不存在),缓存还原步骤将使用该名称创建一个空的目录
    • 您需要在构建的早期阶段手动检测并删除此目录

示例.travis.yml(使用evvar作为文件的路径,以避免在各处重复它):

env:
  global:
    - FILE=<path>
cache:
  directories:
    - $FILE
before_install:
  - if [[ -d $FILE ]]; then rm -rf "$FILE"; fi

# create and/or use the file

1 这是因为他们使用tar来创建和提取缓存档案,而tar不在乎是否向其传递文件或目录