首页 文章

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

提问于
浏览
1

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

目前令我困惑的是我们应该如何与Packer和Vagrant合作 .

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

  • Packer可用于获取您的基础.iso并使用一组供应商构建输出图像(设备) .

根据我的理解,此图像应被视为环境图像,已部署的基础结构(IIS,SqlServer)尽可能地匹配已部署的网站,并将其提供给您的客户 .

  • 根据持续交付方法,您应该尽可能快地获得有关您的代码/配置的反馈 .

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

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

所以我看到工作流程可能如下:

  • 开发人员从主线检出源代码 .

  • Vagrant文件位于源代码管理下 . 它包含基本映像的名称(例如,位于文件共享上)的配置器集 .

  • 开发人员使用 msbuild 构建代码 .

  • 然后他像往常一样进行单元测试 .

  • 然后他运行网站 . 他第一次需要运行 vagrant up 并且图像被构建(需要很长时间) . 安装操作系统,配置基础架构,然后部署网站 . 之后,他获得了使用当前代码构建的部署网站的类似 生产环境 环境的本地副本 .

  • 不清楚他如何调试他的代码......

  • 如果需要,他会运行一些/所有功能/非功能测试 .

还有两个步骤:

  • 在他进行本地更改/从SCM获取最新代码后,他再次运行整个周期(但是可能提供脚本会注意到其中一些不应用)!

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

构建服务器的工作方式类似,但它使用打包程序来构建结果图像,并且可能使用vagrant来将图像带到现场进行测试 .

我发现可以优化工作流程(在某些时候缓存) . 您可以跳过运行该步骤,除非任何依赖项发生更改:

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   ----/

任何人都可以分享/推荐使用Packer和Vagrant的高效工作流程吗?

1 回答

  • 1

    我不确定你的问题到底是什么 - 我来自linux / java世界并且应用相同的工作流程,它工作正常 .

    • 我有一个打包器模板,可以构建没有自定义的centos图像(它创建操作系统,添加我们的自定义用户......)

    • 我有创建虚拟机的木偶配置脚本(我使用2个虚拟机)并将安装oracle / gradle / oracle / apache / weblogic ...当需要初始化虚拟机时,此步骤完成一次

    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

    我从另一个VM运行功能测试(使用selenium)(我有一个集线器机器和安装了浏览器的Windows客户机)所以我只有在我准备运行测试时才会触发这些

    我有的限制:

    • 我需要运行 vagrant up 指定哪些机器需要启动,因为我为应用服务器(app db)运行2个VM,为测试运行2个其他VM(selenium hub窗口) . 我只有1个用于app服务器的VM,你可以使用 primary 选项,它可以避免等待并占用你不使用的资源

    • 我想利用vagrant snapshot功能,但我面对issue . 如果我拍摄快照,我需要运行所有或没有任何破坏我流量的配置器,因为我使用初始配置器和配置器来运行

相关问题