我如何创建一个完全可丢弃的构建环境?

我如何创建一个完全可丢弃的构建环境?

假设我全新安装了一个常见的 Linux 发行版。我下载了一个 tarball,其中包含我想要构建和托管的 Web 应用程序的源代码。该项目有点现代,因此需要我安装 Node.js/npm 和 Ruby/gem 的系统包。我必须做npm install -g一些事情,gem install其他事情,当所有先决条件都存在时,我可以构建应用程序来生成可由 Web 服务器提供服务的文件.js.css

现在我已经构建了应用程序,我想删除为实现这一点而必须安装的所有内容 - 我不需要原始源代码、JS/CSS 编译器或现在编译到的依赖项构建工件,在某些情况下,我什至不再需要安装 Node.js/Ruby。我不打算很快重新编译代码,如果那一天到来,我只会重新安装先决条件。

我正在寻找一种简单的方法来“拆除”我必须对系统进行的所有更改来构建应用程序。也就是说,将系统返回到下载 tarball 之前的状态,但保留最终的构建工件。 (如果该过程足够通用,允许类似的工作流程用于 C/C++ 编译,那就太好了,尽管存在共享库问题。)

我研究过 chroot,它可能符合要求,但看起来确实有点矫枉过正。我还考虑过在虚拟机中构建,提取构建工件,然后简单地删除机器,但这也让我觉得效率低下。是否有某种文件系统“快照”功能可以适合这种用例,或者有一种方法可以告诉各种包管理器专门在专用的可丢弃临时目录中工作?

答案1

你有几个选择。

传统的方法是手动安装主目录中源代码中的所有内容,然后在完成后删除内容。这样做的优点是它可以在任何发行版上运行,并且如果您已经安装了一些依赖项,则可以利用系统库,但缺点是要正确构建一些东西通常很棘手。

大多数包管理器还能够安装到特定路径,通常通过命令行选项或环境变量进行设置。我确信emerge、pacman 和DNF 支持这一点,而且我很确定Zypper 也支持这一点。在处理基于 dpkg 的系统时,您还可以选择使用该debootstrap程序生成 chroot(使用它来初始化它,然后 chroot 到它并使用那里安装的包管理器来添加您需要的任何包。

还有一些特定于发行版的选项,其中最重要的两个是:

  1. 当安装在 BTRFS< 上时,SUSE 能够在包管理器事务之前和之后对系统进行快照。可以通过一些努力来实现您所要求的目标,尽管我无法帮助解释具体如何实现,因为我不经常使用 SUSE。
  2. NixOS 中使用的 Nix 包管理器允许每个用户的“配置文件”,这些配置文件本质上是可定制的已安装包集。这些可以由关联用户随意创建、修改、切换和销毁(并且您不需要 root 权限即可使用它们),从而提供了另一个快速选项来执行此操作。

答案2

简单的 chroot、容器和虚拟机并不是“大材小用”。此类任务是它们的用途之一 - 事实上,如果您想避免对系统进行不可逆转的更改,它们是必不可少的。如今,容器和虚拟机非常易于使用,因此没有理由不使用。简而言之,它们为您提供了一个与系统其他部分完全隔离的构建环境。

事实上,使用文件系统快照在主系统上升级/安装东西、构建软件,然后恢复到以前的快照是多余的。对于这项工作来说,它也太粗粒度并且有潜在危险......在任何给定时间,您的系统上都会发生很多事情,而不仅仅是编译程序(例如各种后台任务、守护进程、cron 作业等,或者您可能会下载了邮件并将其从 pop/imap 服务器中删除,或者创建/编辑了与构建此程序完全无关的文件)-全部当您恢复到以前的快照时,其中的内容将被恢复。 Fileystem 快照是一个好主意,也是一个有用的工具,但它们更适合用作良好备份和/或胖手指恢复策略的一部分,而不是用作在不同操作环境之间动态切换的方式。

大多数容器和虚拟机管理系统(例如docker,,,,,lxc等等virshvirt-manager可以轻松地以全新状态重新启动每次运行,以便您每次都以完全相同的原始构建环境开始。 VM 磁盘映像通常以可快照和克隆的格式存储(例如,qcow2ZFS zvol。甚至可以复制原始磁盘映像文件并可选择压缩)。您可以对 chroot 执行相同的操作,但您必须删除 chroot 并自行重新创建它(例如,使用 chroot 的 .tar.gz 存档)。

一个相当基本的设置和构建过程将启动 chroot、容器或虚拟机。这可以是您根据每个构建作业的需要进行配置的通用构建环境,也可以是预先配置为仅构建一个特定程序的环境。然后你用它来构建你的软件,最后将其复制到它将运行的地方(和/或为你的发行版构建一个包 - 如果这看起来工作量太大,请尝试一下检查安装)。

docker特别是有一些很好的工具,可以自动创建完美的构建容器和/或基于通用容器定制特定的构建容器。

还可以自动化启动虚拟机或容器、向其发送作业进行编译、然后再次将其拆除的整个过程。这个想法有许多现有的实现,通常称为构建机器人(有一个流行的 GPL python 程序称为buildbot,但其名称、想法和工作实现早在 2003 年首次编写之前就已存在)。构建机器人是核心部分持续集成(CI)。顺便说一句,说到 CI,开源GitLab是一个非常好的工具,允许您运行自己的类似 github 的源代码存储库和问题跟踪器,并结合各种 CI 相关任务,例如自动构建、测试和部署。

综上所述,并回答您的问题:有很多很多方法可以满足create a completely discardable build environment您的要求,其中许多方法都可以为各种 Linux 发行版预先打包(但您仍然需要了解它们的工作原理和配置)。困难的部分是准确确定您的意思、您需要什么功能以及您希望其中多少功能实现自动化。

当然,另一个重要因素是值得为此花费多少时间/精力 - 例如,对于家庭软件实验室、小公司或初创公司来说,这是帮助您完成工作但雇主认为不需要的工具或者是整个开发团队或整个公司的大项目?


PS:如果您想知道为什么我提供的所有链接都是维基百科,而不是直接链接到特定软件项目或公司页面,那是因为这个答案更多的是概念性概述,而不是特定软件的推荐。维基百科页面具有直接链接,更重要的是,它们具有指向类似软件、软件比较页面以及许多相互关联的概念的链接。这不是一个简单的主题,只有一个容易学习的答案。您知道的越多,就越容易做出适合您特定要求的正确决策。

相关内容