我有一个Travis CI osx
版本,其中brew
依赖关系必须从源代码构建。
我知道Travis具有cache
功能,但它没有关于如何缓存brew
构建或输出的任何文档。
如何在travis中缓存brew
包?
答案 0 :(得分:11)
您可以将brew缓存目录添加到travis缓存中:
cache:
directories:
- $HOME/Library/Caches/Homebrew
据我所知,travis不支持开箱即用的自制缓存。
答案 1 :(得分:9)
此处存在3个松散相关的独立问题:
您不一定需要全部三个,所以请遵循适合您需要的任何部分。
将$HOME/Library/Caches/Homebrew
添加到Travis的缓存(实际上,应该使用brew --cache
检索此路径,但是不能在这里调用它)
cache:
directories:
- $HOME/Library/Caches/Homebrew
在brew cleanup
阶段运行before_cache
-否则,随着新软件包版本的发布,缓存将无限期增长
before_cache:
- brew cleanup
full code太长,无法在此处列出,因此请提供算法。
这是上一节的补充。如果不使用它,则在安装时在 步骤中将本地瓶保存在Homebrew缓存之外的某个位置,并将其添加到下面的缓存中在下面的启动时步骤中使用适当的名称。
安装时:
brew deps
递归检查软件包的依赖关系
(bottled)
输出中没有brew info <pkg>
),请在--include-build
中加入构建依赖项对于每个程序包和依赖项,
brew list --versions <pkg>
成功)和最新版本(brew outdated
不存在),请跳过brew unlink
旧版本,如果它不是仅用于小桶([keg-only]
输出中没有brew info
)brew install
调用所有--force
brew install
就可以了如果没有瓶子,
构建并安装with the following sequence:
brew install --build-bottle <pkg>
brew bottle --json <pkg>
brew uninstall --ignore-dependencies <pkg>
brew install <bottle>
(似乎没有任何官方方法来获取生成的瓶子和JSON文件的名称。我从brew bottle
输出中获取了瓶子的名称,并从中推断出JSON文件名。)
将瓶子信息添加到包装的公式中
brew bottle --merge --write <json file>
以brew --cache <pkg>
$HOME/Library/Caches/Homebrew
中的下载文件进行符号链接。您无需这样做。) 启动时:
brew update
brew info --json=v1 <pkg>
和brew info --json=v1 <bottle>
的输出)。
brew --cache
来获取瓶子的路径,因此需要单独保存它。在撰写本文时,符号链接尚未保存在Travis的缓存中,因此我最终使用了保存路径的常规文件。 brew --cache <pkg>
是否仍然指向您的瓶子。 在before_cache
:
brew cleanup
,请在运行之前从缓存中保存本地构建的瓶子文件,因为cleanup
可能会删除这次不需要的文件。 cleanup
之后,恢复已删除的内容。如果您运行brew update --verbose
(并确保.travis.yml
中没有秘密变量或您的Travis项目设置-brew
仅在{{1 }}是tty)-您将看到完全构成Homebrew自更新操作的内容-因此应缓存的内容:
stdout
插入)放入实际上为rebase
存储库的几个路径中:
git
-自制程序本身/usr/local/Homebrew
-已安装的水龙头/usr/local/Homebrew/Library/Taps/*/*
迁移到Taps/caskroom/homebrew-cask
,并在Taps/homebrew/homebrew-cask
上创建一个副本。如果被缓存,则该副本将在下次运行时导致“错误:文件存在”。 Taps/homebrew/homebrew-cask/homebrew-cask
因此,操作将是:
将Taps/homebrew/homebrew-versions
添加到Travis缓存
/usr/local/Homebrew
脚本可能会影响系统的其他任意部分,因此每次应从(缓存的)瓶子安装新的软件包版本,而不是缓存结果。无论如何,安装瓶子只需要几秒钟。 在postinstall
之前:清理Homebrew代码库
brew update
,请删除Taps/caskroom/homebrew-cask
目录Taps/homebrew/homebrew-cask
下找到所有git
仓库(/usr/local/Homebrew
,得到find -type d -name .git
)并在每个仓库中运行dirname
以摆脱Travis的剩余物git clean -fxd
从剩菜中清除Homebrew缓存(如果与上一节结合使用,请参阅此处以了解其他操作)-否则,{{1}中会出现很多错误}在“正在迁移缓存条目...” 阶段。 在brew cleanup
:
brew update
-它会自动解决与带有瓶子信息的本地提交的任何可能的冲突重新添加本地瓶子时(如果与上一节结合使用):
brew update
将结果删除。没有任何备用方法,因此您必须使用脚本来解析和编辑公式文件,并从brew update --merge
表中删除相应的行。公式文件的路径是使用git commit
检索的。安装时:
如果使用第三方水龙头,请始终检查是否已安装该水龙头:
bottle do
由于符号链接未保存在Travis缓存中,因此可能不会记住引脚。但是,对它们进行检查也不会造成伤害:
brew formula <pkg>
在brew tap | grep -qxF <tap> || brew tap <tap>
:
brew tap --list-pinned | grep -qxF <tap> || brew tap-pin <tap>
(如果存在)答案 2 :(得分:1)
要缓存实际已编译的依赖项而不是缓存源tarball或ccaching目标文件,请将相应软件包的Cellar
和opt
目录添加到缓存中,并使用适当的before_install检查似乎可行很好。
您还可以添加所有/usr/local/Cellar/
和/usr/local/opt/
,但这将添加所有已安装的自制程序包,而不是仅添加所需的程序包。
依赖opensl,libevent和check的项目中的示例:
cache:
directories:
- /usr/local/Cellar/openssl
- /usr/local/opt/openssl
- /usr/local/Cellar/libevent
- /usr/local/opt/libevent
- /usr/local/Cellar/check
- /usr/local/opt/check
before_install:
- test -d /usr/local/opt/openssl/lib || { rmdir /usr/local/opt/openssl; brew install openssl; }
- test -d /usr/local/opt/libevent/lib || { rmdir /usr/local/opt/libevent; brew install libevent; }
- test -d /usr/local/opt/check/lib || { rmdir /usr/local/opt/check; brew install check; }
rmdir
是必需的,因为TravisCI会创建缓存的目录(如果不存在),而brew install
会失败,如果/usr/local/opt/$package
是目录(与指向特定已安装目录的符号链接相反)版本)。出于同样的原因,test
测试一个子目录,而不是主程序包目录。
请注意,这种方法要求您自己的项目能够提取/usr/local/opt
中安装的依赖项。
答案 3 :(得分:0)
Homebrew允许您从源代码构建:
brew install --build-from-source [package-name]
如果你想为Travis缓存你的自制软件,我看到如何做到这一点的唯一方法就是创建一个你想要的自制依赖项的压缩版本,类似于this example,travis.yml
答案 4 :(得分:0)
以下内容应缓存编译器结果:
cache:
ccache: true
directories:
- $HOME/Library/Caches/Homebrew
在OSX上Travis目前似乎没有默认发布ccache =&gt;在使用ccache之前,还必须完成以下操作:
before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ccache; fi
不可否认,已完成的构建仍未缓存。但是每个单独的计时器运行的构建结果都会导致,因此构建过程中至少有很大一部分可以算作“缓存”。
答案 5 :(得分:0)
要缓存brew update
元数据,请only need to cache .git
中的/usr/local/Homebrew
文件夹
其他人阅读的Travis配置:
cache:
directories:
- $HOME/Library/Caches/Homebrew
- /usr/local/Homebrew
before_cache:
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then brew cleanup; fi
# Credit https://discourse.brew.sh/t/best-practice-for-homebrew-on-travis-brew-update-is-5min-to-build-time/5215/9
# Cache only .git files under "/usr/local/Homebrew" so "brew update" does not take 5min every build
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then find /usr/local/Homebrew \! -regex ".+\.git.+" -delete; fi