АВТОМАТИЗАЦИЯ PULL REQUEST & ASSOCIATE WORK-ITEMS С ПОМОЩЬЮ AZ DEVOPS

Приветствую вас, мои коллеги, сторонники и специалисты в области технологий.

На этой сессии я продемонстрирую, как автоматизировать запрос на отгрузку (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».
ТРЕБОВАНИЯ:-
  1. Подписка на Azure.
  2. Организация и проект Azure DevOps.
  3. Azure DevOps Personal Access Token (PAT).
  4. Принципал службы с требуемым RBAC (контрибьютор), примененным к подписке или группе(ам) ресурсов.
  5. Подключение службы Azure Resource Manager Service в Azure DevOps.
  6. Расширение Microsoft DevLabs Terraform установлено в Azure DevOps.

РЕПОЗИТОРИЙ КОДА:-

arindam0310018 / 20-July-2022-DevOps__Automate-Pull-Request-And-Associate-Work-Item

АВТОМАТИЗАЦИЯ ПОЛУЧЕНИЯ ЗАПРОСА И АССОЦИАТИВЫ РАБОЧИХ ИМЕН С ИСПОЛЬЗОВАНИЕМ AZ DEVOPS

АВТОМАТ ПОЛУЧЕНИЯ ЗАПРОСА & АССОЦИАТИВНЫЕ РАБОЧИЕ ЭЛЕМЕНТЫ, ИСПОЛЬЗУЮЩИЕ AZ DEVOPS

Приветствую вас, мои коллеги, защитники и специалисты в области технологий.

В этой сессии я продемонстрирую, как автоматизировать Pull Request (PR) и Associate Work-Items с помощью Azure DevOps.

ЦЕЛЬ АВТОМАТИЗАЦИИ:-
Создать случайно генерируемые рабочие элементы в Azure DevOps Boards.
Создать запрос на отгрузку (PR).
Ассоциировать рабочий элемент с Pull Request (PR).
Завершить Pull Request (PR) с помощью Squash Commit.
Удалите рабочую ветвь (например: «Dev» или «Feature/AM».
ТРЕБОВАНИЯ:-
  1. Подписка на Azure.
  2. Организация и проект Azure DevOps.
  3. Azure DevOps Personal Access Token (PAT).
  4. Принципал службы с требуемым RBAC (контрибьютор), примененным к подписке или группе(ам) ресурсов.
  5. Подключение службы Azure Resource Manager Service в Azure DevOps.
  6. Расширение Microsoft DevLabs Terraform установлено в Azure DevOps.
РЕПОЗИТОРИЙ КОДА:-
{% github arindam0310018/20-July-2022-DevOps__Automate-Pull-Request-And-Associate-Work-Item %}
КАК ВЫГЛЯДИТ МОЙ КОД: —
ФРАГМЕНТ КОДА ТРУБОПРОВОДА:-
AZURE DEVOPS YAML PIPELINE (azure-pipelines-automate-pr-workitems-v1.0.yml):-
#####################################################
# TRIGGER CONDITION CAN BE ALTERED LIKE BELOW :-
#####################################################
# trigger
#   branches:

Посмотреть на GitHub
КАК ВЫГЛЯДИТ МОЙ КОД-ПЛАТФОРМА:-
ФРАГМЕНТ КОДА ТРУБОПРОВОДА:-
AZURE DEVOPS YAML PIPELINE (azure-pipelines-automate-pr-workitems-v1.0.yml):- …
#####################################################
# TRIGGER CONDITION CAN BE ALTERED LIKE BELOW :-
#####################################################
# trigger:
#   branches:
#     include:
#     - feature/*
#   paths:
#     include:
#     - Automate-PR-and-Associate-WorkItems/*
#####################################################


#######################
# TRIGGER CONDITION :-
#######################
trigger: none

########################################################################
#DECLARE VARIABLES:-
# ONLY VARIABLE VALUES NEEDS TO BE ALTERED TO MAKE THE PIPELINE WORK.
########################################################################
variables:
  PlanFilename: tfplan
  TfvarFilename: usrmid.tfvars
  KV-Name: ampockv
  ServiceConnection: amcloud-cicd-service-connection
  ResourceGroup: tfpipeline-rg
  StorageAccount: tfpipelinesa
  Container: terraform
  TfstateFile: PR/createprworkitem.tfstate
  BuildAgent: ubuntu-latest
  PipelineEnv: NonProd
  Terraform_Version: 1.2.3
  WorkingDir: $(System.DefaultWorkingDirectory)/Automate-PR-and-Associate-WorkItems
  Target: $(build.artifactstagingdirectory)/AMTF
  Artifact: AM
  anyTfChanges: false
  DevOpsOrganisation: https://dev.azure.com/ArindamMitra0251
  DevOpsProjName: AMCLOUD
  DevOpsRepoName: PR
  DevOpsDestinationBranch: main

######################
#DECLARE BUILD AGENT:-
######################
pool:
  vmImage: $(BuildAgent)

###################
#DECLARE STAGES:-
###################

#################
# STAGE: BUILD
#################

stages:

- stage: BUILD
  jobs:
  - job: BUILD
    displayName: BUILD
    steps:
# Install Terraform Installer in the Build Agent:-
    - task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0
      displayName: INSTALL LATEST TERRAFORM VERSION
      inputs:
        terraformVersion: '$(Terraform_Version)'
# Terraform Init:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM INIT
      inputs:
        command: 'init'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        backendServiceArm: '$(ServiceConnection)' 
        backendAzureRmResourceGroupName: '$(ResourceGroup)' 
        backendAzureRmStorageAccountName: '$(StorageAccount)'
        backendAzureRmContainerName: '$(Container)'
        backendAzureRmKey: '$(TfstateFile)'
# Terraform Validate:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM VALIDATE
      inputs:
        command: 'validate'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        environmentServiceNameAzureRM: '$(ServiceConnection)'
# Terraform Plan:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM PLAN
      inputs:
        command: 'plan'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        commandOptions: '--var-file=$(TfvarFilename) --out=$(PlanFilename)'
        environmentServiceNameAzureRM: '$(ServiceConnection)'
# 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 "#######################################################"
# Copy Files to Artifacts Staging Directory:-
    - task: CopyFiles@2
      displayName: COPY FILES ARTIFACTS STAGING DIRECTORY
      inputs:
        SourceFolder: '$(WorkingDir)'
        Contents: |
          **/*.tf
          **/*.tfvars
          **/*$(PlanFilename)*
        TargetFolder: '$(Target)'
# Publish Artifacts:-
    - task: PublishBuildArtifacts@1
      displayName: PUBLISH ARTIFACTS
      inputs:
        targetPath: '$(Target)'
        artifactName: '$(Artifact)'

#################
# STAGE: DEPLOY
#################

- stage: DEPLOY
  condition: |
     and(succeeded(),
       ne(variables['Build.SourceBranch'], 'refs/heads/main'),
       eq(dependencies.BUILD.outputs['build.DetectTFChanges.anyTfChanges'], 'true')
     )
  jobs:
  - deployment: 
    displayName: Deploy
    environment: '$(PipelineEnv)'
    pool:
      vmImage: '$(BuildAgent)'
    strategy:
      runOnce:
        deploy:
          steps:
# Download Artifacts:-
          - task: DownloadBuildArtifacts@0
            displayName: DOWNLOAD ARTIFACTS
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: '$(Artifact)'
              downloadPath: '$(System.ArtifactsDirectory)' 
# Install Terraform Installer in the Build Agent:-
          - task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0
            displayName: INSTALL LATEST TERRAFORM VERSION
            inputs:
              terraformVersion: '$(Terraform_Version)'
# Terraform Init:-
          - task: TerraformTaskV2@2
            displayName: TERRAFORM INIT
            inputs:
              provider: 'azurerm'
              command: 'init'
              workingDirectory: '$(System.ArtifactsDirectory)/$(Artifact)/AMTF/'
              backendServiceArm: '$(ServiceConnection)' 
              backendAzureRmResourceGroupName: '$(ResourceGroup)' 
              backendAzureRmStorageAccountName: '$(StorageAccount)'
              backendAzureRmContainerName: '$(Container)'
              backendAzureRmKey: '$(TfstateFile)'
# Terraform Apply:-
          - task: TerraformTaskV2@2
            displayName: TERRAFORM APPLY
            inputs:
              provider: 'azurerm'
              command: 'apply'
              workingDirectory: '$(System.ArtifactsDirectory)/$(Artifact)/AMTF'
              commandOptions: '--var-file=$(TfvarFilename)'
              environmentServiceNameAzureRM: '$(ServiceConnection)'

##################################################################################################
# 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 #####"

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь позвольте мне объяснить каждую часть YAML Pipeline для лучшего понимания.

ЧАСТЬ #1:-
НИЖЕ ПРИВЕДЕН ФРАГМЕНТ КОДА ПЕРЕМЕННЫХ КОНВЕЙЕРА:-
########################################################################
#DECLARE VARIABLES:-
# ONLY VARIABLE VALUES NEEDS TO BE ALTERED TO MAKE THE PIPELINE WORK.
########################################################################
variables:
  PlanFilename: tfplan
  TfvarFilename: usrmid.tfvars
  KV-Name: ampockv
  ServiceConnection: amcloud-cicd-service-connection
  ResourceGroup: tfpipeline-rg
  StorageAccount: tfpipelinesa
  Container: terraform
  TfstateFile: PR/createprworkitem.tfstate
  BuildAgent: ubuntu-latest
  PipelineEnv: NonProd
  Terraform_Version: 1.2.3
  WorkingDir: $(System.DefaultWorkingDirectory)/Automate-PR-and-Associate-WorkItems
  Target: $(build.artifactstagingdirectory)/AMTF
  Artifact: AM
  anyTfChanges: false
  DevOpsOrganisation: https://dev.azure.com/ArindamMitra0251
  DevOpsProjName: AMCLOUD
  DevOpsRepoName: PR
  DevOpsDestinationBranch: main

Войти в полноэкранный режим Выйти из полноэкранного режима
ПРИМЕЧАНИЕ:-
Пожалуйста, не стесняйтесь изменять значения переменных.
Весь конвейер YAML строится с использованием переменных. Никакие значения не закодированы.
Путь к «Рабочей директории» должен быть основан на вашем коде Placeholder.
ЧАСТЬ #2:-
ДЕТАЛИ СТАДИЙ КОНВЕЙЕРА ПРИВЕДЕНЫ НИЖЕ:-
  1. Это 3 этапа конвейера.
  2. Названия этапов — 1) BUILD 2) DEPLOY и 3) PULL_REQUEST_ASSOCIATE_WORKITEMS.
ЭТАП КОНВЕЙЕРА — СБОРКА:-
#################
# STAGE: BUILD
#################

stages:

- stage: BUILD
  jobs:
  - job: BUILD
    displayName: BUILD
    steps:
# Install Terraform Installer in the Build Agent:-
    - task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0
      displayName: INSTALL LATEST TERRAFORM VERSION
      inputs:
        terraformVersion: '$(Terraform_Version)'
# Terraform Init:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM INIT
      inputs:
        command: 'init'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        backendServiceArm: '$(ServiceConnection)' 
        backendAzureRmResourceGroupName: '$(ResourceGroup)' 
        backendAzureRmStorageAccountName: '$(StorageAccount)'
        backendAzureRmContainerName: '$(Container)'
        backendAzureRmKey: '$(TfstateFile)'
# Terraform Validate:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM VALIDATE
      inputs:
        command: 'validate'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        environmentServiceNameAzureRM: '$(ServiceConnection)'
# Terraform Plan:-
    - task: TerraformTaskV2@2
      displayName: TERRAFORM PLAN
      inputs:
        command: 'plan'
        provider: 'azurerm'
        workingDirectory: '$(WorkingDir)'
        commandOptions: '--var-file=$(TfvarFilename) --out=$(PlanFilename)'
        environmentServiceNameAzureRM: '$(ServiceConnection)'
# 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 "#######################################################"
# Copy Files to Artifacts Staging Directory:-
    - task: CopyFiles@2
      displayName: COPY FILES ARTIFACTS STAGING DIRECTORY
      inputs:
        SourceFolder: '$(WorkingDir)'
        Contents: |
          **/*.tf
          **/*.tfvars
          **/*$(PlanFilename)*
        TargetFolder: '$(Target)'
# Publish Artifacts:-
    - task: PublishBuildArtifacts@1
      displayName: PUBLISH ARTIFACTS
      inputs:
        targetPath: '$(Target)'
        artifactName: '$(Artifact)'

Вход в полноэкранный режим Выход из полноэкранного режима
ЭТАП СБОРКИ ВЫПОЛНЯЕТ СЛЕДУЮЩИЕ ДЕЙСТВИЯ:-
## ЗАДАЧИ
1. Установщик Terraform Installer установлен в Azure DevOps Build Agent.
2. Terraform Init.
3. Terraform Validate.
4. Terraform Plan.
5. Обнаружение изменений Terraform (встроенный сценарий Powershell).
6. Скопируйте файлы Terraform (самое важное — выходные данные плана Terraform) в каталог Artifacts Staging Directory.
6. Опубликуйте артефакты.
ПРИМЕЧАНИЕ:-
- task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0

Войдите в полноэкранный режим Выйти из полноэкранного режима
ПОЯСНЕНИЕ:-
Вместо использования 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.
СТАДИЯ КОНВЕЙЕРА — РАЗВЕРТЫВАНИЕ:-
#################
# STAGE: DEPLOY
#################

- stage: DEPLOY
  condition: |
     and(succeeded(),
       ne(variables['Build.SourceBranch'], 'refs/heads/main'),
       eq(dependencies.BUILD.outputs['build.DetectTFChanges.anyTfChanges'], 'true')
     )
  jobs:
  - deployment: 
    displayName: Deploy
    environment: '$(PipelineEnv)'
    pool:
      vmImage: '$(BuildAgent)'
    strategy:
      runOnce:
        deploy:
          steps:
# Download Artifacts:-
          - task: DownloadBuildArtifacts@0
            displayName: DOWNLOAD ARTIFACTS
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: '$(Artifact)'
              downloadPath: '$(System.ArtifactsDirectory)' 
# Install Terraform Installer in the Build Agent:-
          - task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0
            displayName: INSTALL LATEST TERRAFORM VERSION
            inputs:
              terraformVersion: '$(Terraform_Version)'
# Terraform Init:-
          - task: TerraformTaskV2@2
            displayName: TERRAFORM INIT
            inputs:
              provider: 'azurerm'
              command: 'init'
              workingDirectory: '$(System.ArtifactsDirectory)/$(Artifact)/AMTF/'
              backendServiceArm: '$(ServiceConnection)' 
              backendAzureRmResourceGroupName: '$(ResourceGroup)' 
              backendAzureRmStorageAccountName: '$(StorageAccount)'
              backendAzureRmContainerName: '$(Container)'
              backendAzureRmKey: '$(TfstateFile)'
# Terraform Apply:-
          - task: TerraformTaskV2@2
            displayName: TERRAFORM APPLY
            inputs:
              provider: 'azurerm'
              command: 'apply'
              workingDirectory: '$(System.ArtifactsDirectory)/$(Artifact)/AMTF'
              commandOptions: '--var-file=$(TfvarFilename)'
              environmentServiceNameAzureRM: '$(ServiceConnection)'

Вход в полноэкранный режим Выход из полноэкранного режима
ЭТАП РАЗВЕРТЫВАНИЯ ВЫПОЛНЯЕТ СЛЕДУЮЩИЕ ДЕЙСТВИЯ:-
## ЗАДАЧИ
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:-
Создайте группу ресурсов.
Создать назначенную пользователем системную управляемую личность.
ТЕРРАФОРМА (main.tf):-
terraform {
  required_version = ">= 1.2.3"

   backend "azurerm" {
    resource_group_name  = "tfpipeline-rg"
    storage_account_name = "tfpipelinesa"
    container_name       = "terraform"
    key                  = "PR/createprworkitem.tfstate"
  }
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.2"
    }   
  }
}
provider "azurerm" {
  features {}
  skip_provider_registration = true
}

Войти в полноэкранный режим Выход из полноэкранного режима
ТЕРРАФОРМ (usrmid.tf):-
## Azure Resource Group:-
resource "azurerm_resource_group" "rg" {
 name     = var.rg-name
 location = var.rg-location
}

## Azure User Assigned Managed Identities:-
resource "azurerm_user_assigned_identity" "az-usr-mid" {

 name                = var.usr-mid-name
 resource_group_name = azurerm_resource_group.rg.name
 location            = azurerm_resource_group.rg.location

 depends_on          = [azurerm_resource_group.rg]
 }

Войти в полноэкранный режим Выход из полноэкранного режима
ТЕРРАФОРМА (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"
}

Войти в полноэкранный режим Выход из полноэкранного режима
ТЕРРАФОРМ (usrmid.tfvars):-
rg-name         = "AMTest100"
rg-location     = "West Europe"
usr-mid-name    = "AMUSRMID100"

Войти в полноэкранный режим Выход из полноэкранного режима

ТЕПЕРЬ ПРИШЛО ВРЕМЯ ТЕСТИРОВАНИЯ!!!…..

ТЕСТОВЫЕ СЛУЧАИ:-
ТЕСТОВЫЙ ПРИМЕР #1: КОНВЕЙЕР ЗАПУЩЕН ИЗ РАБОЧЕЙ ВЕТКИ (НАПРИМЕР: DEV) С ИЗМЕНЕНИЯМИ:-
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ: BUILD, DEPLOY И PR STAGE ВЫПОЛНЕНЫ УСПЕШНО.
ВЕТВИ:-
ЗАПУСК ТРУБОПРОВОДА:-
ЭТАП СБОРКИ ТРУБОПРОВОДА ВЫПОЛНЕН УСПЕШНО:-
ЭТАП РАЗВЕРТЫВАНИЯ ТРУБОПРОВОДА ОЖИДАЕТ ОДОБРЕНИЯ:-
ЭТАП РАЗВЕРТЫВАНИЯ ВЫПОЛНЕН УСПЕШНО:-
ЗАПРОС НА ИЗВЛЕЧЕНИЕ НА ЭТАПЕ ТРУБОПРОВОДА ВЫПОЛНЕН УСПЕШНО:-
ОБЩИЙ СТАТУС ЗАПУСКА ТРУБОПРОВОДА:-
WORK-ITEMS WITH RANDOM NAME CREATED SUCCESSFULLY:-
PR АССОЦИИРОВАНИЕ РАБОЧЕГО ЭЛЕМЕНТА ЗАВЕРШЕНО УСПЕШНО С ФИКСАЦИЕЙ СКВОША:-
ИСХОДНАЯ/РАБОЧАЯ ВЕТВЬ УДАЛЕНА УСПЕШНО:-
РЕСУРСЫ AZURE РАЗВЕРНУТЫ УСПЕШНО:-
ТЕСТОВЫЙ ПРИМЕР #2:- КОНВЕЙЕР ЗАПУЩЕН ИЗ РАБОЧЕЙ ВЕТКИ (НАПРИМЕР: DEV) БЕЗ ИЗМЕНЕНИЙ:-
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ:- СТАДИЯ СБОРКИ ВЫПОЛНЕНА УСПЕШНО. ЭТАПЫ DEPLOY И PR ПРОПУЩЕНЫ.
ВЕТВИ:-
ЗАПУСК ТРУБОПРОВОДА:-
ЭТАП СБОРКИ ТРУБОПРОВОДА ВЫПОЛНЕН УСПЕШНО:-
СТАДИИ DEPLOY И PR ПРОПУСКАЮТСЯ:-
РАБОЧАЯ ВЕТВЬ ОСТАЕТСЯ (НАПРИМЕР, DEV):-
ТЕСТОВЫЙ ПРИМЕР #3: ТРУБОПРОВОД ВЫПОЛНЯЕТСЯ ИЗ ОСНОВНОЙ ВЕТВИ:-
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ:- ЭТАП BUILD ВЫПОЛНЕН УСПЕШНО. ЭТАПЫ DEPLOY И PR ПРОПУЩЕНЫ.
ВЕТВИ:-
ЗАПУСК ТРУБОПРОВОДА:-
ЭТАП СБОРКИ ТРУБОПРОВОДА ВЫПОЛНЕН УСПЕШНО:-
СТАДИИ РАЗВЕРТЫВАНИЯ И PR ПРОПУЩЕНЫ:-

Надеюсь, вам понравилась сессия!!!

Оставайтесь в безопасности | Продолжайте учиться | Распространяйте знания

Оцените статью
devanswers.ru
Добавить комментарий