Continuous integration 八达通和持续集成-什么';什么时候应该创建发行版是最佳实践?

Continuous integration 八达通和持续集成-什么';什么时候应该创建发行版是最佳实践?,continuous-integration,octopus-deploy,Continuous Integration,Octopus Deploy,在当前的一个项目中,我们正在使用Teamcity和Octopus来构建和部署我们的IIS应用程序 我们有4个环境。CI环境(基于签入的自动构建、运行单元测试和自动QA测试)以及QA、UAT和Prod环境(我们使用八达通手动推送) 在本地(dev)构建中,默认构建脚本直接推送到本地Octopus实例进行测试 更好的做法是让CI构建(运行非常频繁)遵循与本地构建类似的模型(并直接推送到触手实例,而不是通过主实例),还是通过Octopus服务器(每次构建时都需要创建新版本) 你的问题似乎有关联,但我不

在当前的一个项目中,我们正在使用Teamcity和Octopus来构建和部署我们的IIS应用程序

我们有4个环境。CI环境(基于签入的自动构建、运行单元测试和自动QA测试)以及QA、UAT和Prod环境(我们使用八达通手动推送)

在本地(dev)构建中,默认构建脚本直接推送到本地Octopus实例进行测试


更好的做法是让CI构建(运行非常频繁)遵循与本地构建类似的模型(并直接推送到触手实例,而不是通过主实例),还是通过Octopus服务器(每次构建时都需要创建新版本)

你的问题似乎有关联,但我不认为有关联,所以我将把这个答案分成两部分

第一部分

我想说,根据包的大小和每个构建(包括自动单元/qa测试)的时间,您有两个选择:

  • 对每个生成执行连续部署,并使用Octo.exe自动部署每个生成
  • 在给定的时间进行夜间构建,比如说,使用Octo.exe再次在本地时间进行7p或8p的构建
  • 我认为至少应该部署到您的CI和QA环境中。只有测试人员测试最新的部署才有意义

    我提到包大小的原因是,如果您每天要进行15-20次构建,并通过所有单元测试生成50MB以上的包,那么如果您不小心的话,最终可能会对构建进行排队。及时性是一个因素。如果每次签入都需要20分钟来构建、打包、推送和部署,那就可以了。但是一天20分钟x N#的签入时间,你可能会在一天的中间对构建进行排队。更不用说存储可能(慢慢地)成为一个问题(或缺乏存储)。我不知道你项目的所有细节,但请记住这些因素

    无论您想做什么,都必须使用Octo.exe。如果要执行#1(连续部署),可以编写一个简单的Powershell脚本,在将构建步骤和包推送到您选择的nuget服务器后执行Octo.exe命令。对于命令,您只需告诉八达通获取最新的包

    如果您想执行夜间构建选项,您可以执行相同的操作(脚本方面),除了不更改TeamCity以运行另一个脚本之外,您可以在Windows服务器上安排一个任务,以便在特定时间运行该脚本。这将是最谨慎的选择,但从这切换到连续部署选项并不困难

    第二部分

    至于直接从服务器或直接从NuGet服务器获取包,这应该无关紧要。我会记住一些东西,这些东西会引导你选择一个而不是另一个

    • 考虑到你的软件包大小——软件包越大,我认为直接使用nuget服务器是最好的选择,只是出于对八达通IO负载的考虑。很可能,这没什么大不了的

    • 每个环境中的服务器数—尤其是在每个环境中有多台服务器的情况下。默认情况下,Octopus尝试进行并行部署,但您可以切换到“滚动”部署(设置一次要部署到的特定服务器)。如果您正在为每次签入进行连续部署,那么每个触手都必须下载最新的软件包。同样,根据包的大小和要推到的触角的数量,您可能会遇到一些带宽问题。同样,我不知道您的环境中有多少台服务器,所以您确实知道什么是最好的

    • 是否有其他团队使用八达通服务器?我之所以这么问,是因为如果你是唯一一支球队,那么你真的不必担心每只触手是如何得到包裹的。直接从nuget服务器与八达通服务器进行比较并不重要

    以下是Octo.exe文档的URL:它是您将构建完全自动化到所需环境的最好朋友

    无论您选择什么,我强烈建议您自动化部署。时期实现自动化后,您会想知道为什么要费心手动部署。请记住,octo.exe不需要在octopus服务器上运行

    Octo.exe使用Octopus API并与所述API进行通信。因此,您可以从任何可以访问八达通服务器的机器上测试Octo.exe命令。最好在你的桌面上尝试一下,一旦你做对了,然后把它放到一个脚本中并测试它


    因此,为了明确何时需要创建发布,这是非常主观的,因为八达通内的项目可以部署一个或多个NuGet软件包,所以会根据具体情况而有所不同。这就是说,我认为需要对您的发布版本进行一些确认,这不可避免地会将您的二进制文件和Nuget软件包的版本控制也带进竞技场

    示例:如果您的测试人员严重依赖TFS变更集编号,那么最好将该变更集编号嵌入到您的二进制文件中(通过AssemblyVersionInfo),并让您的NuGet软件包反映该版本(在您的NuSpec中),然后让Octopus为您的发行版使用NuGet软件包版本控制。好极了。您的发布版本可以显示您的变更集编号!令人惊叹的。除非您的项目部署了多个NuGet包。那么,哪个包作为整个部署的版本呢?当每个项目和部署过程都有多个NuGet包时,事情就会变得非常棘手。这就是为什么Octopus中的另一个版本控制机制(又名变量模板)通常最适合每个人

    请记住,八达通内部促销的概念也是一个重要的概念
      <files>
        <file src="obj\**\*.*" exclude="obj\octopacking\**\*.*;obj\octopacked\**\*.*;obj\Release\Package\**\*.*;**\*.pdb;**\*.ps1;**\*.dll.config;**\*.loadtest;_DeveloperNotes;_PublishedWebsites" target="obj"/>
        <file src="Deploy.ps1" />
      </files>
    
    [string[]]$params = @(
                "-setParam:name='IIS Web Application Name',value='" + $iisapplicationname + "'",
                "-skip:Directory=^" + $iisapplicationname + "\\App_Data",           
                "-skip:File=.config$",
                "-skip:File=.cmd$",
                "-skip:File=.ps1$"
    
                )
    $msdeployArgs = [string]::join(' ', $params)
    
    if ($OctopusEnvironmentName -ceq 'Development')
    {
    
        .\obj\Release\Myproject.Deploy.cmd /Y /M:localhost ($msdeployArgs) | Write-Output
    }
    else
    {
        .\obj\Release\Myproject.Deploy.cmd /Y /M:localhost ($msdeployArgs) | Write-Output
    }
    
    call "C:\Scripts\JenkinsciDeploy.bat" Myproject %VERSION%-dev OctopusProjectName Development %BUILD_NUMBER% %JOB_NAME%
    
    cd C:\Scripts
    
    Octo.exe create-release --project %3 --version %2 --packageversion %2 --server http://octopus.yourdomain.com --apiKey API-xxxxxxxxxxx --deployto %4 --progress --force --guidedfailure=False --waitfordeployment --deploymenttimeout=00:30:00 --releaseNotes "Jenkins build [%5] http://jenkins.yourdomain.com:8080/job/%6/%5"