CI / CD流程更新:章鱼部署

图片本文的第三部分是关于更新CI / CD流程。 

在这个阶段,我们(至少应该)了解CI的工作方式,输入的内容,如何从中获取结果以及需要做什么才能使构建输出成为完整的项目模块并开始使用。以及已建立的章鱼(最好是LTS)。在最后一部分中,考虑了建立团队协作的过程:从代码进入存储库到可以解压缩就绪档案的那一刻发生的所有事情,从理论上讲,它应该可以工作。

我想起目录:

第1部分:什么,为什么不喜欢,计划,有点b。我将这部分称为技术性的。
第2部分:团队合作精神。
第3部分:章鱼部署。
第四部分:幕后花絮。不愉快的时刻,对未来的计划,可能是常见问题解答。最有可能的是,它也可以称为近技术。

章鱼:一般


在输入端,我们有代码,在输出端,有汇编工件,所有内容在这里都清晰可见。但是每个模块的结果都包括两个部分:一个核心包(构建本身的结果)和一个单独的包(唯一的配置和库)。因此,为了使特定模块正常工作,我们需要以下内容:

  1. IIS中的一个实例,该实例具有自己的池,并且在文档根目录中“查找”。为每个模块分配一个单独的池。
  2. 文档根目录中的核心软件包文件。
  3. 文档根目录中的单个软件包文件。
  4. 建议在所有这一切之前备份文档根目录的旧内容。我们当然对自己有信心,但是人们分为两种:不备份的人和已经备份的人。 
  5. ( ) ( ). , , .
  6. , , .
  7. , .
  8. () .

没有那么多,但还不够。步骤1没有问题。章鱼有一个“部署到IIS”模板,它具有您需要的一切。在第2步和第3步,我们将在下面详细介绍。对于第4步,提示变量已足够,我们将从teamcity传递该变量。步骤5是一个Powershell脚本。他还将轮换备份。为什么我们需要将它们全部存储起来,旧的可以删除。步骤6也是powershell。步骤7-完成的Slack-详细通知模板。步骤8-再次使用powershell。这听起来像是一个计划,所以我们将执行它。

房客


关于步骤2和3的更多详细信息。我假设读者熟悉章鱼的部署。如果不是,那么中心上有很多很棒的文章他们可以给出基本的了解。它们在这里:一个第二个。因此,我们具有项目,基础结构,租户,库,当前任务和设置的选项卡。必要-租户。租户一词的字面翻译是租户。在这种情况下,很可能是客户,即客户。 Oktopus告诉我们,租户可以让您一次为许多客户(租户)部署项目的不同实例。这是带有其列表的页面。

图片

在这种情况下,租户的使用略有不同。每个租户代表一个客户。对于租户,有机会添加将在部署后启动的项目。因此,将有一个核心项目和一个单独的项目。
每个租户有两个标签:TenantRole-每个人都公用,表示使用此标签将特定类型(核心)的模块部署到所有租户,而ModName是与模块名称(单独)匹配的标签。 

图片

从timcity接收到最后一个章鱼作为参数,从而标识当前已部署的模块(Deploy.Env和Deploy.2)。

从屏幕上可以看到,在为特定组织部署模块时,核心项目将首先启动(deploy.2 teamcity步骤),然后是一个单独的项目(步骤deploy.3和deploy.4 teamcity)。每个租户都可以访问其中包含的所有项目的变量,以及租户本身的变量(收集在变量集中,并包含ModName标记)。

图片

 在团队中选择了部署的租户,如下所示: 

  • env.tenantRoleTag变量-包含TenantRole(章鱼中的租户标签名称)及其实际值;
  • env.modName-章鱼中ModName标记的值。

变数


变量是项目的重要组成部分,因此需要正确构造它们。在该项目中,章鱼变量分为三种类型:所有项目通用(在“环境”库集合中收集),每个项目单独(在项目中直接配置)以及租户直接变量(也是库集合)。如前所述,在环境中,所有项目都具有共同点,尤其是: 

  • 文档根目录的基本路径(例如C:\ inetpub \);
  • 基本URL(例如,对于所有模块,公共域是organization.com);
  • 访问数据库(需要组织备份);
  • 等等

一个巨大的优点是,在每个环境中的章鱼中可能都有一个可变值。分隔可以是任何东西。

图片

例如,屏幕上的第3、6和7行。第3行是常见情况。所有需要部署到生产环境的东西都到了这里。第6和7行描述了非常具体的情况,例如:角色为“ CompanyWebsite”的生产环境(第6行)以及租户标签为“ orgznizationX”的生产环境。这对于标识将在其上获得软件包的服务器很有必要,因为例如对于organizationX,将分配一个单独的服务器。

项目的变量包括其他所有内容。这是不常见的,并且针对不同的环境而有所不同,例如,模块的标准域名。通常,它编译为#{Tenant.ModName}。#{BaseModuleDomain},但是在某些情况下可能有所不同。

图片

 图片中就是这种情况。

频道


仍然值得谈论渠道。简短而快速-通道允许您设置部署逻辑。非常简单,在官方文档中对此进行了描述,尤其是在此处此处例如,只有稳定标签的发行版可以进入生产渠道等。项目中有4个与环境一致的渠道(开发,测试,过渡,生产)。根据预发布标签,发布会落入其中。它以内部版本号格式teamcity表示(有关teamcity的部分的Build.General设置)。从TeamCity的,信道在步骤转移Deploy.2到附加命令行参数字段(--channel参数)。

模式


如果您在阅读有关团队合作性的文章时还没有意识到使用模板的所有优点,那么现在是时候了。建议使用足够通用的自定义步骤模板,因为如果需要进行编辑,则必须记住该步骤在哪些位置应用,单击每个类似的位置,并进行与该步骤用途相同的多次编辑。在该项目中,创建了模板以检查网站的运行状况,并将域列表发送回teamcity。简要考虑创建模板的过程。

部署任何模块后,每次都需要运行一个powershell脚本。

$url = "$scheme" + "://" + "$domain"
Write-Host "Requesting '$url'"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$request = [System.Net.WebRequest]::Create($url)
$request.Timeout = $timeout
$response = $request.GetResponse()
$response.Close()

该脚本接受输入方案,域和超时,之后我们认为该站点无法运行。您可以在“库-步骤模板”中创建模板。

输入名称,选择徽标。接下来,配置输入参数及其默认值。默认值也可以是指定变量的值(变量#{HostName}的值是输入参数#{Domain}的默认值)。

图片

接下来,我们对脚本进行一些修改,并将其添加为执行步骤:

图片

完成。在输出中,我们获得了一个令人愉快的步骤模板,并且在没有工作的情况下,同事无需阅读晦涩的脚本就可以弄清楚字段值。

图片

章鱼:处理细节


将所有项目分为几组,以模块组为例进行说明。它包含以下项目: 

  • 核心;
  • 单个模块项目。

让我们从核心项目开始。

这是概述页面:

图片

在这里,您可以清楚地看到它们所在的内核版本。对于版本号的混淆,我深表歉意,现在我们切换到绑定到git标签的版本控制,并且除生产外,其他地方都已在使用新的版本控制。

如您所见,对于某些租户,没有定义的环境。它们尚未创建或未预见。 

部署流程核心


在内核交付阶段,还将执行部分服务操作,即数据库的备份(如果需要),文件的先前版本的备份,备份的轮换和内核的部署。 

图片

步骤1:备份数据库。它是可选的,并且基于在team Deploy步骤2中从teamcity传递到其他命令行参数字段的变量参数的值默认情况下,此变量设置为false,因为数据库备份仅应按需进行,而不应定期进行。在团队城市中,从更改此参数开始如下所示(您需要单击“运行”按钮旁边的省略号):

图片

在章鱼中,其外观如下: 

图片

接下来,没有什么异常。zip文件的备份副本(按模板),备份轮换(脚本会低一些)以及按模板进行内核部署。 

注意事项: 

  • 所有重要参数均由变量设置,这使您可以在一个地方快速更改其值,而无需深入研究过程设置;
  • IIS池名称与实例名称和服务域名匹配(为方便起见);
  • 在“部署IIS”步骤中,将安装“与现有绑定合并”,而不是替换。由于除了提供服务外,我们在每个实例上仍然有很多客户端域;
  • 清理文档根目录(复选标记在安装前清除此目录)失败。复制时,新文件将替换旧文件。这样做是为了使站点在部署期间不会“崩溃”。加载页面的延迟比终止屏幕好得多。

备份轮换脚本:

$days = $OctopusParameters["DaysStoreBackups"]
$limit = (Get-Date).AddDays(-$days)
$pathDb = $OctopusParameters["DbBackupDir"]
$pathFiles = $OctopusParameters["FilesBackupDir"] + '\' + $OctopusParameters["HostName"]

# Delete files older than the $limit.
Get-ChildItem -Path $pathDb -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $pathDb -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

# Delete files older than the $limit.
Get-ChildItem -Path $pathFiles -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $pathFiles -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

单个程序包的部署过程


在交付单个模块程序包的阶段,将部署配置和唯一库,将文件定位和/或重命名,请求该站点(首先,很长时间以来第一次加载.net上的站点,此步骤使您可以立即执行此过程,其次,可以使您了解加载网站时是否有任何错误)。通知也会发送到松弛状态,并且属于该模块的所有域的实际列表都将转移到teamcity。 

图片

从重要:

  • 在部署步骤中,未清除文档根目录(新的核心程序包已经存在);

步骤3,脚本。模板的描述要高一些。

步骤5.它也与teamcitydeploy.4步骤相关。

在章鱼中,它看起来像这样:

$baseDomain = $OctopusParameters["HostName"]
$domains = (Get-WebBinding $baseDomain).bindingInformation | %{ $_.Split(':')[2] } | Sort-Object | Get-Unique
Write-Host "##teamcity[setParameter name='AllInstanceDomains' value='$domains']"
Write-Host "##teamcity[setParameter name='ServiceDomain' value='$baseDomain']"

语法## teamcity ...允许您在teamcity中设置build参数。实际上,其中的步骤如下所示:

Write-Host "All domains on instance %ServiceDomain% :"
$domains = "%AllInstanceDomains%"
$domains = $($domains.Split(" ") | ForEach-Object {"http://$_"} | Out-String)
Write-Host $domains
Write-Host "Service domain: http://%ServiceDomain%"

章鱼:结果


整个构建过程如下:

  • 代码是从特定分支(对应于环境)收集的;
  • 组装的结果(工件)提供给章鱼,并由两部分组成:内核和单独的模块包。这样可以有效利用磁盘空间并节省总体更新交付时间。 
  • 每个软件包的版本均由数字和预发布标签组成,该标签定义了该版本将投放的渠道和环境。
  • 八达通通过输入,在组织数据(租户标签),通道(预发布标签)和附加说明(数据库的可选备份)的指导下创建发布并将数据包传递到适当的服务器,还对模块的性能进行了基本检查。

就像那样。很有可能在幕后还会有另一篇接近技术的文章。它将包括所有未在此处输入的内容:一些细节,工作过程中的新内容以及对于决定此事的人员可能要面对的内容,项目的更正和更新,也许是常见的问题/答案。谢谢您的关注。

All Articles