在使用 Azure DevOps管道
的以下情况下,我遇到了实现问题我能够在单个管道中执行这两个步骤。在将两个管道合并/集成为一个管道时需要一些帮助。
如何在没有任何手动干预的情况下使以上两个步骤自动化。该过程必须足够健壮,才能在上一步中创建的相同ACR和AKS中处理应用程序部署?
基础结构和应用程序代码都位于同一GIT / Azure存储库中。
答案 0 :(得分:0)
首先。我建议您不要将两个管道捆绑在一起。
尽管将基础结构作为代码很重要,但应该使用。出于许多充分的原因,将基础架构配置与应用程序配置分离是很重要的。
关于您的要求,您应该有一个创建ACR / AKS的任务,一个任务获取要在另一个任务中使用的凭据,该凭据将部署到矿石中创建的AKS和ACR
可能是这样。
ACR-AKS(如果要配置具有ACR集成的AKS,则需要按顺序进行配置)-docker构建/推送到ACR-使用外壳脚本和KubeCTL部署容器,利用第二步的凭据。
答案 1 :(得分:0)
您可以在一个Yaml管道中使用multiple stages。参见下面的简单示例:
以下yaml管道有两个阶段。第一阶段完成提供基础结构的任务。第二阶段是dependsOn的第一阶段,并在变量中定义了ACR和AKS,然后执行任务以部署到Kubernetes集群。
trigger:
- master
stages:
- stage: Infrastructure Deployment
pool:
vmImage: windows-latest
jobs:
- job: Infrastructure
steps:
- task: AzureResourceManagerTemplateDeployment@3
inputs:
.....
- stage: Application Deployment
dependsOn: Infrastructure Deployment
pool:
vmImage: windows-latest
variables:
ACRName: "ACRName"
AKSName: "ACRName"
azureSubscriptionEndpoint: ..
azureContainerRegistry: ..
azureResourceGroup: ..
jobs:
- job: Application
steps:
# - task: Docker@2
# inputs:
# containerRegistry: $(ACRName)
# ...
- powershell: |
# Log in to Docker with service principal credentials
docker login $(ACRName).azurecr.io --username $SP_APP_ID --password $SP_PASSWD
docker build
docker push
- task: Kubernetes@1
displayName: kubectl apply
inputs:
connectionType: Azure Resource Manager
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureResourceGroup: $(azureResourceGroup)
kubernetesCluster: $(AKSName)
....
更新:动态捕获ACR和AKS名称以及ACR登录凭据
您可以使用azure powershell task来获取上述数据。为了使用Azure Powershell任务,您需要创建一个azure resource manager service connection。
然后,您可以在任务中编写自定义内联脚本。参见以下示例:
- task: AzurePowerShell@5
name: AzurePowershell
inputs:
azureSubscription: 'Microsoft Azure Internal Consumption (daaeef3e-d7fe-49e8-baaa-b3df9d072825)'
ScriptType: InlineScript
Inline: |
$json = (Get-Content "$(system.defaultworkingdirectory)\template.json" -Raw) | ConvertFrom-Json
$AKS = $json.resources | where {$_.type -eq "Microsoft.ContainerService/managedClusters"} | select name
$ACR = $json.resources | where {$_.type -eq "Microsoft.ContainerRegistry/registries"} | select name
echo "##vso[task.setvariable variable=ACRName;isOutput=true]$($ACR.name)"
echo "##vso[task.setvariable variable=AKSName;isOutput=true]$($AKS.name)"
$ACRCred = Get-AzContainerRegistryCredential -ResourceGroupName "MyResourceGroup" -Name $($ACR.name)
echo "##vso[task.setvariable variable=UserName;isOutput=true]$($ACRCred.Username)"
echo "##vso[task.setvariable variable=Password;isOutput=true]$($ACRCred.Password)"
azurePowerShellVersion: LatestVersion
然后,您可以在下一个阶段通过参考stageDependencies.stageName.jobName.outputs['stepName.variableName']
获得这些变量。请参阅here,以了解更多有关天蓝色的powershell cli。