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

时间:2016-07-08 13:38:35

标签: windows continuous-integration vagrant packer continuous-delivery

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

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

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

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

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

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

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

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

  4. 所以我看到工作流程如下:

    1. 开发人员从主线检查源代码。
    2. Vagrant文​​件位于源代码管理下。它包含基本映像的名称(例如,位于文件共享上)+配置器集。
    3. 开发人员使用msbuild
    4. 构建代码
    5. 然后他像往常一样进行单元测试。
    6. 然后他运行网站。他第一次需要运行vagrant up并且图像构建(需要很长时间)。安装操作系统,配置基础架构,然后部署网站。之后,他获得了使用当前代码构建的已部署网站的类似生产环境的本地副本。
    7. 不清楚他是如何调试他的代码的......
    8. 如果需要,他会运行部分/全部功能/非功能测试。
    9. 还有两个步骤:

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

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

      3. 构建服务器的工作方式类似,但它使用打包器来构建结果图像,并且可能使用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 个答案:

答案 0 :(得分:1)

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

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

  2. 我有创建虚拟机的木偶配置脚本(我使用2个虚拟机)并将安装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. 我有每次启动虚拟机时运行的部署脚本

    app.vm.provision "shell", path: "puppet/script/run-app.sh", privileged: false, run: 'always'
    
  4. 密钥为 run: 'always' ,因此您确保每次运行vagrant up

    时都会运行此步骤

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

    我的约束:

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

    • 我想利用vagrant snapshot功能,但我面临issue。如果我拍摄快照,我需要运行全部或不运行任何会破坏我流量的供应商,因为我使用初始供应商和供应商始终运行