使用 Packer 和 Vagrant 的持续交付或持续集成工作流程

Continuous delivery or continuous integration workflow with Packer and Vagrant

我是 C#/Asp.Net Windows 开发人员,我对持续交付在 .Net/Windows 世界中的适用性很感兴趣。

目前让我感到困惑的是我们实际使用 Packer 和 Vagrant 的方式。

以下是我对 CD 和打包机的理解:

  1. Packer 可用于获取您的基础 .iso 并使用一组配置程序构建输出映像(设备)。

    根据我的理解,此图像应被视为具有已部署基础架构(IIS、SqlServer)的环境图像,尽可能匹配生产环境 + 您交付给客户的已部署网站。

  2. 根据持续交付方法,您的目标应该是尽快获得有关您的 code/configuration 的反馈。

    正如您应该 运行 在接近生产环境的冒烟+功能+非功能测试一样,您应该使用此图像作为他们的目标。 这意味着在构建映像、部署基础设施、部署网站后,您将获得功能测试的结果。 在通过所有测试之前,设备不会被视为有效并可以使用。 但这与快速反馈规则相矛盾 - 测试在管道中 运行 较晚,因为实际上依赖于构建的图像并且构建它需要很长时间。

  3. 当你交付时,你可以在真正的硬件而不是 Packer 上从头开始使用你的配置器和 运行 它们,或者你可以以某种方式使用图像本身(运行 作为虚拟服务器)

所以我看到工作流程可以是这样的:

  1. 开发人员从主线检出源代码。
  2. Vagrant 文件位于源代码管理之下。它包含基本映像的名称(例如位于文件共享上)+ 供应商集。
  3. 开发人员使用 msbuild 构建代码。
  4. 然后他运行照常进行单元测试。
  5. 然后他 运行 网站。他第一次需要 运行 vagrant up 并构建图像(需要很长时间)。安装 OS,配置基础设施,然后部署网站。之后,他获得了类似生产环境的本地副本,其中部署了从当前代码构建的网站。
  6. 不清楚他是如何调试他的代码的...
  7. 如果需要,他 运行s some/all functional/non-functional 测试。

还有两个步骤:

  1. 在他制作本地 change/takes 来自 SCM 的最新代码后,他再次 运行 整个循环(但可能提供脚本会注意到其中一些不应该应用)!

  2. 当他需要更改配置时,他会更改配置脚本并重新运行整个周期。

构建服务器的工作原理类似,但它使用加壳器构建结果图像,并可能使用 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 世界并且应用相同的工作流程,它工作正常。

  1. 我有一个构建 centos 映像的加壳模板,无需自定义(它创建 OS,添加我们的自定义用户...)

  2. 我有 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
    
  3. 我有部署脚本 运行 每次启动 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 供应商,这会中断我的流程,因为我正在使用初始供应商和供应商 运行 总是