使用 Packer 和 Vagrant 的持续交付或持续集成工作流程
Continuous delivery or continuous integration workflow with Packer and Vagrant
我是 C#/Asp.Net Windows 开发人员,我对持续交付在 .Net/Windows 世界中的适用性很感兴趣。
目前让我感到困惑的是我们实际使用 Packer 和 Vagrant 的方式。
以下是我对 CD 和打包机的理解:
Packer 可用于获取您的基础 .iso 并使用一组配置程序构建输出映像(设备)。
根据我的理解,此图像应被视为具有已部署基础架构(IIS、SqlServer)的环境图像,尽可能匹配生产环境 + 您交付给客户的已部署网站。
根据持续交付方法,您的目标应该是尽快获得有关您的 code/configuration 的反馈。
正如您应该 运行 在接近生产环境的冒烟+功能+非功能测试一样,您应该使用此图像作为他们的目标。
这意味着在构建映像、部署基础设施、部署网站后,您将获得功能测试的结果。
在通过所有测试之前,设备不会被视为有效并可以使用。
但这与快速反馈规则相矛盾 - 测试在管道中 运行 较晚,因为实际上依赖于构建的图像并且构建它需要很长时间。
当你交付时,你可以在真正的硬件而不是 Packer 上从头开始使用你的配置器和 运行 它们,或者你可以以某种方式使用图像本身(运行 作为虚拟服务器)
所以我看到工作流程可以是这样的:
- 开发人员从主线检出源代码。
- Vagrant 文件位于源代码管理之下。它包含基本映像的名称(例如位于文件共享上)+ 供应商集。
- 开发人员使用
msbuild
构建代码。
- 然后他运行照常进行单元测试。
- 然后他 运行 网站。他第一次需要 运行
vagrant up
并构建图像(需要很长时间)。安装 OS,配置基础设施,然后部署网站。之后,他获得了类似生产环境的本地副本,其中部署了从当前代码构建的网站。
- 不清楚他是如何调试他的代码的...
- 如果需要,他 运行s some/all functional/non-functional 测试。
还有两个步骤:
在他制作本地 change/takes 来自 SCM 的最新代码后,他再次 运行 整个循环(但可能提供脚本会注意到其中一些不应该应用)!
当他需要更改配置时,他会更改配置脚本并重新运行整个周期。
构建服务器的工作原理类似,但它使用加壳器构建结果图像,并可能使用 vagrant 将图像用于测试。
我发现工作流有可能得到优化(在某些点进行缓存)。您可以跳过 运行ning 这一步,除非任何依赖项发生更改:
Base image (.iso) -------------------------\
|---> Base OS ready for vagrant
OS provision scripts (packer-windows) ----/
Base OS ready for vagrant -------------------\
|---> OS with IIS/Sql
Infrastructure provision scripts (IIS, Sql) --/
OS with IIS/Sql --------------\
|--------> OS with deployed Website
Built website package -------/ /
/
Deployment scripts ---------------/
Web site source code ------\
|----> Built website package
Unit tests --------------/
OS with deployed Website -------------\
|----> Ready and tested compliance
Functional/non-functional tests ----/
任何人都可以 share/recommend 使用 Packer 和 Vagrant 的高效工作流程吗?
我不确定你的问题到底是什么 - 我来自 linux/java 世界并且应用相同的工作流程,它工作正常。
我有一个构建 centos 映像的加壳模板,无需自定义(它创建 OS,添加我们的自定义用户...)
我有 puppet 配置脚本,可以创建 VM(我使用 2 个 VM)并安装 oracle/gradle/oracle/apache/weblogic...
这个步骤在VM需要初始化的时候做一次
app.vm.provision "shell", path: "puppet/script/install-puppet-modules-app.sh"
app.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "base-app.pp"
puppet.module_path = "puppet/modules"
puppet.hiera_config_path = "puppet/hiera.yaml"
#puppet.options = "--verbose --debug"
end
我有部署脚本 运行 每次启动 VM
app.vm.provision "shell", path: "puppet/script/run-app.sh", privileged: false, run: 'always'
关键是run: 'always'
所以你每次运行vagrant up
[=时都要确保这一步是运行 17=]
我 运行 从另一个 VM 进行功能测试(使用 selenium)(我有一个集线器机器和 windows 安装了浏览器的客户端机器)所以我只在我准备好 运行 测试
我的约束条件:
我需要 运行 vagrant up
指定需要启动的机器,因为我 运行 2 个虚拟机用于应用程序服务器 (app+db) 和2 个用于测试的其他 VM(selenium hub+windows)。我的应用程序服务器只有 1 个虚拟机,您可以使用 primary
选项,它可以避免等待并占用您不使用的资源
我想好好利用一下vagrant snapshot feature, however I face an issue。如果我拍摄快照,我需要 运行 全部或 none 供应商,这会中断我的流程,因为我正在使用初始供应商和供应商 运行 总是
我是 C#/Asp.Net Windows 开发人员,我对持续交付在 .Net/Windows 世界中的适用性很感兴趣。
目前让我感到困惑的是我们实际使用 Packer 和 Vagrant 的方式。
以下是我对 CD 和打包机的理解:
Packer 可用于获取您的基础 .iso 并使用一组配置程序构建输出映像(设备)。
根据我的理解,此图像应被视为具有已部署基础架构(IIS、SqlServer)的环境图像,尽可能匹配生产环境 + 您交付给客户的已部署网站。
根据持续交付方法,您的目标应该是尽快获得有关您的 code/configuration 的反馈。
正如您应该 运行 在接近生产环境的冒烟+功能+非功能测试一样,您应该使用此图像作为他们的目标。 这意味着在构建映像、部署基础设施、部署网站后,您将获得功能测试的结果。 在通过所有测试之前,设备不会被视为有效并可以使用。 但这与快速反馈规则相矛盾 - 测试在管道中 运行 较晚,因为实际上依赖于构建的图像并且构建它需要很长时间。
当你交付时,你可以在真正的硬件而不是 Packer 上从头开始使用你的配置器和 运行 它们,或者你可以以某种方式使用图像本身(运行 作为虚拟服务器)
所以我看到工作流程可以是这样的:
- 开发人员从主线检出源代码。
- Vagrant 文件位于源代码管理之下。它包含基本映像的名称(例如位于文件共享上)+ 供应商集。
- 开发人员使用
msbuild
构建代码。 - 然后他运行照常进行单元测试。
- 然后他 运行 网站。他第一次需要 运行
vagrant up
并构建图像(需要很长时间)。安装 OS,配置基础设施,然后部署网站。之后,他获得了类似生产环境的本地副本,其中部署了从当前代码构建的网站。 - 不清楚他是如何调试他的代码的...
- 如果需要,他 运行s some/all functional/non-functional 测试。
还有两个步骤:
在他制作本地 change/takes 来自 SCM 的最新代码后,他再次 运行 整个循环(但可能提供脚本会注意到其中一些不应该应用)!
当他需要更改配置时,他会更改配置脚本并重新运行整个周期。
构建服务器的工作原理类似,但它使用加壳器构建结果图像,并可能使用 vagrant 将图像用于测试。
我发现工作流有可能得到优化(在某些点进行缓存)。您可以跳过 运行ning 这一步,除非任何依赖项发生更改:
Base image (.iso) -------------------------\
|---> Base OS ready for vagrant
OS provision scripts (packer-windows) ----/
Base OS ready for vagrant -------------------\
|---> OS with IIS/Sql
Infrastructure provision scripts (IIS, Sql) --/
OS with IIS/Sql --------------\
|--------> OS with deployed Website
Built website package -------/ /
/
Deployment scripts ---------------/
Web site source code ------\
|----> Built website package
Unit tests --------------/
OS with deployed Website -------------\
|----> Ready and tested compliance
Functional/non-functional tests ----/
任何人都可以 share/recommend 使用 Packer 和 Vagrant 的高效工作流程吗?
我不确定你的问题到底是什么 - 我来自 linux/java 世界并且应用相同的工作流程,它工作正常。
我有一个构建 centos 映像的加壳模板,无需自定义(它创建 OS,添加我们的自定义用户...)
我有 puppet 配置脚本,可以创建 VM(我使用 2 个 VM)并安装 oracle/gradle/oracle/apache/weblogic... 这个步骤在VM需要初始化的时候做一次
app.vm.provision "shell", path: "puppet/script/install-puppet-modules-app.sh" app.vm.provision :puppet do |puppet| puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "base-app.pp" puppet.module_path = "puppet/modules" puppet.hiera_config_path = "puppet/hiera.yaml" #puppet.options = "--verbose --debug" end
我有部署脚本 运行 每次启动 VM
app.vm.provision "shell", path: "puppet/script/run-app.sh", privileged: false, run: 'always'
关键是run: 'always'
所以你每次运行vagrant up
[=时都要确保这一步是运行 17=]
我 运行 从另一个 VM 进行功能测试(使用 selenium)(我有一个集线器机器和 windows 安装了浏览器的客户端机器)所以我只在我准备好 运行 测试
我的约束条件:
我需要 运行
vagrant up
指定需要启动的机器,因为我 运行 2 个虚拟机用于应用程序服务器 (app+db) 和2 个用于测试的其他 VM(selenium hub+windows)。我的应用程序服务器只有 1 个虚拟机,您可以使用primary
选项,它可以避免等待并占用您不使用的资源我想好好利用一下vagrant snapshot feature, however I face an issue。如果我拍摄快照,我需要 运行 全部或 none 供应商,这会中断我的流程,因为我正在使用初始供应商和供应商 运行 总是