Azure Триггер и теги на основе файловых конвейеров - PullRequest
1 голос
/ 30 января 2020

Можно ли создать конвейер сборки с файловым триггером?

Допустим, у меня есть следующая структура каталогов.

Microservices/
    |_Service A
        |_Test_Stage
            |_Testing_Config
        |_QA_Stage
            |_QA_Config
        |_Prod_stage
            |_Prod_Config
    |_Service B
        |_Test_Stage
            |_Testing_Config
        |_QA_Stage
            |_QA_Config
        |_Prod_stage
            |_Prod_Config

Я хочу иметь только один файл конвейера сборки YAML. На основе переменных $ (Project) и $ (Stage) создаются различные сборки. Можно ли проверить, какой каталог / файл инициировал триггер и установить соответствующие переменные?

Кроме того, было бы здорово, если бы было возможно использовать эти переменные для установки тегов в артефакт после выполнения.

Спасибо KR

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Можно ли проверить, какой каталог / файл инициировал триггер, и установить соответствующие переменные?

Конечно, да. Но прямого пути нет, так как мы не предоставляем предварительно определенные переменные для хранения такого сообщения, поэтому для его получения требуется дополнительная сложная обработка.

# 1:

Хотя переменная не может напрямую хранить сообщение, например, какая папка и какой файл изменены, но вы можете получить его, отслеживая сообщение commit Build.SourceVersion через api .

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}/changes?api-version=5.1

Из тела ответа вы можете напрямую узнать его путь и файл:

enter image description here

Поскольку тело ответа JSON формат, вы можете использовать некоторую функцию JSON для анализа этого значения пути. См. Этот аналогичный сценарий в качестве ссылки.

Затем используйте сценарий powershell, чтобы установить эти значения в качестве переменной конвейера , чтобы следующие задания / задачи агента могли их использовать.

Кроме того, в вашем сценарии все это должно быть завершено до начала следующего задания. Итак, вы можете создать простое расширение с конвейером decorator . Определите все вышеперечисленные шаги в декораторе, чтобы его можно было завершить в предварительной работе каждого конвейера.


# 2

Думаю, вы должны чувствовать себя выше метод немного сложен. Поэтому я бы предпочел, чтобы вы могли использовать commit messge . Например, укажите project name и file name в сообщении фиксации, получите их, используя переменную Build.SourceVersionMessage.

Затем используйте скрипт powershell (я упоминал выше), чтобы установить их как переменные.

Это удобнее, чем использовать api для разбора коммитов тела.

Надеюсь, один из них может помочь.

0 голосов
/ 31 января 2020

Спасибо за ваш ответ. Я попробовал другой подход с Bash Script. Потому что я использую только Ubuntu Images.

Я делаю «git log» с фильтрацией для последнего коммита Справочника Микросервисов. С некоторым awk (не очень удачным решением) я получаю Project & Stage и записываю их в переменные конвейера. Конвейер запускается только при изменении в Microservices / * Path.

trigger:
  batch: true
  branches:
    include:
    - master
  paths:
    include: 
    - Microservices/*

Первым заданием, когда активируется триггер, является задание Dynamic_variables. Это задание я использую только для задания переменных $ (Project) и $ (Stage). Кроме того, теги сборки устанавливаются с этими переменными, так что я могу дифференцировать артефакты в релизах.

jobs:
  - job: Dynamic_Variables
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - checkout: self
      - task: Bash@3
        name: Dynamic_Var
        inputs:
          filePath: './scripts/multi-usage.sh'
          arguments: '$(Build.SourcesDirectory)'
        displayName: "Set Dynamic Variables Project"
      - task: Bash@3
        inputs:
          targetType: 'inline'
          script: |
            set +e
            if [ -z $(Dynamic_Var.Dynamic_Project) ]; then
            echo "target Project not specified";
            exit 1;
            fi
            echo "Project is:" $(Dynamic_Var.Dynamic_Project)
        displayName: 'Verify that the Project parameter has been supplied to pipeline'
      - task: Bash@3
        inputs:
          targetType: 'inline'
          script: |
            set +e
            if [ -z $(Dynamic_Var.Dynamic_Stage) ]; then
            echo "target Stage not specified";
            exit 1;
            fi
            echo "Stage is:" $(Dynamic_Var.Dynamic_Stage)
        displayName: 'Verify that the Stage parameter has been supplied to pipeline'

Скрипт Bash, который я запускаю в этом задании, выглядит следующим образом:

#!/usr/bin/env bash
set -euo pipefail

WORKING_DIRECTORY=${1}
cd ${WORKING_DIRECTORY}

CHANGEPATH="$(git log -1 --name-only --pretty='format:' -- Microservices/)"
Project=$(echo $CHANGEPATH | awk -F[/] '{print $2}')
CHANGEFILE=$(echo $CHANGEPATH | awk -F[/] '{print $4}')
Stage=$(echo $CHANGEFILE | awk -F[-] '{print $1}')
echo "##vso[task.setvariable variable=Dynamic_Project;isOutput=true]${Project}"
echo "##vso[task.setvariable variable=Dynamic_Stage;isOutput=true]${Stage}"
echo "##vso[build.addbuildtag]${Project}"
echo "##vso[build.addbuildtag]${Stage}"

Если у кого-то есть лучшее решение, тогда команды awk, пожалуйста, дайте мне знать. Большое спасибо. KR

...