如果只有一个版本(基础设施)已经存在,我想在 Azure DevOps 管道中的 helm 卸载命令中添加一个条件,我想卸载它。我怎样才能做到这一点?
- task: HelmDeploy@0
displayName: Helm uninstall test
inputs:
connectionType: Kubernetes Service Connection
kubernetesServiceEndpoint: dev-test
command: uninstall
chartType: FilePath
chartPath: infra
waitForExecution: true
namespace: test
arguments: infra
continueOnError: true
旧答案
您基本上想要实现的是让命令的退出代码等于 0。通常,您可以执行以下操作来实现此行为:
helm uninstall <MY_RELEASE_NAME> -n my-k8s-namespace || true
在这种情况下,命令的退出代码将始终为 0,即使在给定版本不存在时 helm uninstall 命令以不同的退出代码退出(在您的情况下为 1)。
要检查上一个命令的退出代码,请执行以下操作:
# try uninstalling a non existing release
helm uninstall <NON_EXISTING_RELEASE_NAME> -n my-k8s-namespace
# check the exit code for that previous command
echo $?
如果给定的 k8s 命名空间中不存在 helm 版本,则返回 1。
新答案
我根据您的评论更新了答案。您可以执行以下操作:
helm status <MY_RELEASE_NAME> && helm uninstall <MY_RELEASE_NAME>
使用
&&
运算符时,仅当其前面的命令成功时,才会执行该运算符后面的命令。因此,只有当前面的 helm status <my_release_name>
命令返回等于 0 的退出代码(这意味着找到了具有给定名称的 Helm 版本)时,才会卸载您的 Helm 版本。不过,这可能会破坏您的 CI/CD 管道(作业),因为当找不到与给定名称匹配的版本时,helm status <my_release_name>
命令会返回非零退出代码。为了避免这种情况,你更进一步,这样做:
helm status <MY_RELEASE_NAME> && helm uninstall <MY_RELEASE_NAME> || true
这样做,即使
helm status
或 helm uninstall
命令无法找到具有给定名称的 Helm 版本,上述表达式的退出代码也将为 0。
答案的灵感来自这篇文章的已接受答案。
您只需将
--ignore-not-found
选项传递给 helm uninstall
命令(请参阅官方文档)。
像这样:
helm uninstall <MY_RELEASE_NAME> -n <MY_K8S-NAMESPACE> --ignore-not-found