АВТОМАТИЗАЦИЯ PULL REQUEST & ASSOCIATE WORK-ITEMS С ПОМОЩЬЮ AZ DEVOPS
Автор Николай ПраскуринНа чтение 16 мин.Просмотров33Опубликовано
Приветствую вас, мои коллеги, сторонники и специалисты в области технологий.
На этой сессии я продемонстрирую, как автоматизировать запрос на отгрузку (PR) и ассоциированные рабочие элементы с помощью Azure DevOps.
ОЧНАЯ СЕССИЯ:-
Я представил эту демонстрацию в рамках AZURE DEVOPS: TAKEAWAYS BEST PRACTISES AND LIVE DEMOS In-Person Speaker Session на форуме/платформе MICROSOFT AZURE BERN USER GROUP.
Анонс мероприятия: —
Момент, запечатленный с основателями MICROSOFT AZURE BERN USER GROUP «STEFAN JOHNER», «STEFAN ROTH», «PAUL AFFENTRANGER» и соорганизатором «DAMIEN BOWDEN»:-…
ЦЕЛЬ АВТОМАТИЗАЦИИ:-
Создать случайно генерируемые рабочие элементы в Azure DevOps Boards.
Создание запроса на отгрузку (PR).
Ассоциировать рабочий элемент с Pull Request (PR).
Завершить Pull Request (PR) с помощью Squash Commit.
Удалите рабочую ветвь (например: «Dev» или «Feature/AM».
ТРЕБОВАНИЯ:-
Подписка на Azure.
Организация и проект Azure DevOps.
Azure DevOps Personal Access Token (PAT).
Принципал службы с требуемым RBAC (контрибьютор), примененным к подписке или группе(ам) ресурсов.
Подключение службы Azure Resource Manager Service в Azure DevOps.
Расширение Microsoft DevLabs Terraform установлено в Azure DevOps.
#####################################################
# TRIGGER CONDITION CAN BE ALTERED LIKE BELOW :-
#####################################################
# trigger
# branches:
Войдите в полноэкранный режимВыйти из полноэкранного режима
ПОЯСНЕНИЕ:-
Вместо использования YAML-задачи TerraformInstaller@0 я указал полное имя. Это потому, что у меня есть два расширения Terraform в моей DevOps организации и с каждым из расширений Terraform существует задача установки Terraform.
Имена расширений перечислены ниже: —
1. Terraform от Microsoft DevLabs
2. Azure Pipelines Terraform Tasks by Charles Zipp
Если полное имя не указано, то возникнет следующая ошибка:-
ОБНАРУЖИТЬ ИЗМЕНЕНИЯ В TERRAFORM:-
# Detect Terraform Changes:-
- task: PowerShell@2
name: DetectTFChanges
displayName: DETECT TERRAFORM CHANGES
inputs:
workingDirectory: '$(workingDir)'
targetType: 'inline'
script: |
Write-Host "#######################################################"
Write-Host "Intial value of variable: $(anyTfChanges)"
Write-Host "#######################################################"
$plan = $(terraform show -json tfplan | ConvertFrom-Json)
$count = $plan.resource_changes.change.actions.length
$actions = ($plan.resource_changes | where { 'no-op' -notcontains $_.change.actions }).length -ne 0
Write-Host "##vso[task.setvariable variable=anyTfChanges;isOutput=true]$actions"
Write-Host "#######################################################"
Write-Host "Are there Changes in Infrastruture: $actions"
Write-Host "#######################################################"
Write-Host "TOTAL NO OF CHANGES: $count"
Write-Host "#######################################################"
Войдите в полноэкранный режимвыйти из полноэкранного режима
ПОЯСНЕНИЕ:-
Оригинальным создателем этого Powershell Script является HOUSSEM DELLAI. Я модифицировал его сценарий в соответствии с моими требованиями. Возвращается значение TRUE или FALSE вместе с общим количеством изменений, наблюдаемых в плане Terraform.
Вход в полноэкранный режимВыход из полноэкранного режима
ЭТАП РАЗВЕРТЫВАНИЯ ВЫПОЛНЯЕТ СЛЕДУЮЩИЕ ДЕЙСТВИЯ:-
##
ЗАДАЧИ
1.
Этап DEPLOY будет выполнен только при соблюдении следующих условий — 1) Этап BUILD завершен успешно. 2) Исходная/рабочая ветвь НЕ РАВНА основной ветви. 3) Если в плане Terraform обнаружены изменения.
2.
Этап DEPLOY будет выполняться только после утверждения. Утверждение интегрировано с окружением трубопровода, определенным и примененным на этапе развертывания.
3.
Загрузите опубликованные артефакты.
4.
Установщик Terraform Installer установлен в Azure DevOps Build Agent.
5.
Terraform Init.
6.
Terraform Apply.
ЭТАП КОНВЕЙЕРА — PULL_REQUEST_ASSOCIATE_WORKITEMS:-…
##################################################################################################
# STAGE: CREATE PR
# CREATE AND COMPLETE PULL REQUEST BY ASSOCIATING WORKITEMS AND DELETING SOURCE BRANCH
#################################################################################################
- stage: PULL_REQUEST_ASSOCIATE_WORKITEMS
condition: |
and(succeeded(),
ne(variables['Build.SourceBranch'], 'refs/heads/main')
)
dependsOn: DEPLOY
jobs:
- job: PULL_REQUEST_WORKITEMS
displayName: CREATE PR | ASSOCIATE WORKITEMS | COMPLETE
steps:
# Download Keyvault Secrets:-
- task: AzureKeyVault@2
inputs:
azureSubscription: '$(ServiceConnection)'
KeyVaultName: '$(KV-Name)'
SecretsFilter: '*'
RunAsPreJob: false
# Install Az DevOps CLI Extension in the Build Agent:-
- task: AzureCLI@1
displayName: INSTALL DEVOPS CLI EXTENSION
inputs:
azureSubscription: '$(ServiceConnection)'
scriptType: ps
scriptLocation: inlineScript
inlineScript: |
az extension add --name azure-devops
az extension show --name azure-devops --output table
# Validate Az DevOps CLI Extension in the Build Agent:-
- task: PowerShell@2
displayName: VALIDATE AZ DEVOPS CLI
inputs:
targetType: 'inline'
script: |
az devops -h
# Set Default DevOps Organization and Project:-
- task: PowerShell@2
displayName: DEVOPS LOGIN + SET DEFAULT DEVOPS ORG & PROJECT
inputs:
targetType: 'inline'
script: |
echo "$(PAT)" | az devops login
az devops configure --defaults organization=$(DevOpsOrganisation) project=$(DevOpsProjName)
# Create Workitem + Create PR + Associate Workitem with PR + Complete the PR + Delete Source Branch:-
- task: PowerShell@2
displayName: CREATE & COMPLETE PULL REQUEST + WORKITEMS + DELETE SOURCE BRANCH
inputs:
targetType: 'inline'
script: |
Write-Host "#######################################################"
Write-Host "NAME OF THE SOURCE BRANCH: $(Build.SourceBranchName)"
Write-Host "#######################################################"
$i="PR-"
$j=Get-Random -Maximum 1000
Write-Host "###################################################"
Write-Host "WORKITEM NUMBER GENERATED IN DEVOPS BOARD: $i$j"
Write-Host "###################################################"
$wid = az boards work-item create --title $i$j --type "Issue" --query "id"
Write-Host "#######################################################"
Write-Host "WORKITEM ID is: $wid"
Write-Host "#######################################################"
$prid = az repos pr create --repository $(DevOpsRepoName) --source-branch $(Build.SourceBranchName) --target-branch $(DevOpsDestinationBranch) --work-items $wid --transition-work-items true --query "pullRequestId"
Write-Host "#######################################################"
Write-Host "PULL REQUEST ID is: $prid"
Write-Host "#######################################################"
Write-Host "##### TO BE MERGED FROM $(Build.SourceBranchName) TO Main #####"
az repos pr update --id $prid --auto-complete true --squash true --status completed --delete-source-branch true
Write-Host "##### MERGE SUCCESSFULL #####"
Вход в полноэкранный режимВыход из полноэкранного режима
ЭТАП PULL REQUEST ВЫПОЛНЯЕТ СЛЕДУЮЩИЕ ДЕЙСТВИЯ:-
##
ЗАДАЧИ
1.
Этап PULL REQUEST будет выполнен только при соблюдении следующих условий — 1) Этап DEPLOY завершен успешно. 2) Исходная/рабочая ветвь НЕ РАВНА основной ветви.
2.
Загрузить секреты из Keyvault (DevOps Personal Access Token [PAT]).
3.
Установите расширение Azure DevOps CLI Extension в Build Agent.
4.
Проверьте Azure DevOps CLI Extension в Build Agent.
5.
Установите организацию и проект DevOps по умолчанию.
6.
Создайте рабочий элемент в DevOps Board.
7.
Создайте Pull Request.
8.
Ассоциировать рабочий элемент с запросом на отгрузку.
9.
Завершите Pull Request с помощью Squash Commit.
10.
Удалить исходную ветвь.
ЧАСТЬ #3:-
ЦЕЛЬ ФРАГМЕНТА КОДА TERRAFORM:-
Создайте группу ресурсов.
Создать назначенную пользователем системную управляемую личность.
Войти в полноэкранный режимВыход из полноэкранного режима
ТЕРРАФОРМА (variables.tf):-
variable "rg-name" {
type = string
description = "Name of the Resource Group"
}
variable "rg-location" {
type = string
description = "Resource Group Location"
}
variable "usr-mid-name" {
type = string
description = "Name of the User Assigned Managed Identity"
}
Войти в полноэкранный режимВыход из полноэкранного режима