我想在部署期间将要替换的 DLL 和 Web.Config 进行备份,然后再替换它们,以便在部署失败时轻松回滚。
人们说,“只需使用 octopus 部署以前的版本”,但想象一下 octopus 部署过程不再正常工作,在这种情况下,除了从备份 zip 文件手动替换旧文件之外别无选择。
Octopus 中是否有任何功能可以在触手中自动创建此 zip 文件?
我不会覆盖以前部署的版本,而是将新版本部署到版本化目录。Octopus 将默认将应用程序安装到/Applications/TEST/App.Name/1.2.1/等路径,因此下一次安装将转到/Applications/TEST/App.Name/1.3.0/等路径。然后,如果您想回滚但发现您的部署过程被破坏,您只需要重新指向以前的版本。如果这是 IIS 中的网站,那么您只需更改 wwwroot 目录 - 如果这是 Windows 服务,您只需使用旧路径安装它。
将此与生命周期结合起来,以确保您保持一定数量的可用版本,并且无需编写任何自定义自定义代码。作为部署的一部分,我真的会避免做任何手动操作,甚至回滚(解压缩以前的文件并复制内容等),因为这是我们人类引入错误的机会之窗。现在想象一下,您必须在 10 台以上的服务器上执行此操作……如果您真的想要一些可重复的东西,那么您可以编写该位脚本,但是编写脚本更改 IIS 中的根目录或安装服务路径会容易得多。
如果您直接部署到云中的 Paas,那么也许有一个用例。八达通图书馆中有一个步骤可以帮助您解决这个问题。
希望这可以帮助
这有点旧,但我想我会在 octo 的过程中添加我所做的事情。
我使用子步骤运行滚动部署。
我有一个 powershell 步骤来记录输出变量中以前的 IIS 路径。
Import-Module 'WebAdministration'
Write-Host ('IIS:\Sites\Online-' + $OctopusParameters["Octopus.Environment.Name"])
$formerPath = (Get-ItemProperty -Path ('IIS:\Sites\Site-' + $OctopusParameters["Octopus.Environment.Name"]) -Name physicalPath)
if($formerPath.length -gt 0) {
Set-OctopusVariable -Name 'FormerIISPath' -Value $formerPath
Write-Host "Former path is '$formerPath'"
}
然后,我为我的部署做我需要做的事情,并有一个手动步骤来审查每个滚动部署。
如果该手动步骤被取消,我将有一组失败的子项,其中包含以下 powershell 脚本。
$formerPath = $OctopusParameters["Octopus.Action[Set previous path].Output.FormerIISPath"]
if($formerPath.Length -gt 0) {
Import-Module 'WebAdministration'
$currentPath = (Get-ItemProperty -Path ('IIS:\Sites\Online-' +
$OctopusParameters["Octopus.Environment.Name"]) -Name physicalPath)
if($currentPath -ne $formerPath) {
Set-ItemProperty -Path ('IIS:\Sites\Site-' + $OctopusParameters["Octopus.Environment.Name"]) -Name 'physicalPath' -Value $formerPath
Write-Host "Deployment failed, reverted to former path - '$formerPath'"
}
}
这会将所有服务器恢复到之前显示的状态。
我想补充一点,我还使用默认包位置,并且从不覆盖以前的文件。如果您的部署步骤更复杂但对我来说我想快速故障恢复,另一个选项是使用 octo 上的 REST API 来触发先前成功的部署(参数在 octo 上)。