以可预测和可重复的方式构建现代软件并非易事。大量的软件依赖关系以及隔离冲突组件的需求,在管理构建环境方面提出了诸多挑战。
尽管有许多工具旨在缓解这一挑战,但大多数工具都采取两种方法:要么依赖包管理器来保存和复制包集合,要么使用具有预配置环境的虚拟机或物理机。
这两种方法都有缺陷。包管理器无法为具有冲突构建依赖关系的组件提供单一环境,而单独的机器则很笨重,并且无法提供无缝的用户体验。
为了解决这些问题,我们需要一个系统,该系统能够在同一台机器上管理多个不可变的构建环境;在开发、持续集成 (CI) 和测试中使用相同的环境;在团队成员之间轻松共享环境;并跟踪环境 版本。
我认为 Rebuild 符合这些标准,非常适合为源代码建立构建基础设施。Rebuild 是一个新的开源管理框架,允许用户创建和共享快速、隔离且不可变的构建环境,这些环境可以在本地使用,也可以作为 CI 系统的一部分使用。
以下是如何使用 Rebuild 简化软件开发的方法。
安装客户端
Rebuild 在 RubyGems.org 上可用。其客户端需要 Docker Engine 1.9.1 或更高版本以及 Ruby 2.0.0 或更高版本。
要安装,请执行此命令
gem install rbld
要测试您的安装,请执行此命令
rbld help
搜索现有环境
Rebuild 可以简化嵌入式工具链的使用。默认情况下,Rebuild 配置为与 Docker Hub 作为环境存储库一起使用,我们已经在那里准备好了现成的环境。
Rebuild 的工作流程是:
- 在其环境存储库中搜索所需的环境。
- 在本地部署环境(每个特定环境版本执行一次)。
- 运行 Rebuild。
如果需要,您可以修改、提交和发布修改后的环境到注册表,同时跟踪不同的环境版本。
要搜索环境,请执行此命令
$ rbld search
返回
Searching in /RebuildRepository...
bb-x15:16-05
rpi-raspbian:v001
然后,通过输入以下命令将环境部署到本地机器
$ rbld deploy rpi-raspbian:v001
返回
Deploying from /RebuildRepository...
Working: |---=---=---=---=---=---=---=---=---=---=---=---=-|
Successfully deployed rpi-raspbian:v001
接下来,使用 Rebuild 编译您的代码。进入包含代码的目录并运行
$ rbld run rpi-raspbian:v001 -- make
当然,您可以使用任何其他构建代码的命令。您还可以在交互模式下使用您的环境。只需运行以下命令
$ rbld run rpi-raspbian:v001
然后从环境内部执行必要的命令。Rebuild 将处理位于本地文件系统上的构建结果的文件权限和所有权。
创建环境
上面的示例使用了现成的 Raspbian 环境;让我们看看它是如何创建的。
首先克隆 SDK
git clone git://github.com/raspberrypi/tools.git rpi-tools
然后使用基础镜像创建初始 Rebuild 环境
rbld create --base ubuntu:16.04 rpi-raspbian
通过运行以下命令修改环境
rbld modify rpi-raspbian:initial
这允许用户在交互模式下修改环境。
运行以下命令安装 Make
sudo apt-get update
sudo apt-get install -y make
复制工具链并配置环境变量
TOOLCHAIN=gcc-linaro-arm-linux-gnueabihf-raspbian-x64
sudo cp -r rpi-tools/arm-bcm2708/$TOOLCHAIN /
echo export CC=/$TOOLCHAIN/bin/arm-linux-gnueabihf- | sudo tee -a /rebuild/rebuild.rc
现在环境设置已完成,按 Ctrl+D 退出交互式 shell。
让我们提交更改并删除初始环境
rbld commit rpi-raspbian --tag v001
rbld rm rpi-raspbian:initial
运行
rbld list
您应该看到您的环境,它已准备好使用
rpi-raspbian:v001
探索 Rebuild
要了解有关 Rebuild 的更多信息,请运行 rbld help。您还可以在项目的 GitHub 页面上查看 Rebuild 的 源代码 和 文档,以及下载 Rebuild 命令的便捷 速查表。
在洛杉矶的开源峰会上,在 Yan Vugenfirer 和 Dmitry Fleytman 的演讲 Linux 容器如何帮助管理 IoT 和嵌入式系统的开发环境 中了解更多信息。
1 条评论