在 Octopus Deploy 中,第一次将主要版本或次要版本部署到环境时如何要求批准?

In Octopus Deploy, how to require an approval when a major or minor version is deployed to an environment the first time?

假设您有五个环境,Dev、Test、UAT、Stage 和 Production。

对于那些环境,您具有以下生命周期: - 冲刺:开发 -> 测试 - 测试到生产:测试 -> UAT -> 阶段 -> 生产 - UAT 到 Prod:UAT -> Stage -> Prod - 修补程序:阶段 -> Prod

发布版本类似于 2020.1.3。当删除新版本时,它将更新版本号中的主要 (2020) 或次要 (1)。例如 2020.1.3 转到 2020.2.1 或 2021.1.1。错误修复或次要版本将更新最后一个数字 (3)。

担心的是,如果发布在错误的时间或意外地部署到测试、UAT 或阶段,它会停止我们的测试人员。例如,QA 正在测试 Test 中的 2020.1.3 版本。一位开发者不小心将 2020.2 推到了 Test。这包括 QA 没有预料到的新代码。虽然 QA 正在测试 2020.1.x,但他们只想看到 2020.1.x 版本。

我们不想在我们的频道中使用 version rules。每次削减新版本时,都必须更新版本规则。

第一次将主要版本或次要版本部署到环境时是否可能需要批准?

是的,这是可能的。为此,我们将使用 output variables and run conditions.

首先,在流程的开头添加了两个新步骤。

这两个步骤都跳过了开发和生产,因为它们不受此问题的影响。每次 major/minor 版本更改时都必须批准部署到 dev 会很快变旧。并且所有生产版本必须至少先进行暂存。

第一步 运行 是这个 PowerShell 脚本。它会将此特定环境的先前版本号与当前版本号进行比较。如果主要或次要版本不同,它会将输出变量 "RequiresApproval" 设置为 true。

$releaseNumber = $OctopusParameters["Octopus.Release.Number"]
$releaseNumberArray = $releaseNumber.Split('.')

$lastVersion = $OctopusParameters["Octopus.Release.PreviousForEnvironment.Number"]
$lastVersionArray = $lastVersion.Split('.')

Write-Highlight "The previous version deployed to this environment was $lastVersion"

$requiresApproval = $false
if ($lastVersionArray[0] -ne $releaseNumberArray[0])
{
    Write-Highlight "The previous major version $($lastVersionArray[0]) in $lastVersion is different than the one being deployed $($releaseNumberArray[0]) in $releaseNumber, this requires someone to approve"
    $requiresApproval = $true
}
elseif ($lastVersionArray[1] -ne $releaseNumberArray[1])
{
    Write-Highlight "The previous minor version $($lastVersionArray[1]) in $lastVersion is different than the one being deployed $($releaseNumberArray[1]) in $releaseNumber, this requires someone to approve"
    $requiresApproval = $true
}
else
{
    Write-Highlight "The previous version's major and minor versions are the same, skipping approval"
}

Set-OctopusVariable -name "RequiresApproval" -value $requiresApproval

输出变量有点冗长,使用起来可能很棘手。为了使这更容易,创建一个项目变量来引用它。

在手动干预步骤中,将 运行 条件设置为该项目变量。

现在是测试这个的时候了。 UAT 目前有 2020.1.2,而测试有 2020.2.3。当 2020.2.4 部署到测试时,不应出现手动干预。

成功,跳过人工干预。

UAT 目前有 2020.1.22020.2.4 有一个新的次要版本,部署到 UAT 将提示用户进行手动干预。

This YouTube Video 展示了这一点。