macos - Cache Brew使用travis ci构建

标签 macos homebrew travis-ci

我有一个Travis CI osx构建,其brew依赖关系必须从源代码构建。

我知道Travis具有cache功能,但是它没有有关如何缓存brew构建或输出的任何文档。

关于如何在travis中缓存brew包的任何想法?

最佳答案

这里存在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缺少),请跳过它
  • 如果存在旧版本,请在以下步骤中使用you'll need to install the new version alongside the old one:
  • 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>给出的适当名称将瓶子文件保存到Travis缓存中
  • 仅在添加瓶子信息之后执行此操作-否则,您将获得源包的路径。
  • (Homebrew也以$HOME/Library/Caches/Homebrew形式链接到下载的文件。您不需要这样做。)
  • 保存JSON文件以供以后使用。确保将其位置添加到Travis缓存中。
  • 在启动时:
  • 如果要转到
  • ,请执行brew update
  • 浏览已保存的.json文件。对于每一个,检查本地瓶子是否仍然合适(通过比较版本和重建编号;您可以为此数据解析brew info --json=v1 <pkg>brew info --json=v1 <bottle>的输出)。
  • 如果不删除缓存的瓶子和.json
  • 由于此时您将无法使用brew --cache获取到瓶子的路径,因此需要独立保存它。在撰写本文时,符号链接(symbolic link)尚未保存在Travis的缓存中,因此我最终使用了包含路径的常规文件。
  • 如果是,将瓶子信息重新添加到上述公式中
  • 他们不太可能更改公式中的下载URL而不会改变版本-瓶子的预期缓存名称将发生更改,因为其中的哈希是下载URL的哈希。为此,请在添加信息后检查brew --cache <pkg>是否仍指向您的瓶子。
  • before_cache上:
  • 如果您正在使用上一节中的brew cleanup,请在运行它之前将其本地构建的瓶子文件保存在缓存中的某个位置,因为cleanup可能会删除这次不需要的文件。在cleanup之后,恢复已删除的那些。

  • 缓存自制软件元数据

    (同样,full code太长,因此请给出算法。)
    如果您运行brew update --verbose(并确保.travis.yml中没有 secret 变量或您的Travis项目设置-仅当brew是tty时stdout才会打印许多状态消息)-您会看到真正构成Homebrew自更新操作的内容-因此您应该缓存的内容:
  • 将(实际上,默认是rebase)拉入实际上是git存储库的一些路径中:
  • /usr/local/Homebrew-自制本身
  • /usr/local/Homebrew/Library/Taps/*/*-已安装的水龙头
  • 浏览分接头和缓存并迁移过时的位。由于Travis缓存内容是第二次被添加到现有目录结构中而不是被替换,因此,可能由于更新过程中删除但在新VM中又存在的文件而导致奇怪的操作和错误。我目睹的:
  • 将始终尝试将Taps/caskroom/homebrew-cask迁移到Taps/homebrew/homebrew-cask,并在Taps/homebrew/homebrew-cask/homebrew-cask上创建一个副本。如果被缓存,则该副本将在下次运行时导致“错误:文件存在”。
  • 将始终尝试将许多未提交的文件导入Taps/homebrew/homebrew-versions

  • 因此,操作将是:
  • /usr/local/Homebrew添加到Travis缓存
  • 添加/ usr / local / Cellar和/ usr / local / opt是一个坏主意:首先,它们太大了,在建立和上传缓存时会超时;第二,这是不安全的'cuz postinstall脚本可能会影响系统的其他任意部分,因此应该每次从(缓存的)瓶子安装新的软件包版本,而不是缓存结果。无论如何,安装瓶子只需要几秒钟。
  • brew update之前:清理Homebrew代码库
  • 如果存在Taps/caskroom/homebrew-cask,则删除Taps/homebrew/homebrew-cask目录
  • git下找到所有/usr/local/Homebrew仓库(find -type d -name .git,获取结果的dirname),然后在每个目录中运行git clean -fxd来摆脱Travis的剩菜
  • 也可以使用brew cleanup清理剩余的Homebrew缓存(如果与上一节结合使用,请参见此处进行其他操作)-否则,“迁移缓存条目...”中的brew update会出现很多错误。 ”阶段。
  • brew update上:
  • 改为使用brew update --merge-它将使用瓶子信息
  • 自动解决与本地提交的任何可能的冲突
  • 当重新添加本地瓶子时(如果与上一节结合使用):
  • 如果瓶子信息已经存在,请不要将其重新添加到公式中
  • 如果软件包的版本已更改并且您的瓶子信息在公式中,请从公式中删除它,并用git commit结果。没有通用的方法,因此您必须使用脚本来解析和编辑公式文件,并从bottle do表中删除相应的行。使用brew formula <pkg>检索公式文件的路径。
  • 安装时:
  • 如果使用第三方水龙头,请始终检查是否已安装该水龙头:
    brew tap | grep -qxF <tap> || brew tap <tap>
    
  • 由于符号链接(symbolic link)未保存在Travis缓存中,因此可能无法记住图钉。但是检查它们也不会有伤害:
    brew tap --list-pinned | grep -qxF <tap> || brew tap-pin <tap>
    
  • before_cache上:
  • 删除Taps/homebrew/homebrew-cask/homebrew-cask(如果存在)
  • 关于macos - Cache Brew使用travis ci构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930171/

    相关文章:

    java - 如果从 OSX 应用程序包运行,ProcessBuilder 无法找到文件

    mysql - macOS 10.15 Catalina 上的 Homebrew MySQL 8.0.18 无法作为服务运行

    git - 我可以为 Travis YAML 配置命令创建 ALIAS 吗? ... "travis encrypt GITHUB_TOKEN=****** --add"?

    python - Travis 无法在 Python 3 变体中导入我的测试模块

    objective-c - NSWindow 底角为圆角

    python - 运行 python 脚本时出错 - 语法无效

    macos - 如何让 Mac Voiceover 将数字读取为数字而不是单个数字?

    macos - HomeBrew Mac 更改 Python 路径

    ruby - 无法通过 RVM 在 Mac 10.8 上安装 ruby​​ 1.8.7

    docker - travis-ci 可以运行 docker 吗?