Способ запуска сценария bash перед перехватом перед развертыванием с помощью безагентного сервера в Azure Devops

Я создаю сценарий развертывания yaml в Azure Devops.

У меня есть требование использовать задачу ручной проверки для подтверждения таких изменений. Но перед этим мы должны установить переменную для одного из наших флагов в качестве условия для запуска указанной задачи ручной проверки.

Вот код сейчас:

    strategy:
      runOnce:
        preDeploy:        
          pool: server       
          steps:
          - script: |
                if [[ "$(clusterTags)" == *"HOTFIX"* ]]; then
                  echo "##vso[task.setvariable variable=hotfix]true"
                else
                  echo "##vso[task.setvariable variable=hotfix]false"
                fi
            name: SetHotfixVariable

          - task: ManualValidation@0
            timeoutInMinutes: 1440 # task times out in 1 day
            condition: eq(variables.hotfix, true)
            inputs:
              notifyUsers: ''
              instructions: 'Please validate the build configuration and resume'
              onTimeout: 'resume'
        deploy:
           #usual deployment script here

Я попробовал этот подход, но столкнулся с ошибкой, поскольку у меня есть сценарий оболочки в задании без агента. «SIT» — это задание сервера, но оно содержит задачу «CmdLine», которую можно запускать только на агентах.

Можно ли установить эти переменные перед задачей ручной проверки? Тег кластера получен из тегов запроса на извлечение из репозитория Azure.

Спасибо большое, Миш

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Боюсь, что невозможно запускать сценарии в заданиях сервера (задания без агента), такие задачи недоступны для заданий сервера для запуска сценариев.

Вам необходимо отделить задачу сценария от задания сервера и добавить ее к заданию агента. Установите задание сервера в зависимости от задания агента, чтобы задание агента могло выполняться раньше задания сервера.

В задаче сценария используйте команду setvariable, чтобы установить переменную как выходную переменную , чтобы ее можно было передавать между заданиями.

stages:
- stage: deploy
  jobs:
  - job: setVar
    steps:
    - checkout: none
    - task: Bash@3
      name: SetHotfixVariable
      inputs:
        targetType: inline
        script: |
          if [[ "$(clusterTags)" == *"HOTFIX"* ]]; then
            echo "##vso[task.setvariable variable=hotfix;isoutput=true]true"
          else
            echo "##vso[task.setvariable variable=hotfix;isoutput=true]false"
          fi
  
  - deployment: deploy
    dependsOn: setVar
    variables:
      hotfix: $[ dependencies.setVar.outputs['SetHotfixVariable.hotfix'] ]
    environment: myEnv
    strategy:
      runOnce:
        preDeploy:
          pool: server
          steps:
          - task: ManualValidation@0
            condition: eq(variables.hotfix, 'true')
            timeoutInMinutes: 1440
            inputs:
              notifyUsers: |
                [email protected]
                [email protected]
              instructions: 'Please validate the build configuration and resume.'
              onTimeout: resume
        deploy:
          . . .

Ответ принят как подходящий

Вам не нужно создавать выходную переменную с именем hotfix.

Вместо этого проверьте значение переменной конвейера clusterTags непосредственно в условии задания .

Пример

В следующем примере конвейера функция содержит в условии, проверяющем, содержит ли переменная clusterTags строку HOTFIX:

trigger: none

pool:
  vmImage: 'ubuntu-latest'

variables:
  - name: clusterTags
    value: 'fooHOTFIXbar' # <---------- change value to test the condition

jobs:
  - job: waitForValidation
    displayName: Wait for external validation
    pool: server
    timeoutInMinutes: 4320 # job times out in 3 days
    condition: contains(variables['clusterTags'], 'HOTFIX') # <-------- set job condition here
    steps:
    - task: ManualValidation@0
      timeoutInMinutes: 1440 # task times out in 1 day
      inputs:
        notifyUsers: ''
        instructions: 'Please validate the build configuration and resume'
        onTimeout: 'resume'

  - job: doSomething
    displayName: Do something
    dependsOn: waitForValidation
    steps:
    - checkout: none
    - script: echo "Hello, world!"

Привет, мы столкнулись с трудностями при доступе к результатам ручной проверки, если они приняты или отклонены. ручная проверка осуществлялась с помощью крючка жизненного цикла перед развертыванием, в то время как проверка решения происходит на крючке развертывания при условии.

Dan 13.08.2024 04:49

Крючок deploy не будет выполнен, если ручная проверка будет отклонена, разве это не то, что вам нужно? В качестве альтернативы вы можете использовать обычное задание, которое зависит от ручной проверки, как в моем примере.

Rui Jarimba 13.08.2024 10:26

Другие вопросы по теме

Azure Pipelines — обработка одинаковых имен переменных в разных группах переменных
Можно ли создавать образы докеров с несколькими архитектурами через конвейер?
Автоматическое преобразование значения Azure DevOps в целочисленный тип в yaml
Привести к сбою конвейера, если в журнале появляется определенное предложение. Найдите подстроку, но игнорируйте определенную подстроку
Сделать конвейер сбоем, если в журнале появляется определенное предложение
Ошибка конвейера Azure DevOps: не найден агент с версией выше 2.220.0
Можете ли вы условно использовать «netsh http add urlacl» в YAML-файле конвейера Azure?
Срок службы .NET Core SDK/среды выполнения 2.2 и 3.0 истек (EOL) и удален из всех размещенных агентов
Мой конвейер Azure не запускается, несмотря на выполнение условий
Термин «скрипт:» не распознается как имя командлета, функции, файла сценария или исполняемой программы

Похожие вопросы

Конвейер Azure Devops с дополнительным этапом, запускаемым вручную
Как запретить принудительную отправку только на главную, но при этом разрешить прямую (не принудительную) отправку в репозиториях git Azure DevOps
Azure Pipelines — обработка одинаковых имен переменных в разных группах переменных
Не могу найти нужные артефакты
Уменьшение объема хранилища пакетов Azure Devops
Как создать скрипт в учетной записи автоматизации для получения квот и используемой емкости для каждого общего файлового ресурса
Триггер нескольких репозиториев Azure. Почему он срабатывает несколько раз для одной и той же фиксации?
Невозможно воспроизвести приложение на основе холста после его импорта в другую среду/другой клиент (с использованием инструментов сборки Azure DevOps PP)
Azure Pipeline не удается извлечь подмодуль
Каковы варианты миграции VSS 6.0 в Azure DevOps, если у вас нет VSS 2005?