Как передать текущее значение «p», используя ${{ каждый p в parameters.param}}, в сценарий bash в конвейере Azure?

#bash #azure-devops #azure-pipelines

Вопрос:

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

Вопрос в следующем: как мне получить текущее значение, которое цикл представляет в bash, чтобы выполнить с ним действие?

Пример:

 parameters:
- name: NameAndID
  type: object
  default: []
- name: jobsToRun
  type: string
  default: ''


jobs:
- job: DoTheThing
  displayName: "Update with val A and val B"
  steps:
    - ${{ each p in parameters.NameAndID }}:
      ??  << assign Bash accessible variable 'NAME_ID' to ${{ p }} >> ??
      - bash: 
          AF=$NAME_ID | cut -d '~' -f1)
          echo "##vso[task.setvariable variable=AF_NAME]$AF"
          PROJ=$NAME_ID | cut -d '~' -f2)
          echo "##vso[task.setvariable variable=PROJ_NUM]$PROJ" 
 

Таким образом, предполагая, что переданные значения параметров являются:

 A~1
B~2
C~3
...
 

Для каждого экземпляра сценарий должен создавать переменные

 Loop 1
  $AF_NAME = A
  $PROJ_NUM = 1
Loop 2
  $AF_NAME = B
  $PROJ_NUM = 2
Loop 3
  $AF_NAME = C
  $PROJ_NUM = 3
 

и так далее…
Так что шаг, который я не могу понять, это
<< назначьте переменную, доступную для bash, $ {{p }} >< назначьте переменную, доступную для bash, $ {{p }} >>
Как я могу присвоить новое значение ${{ p }} переменной, которую bash может считывать каждый раз, когда происходит цикл?

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

ТИА

Фреймиш

Ответ №1:

Как мне получить текущее значение, которое цикл представляет в bash, чтобы выполнить с ним действие?

Вы можете использовать следующий скрипт в bash:

 NAME_ID=${{ p }}
 

Тогда переменная NAME_ID будет иметь значение параметра в текущем цикле.

Вот мой тестовый сценарий:

 trigger: none

pool:
  vmImage: ubuntu-latest

parameters:
- name: NameAndID
  type: object
  default:
  - A~1
  - B~2
  - C~3


jobs:
- job: DoTheThing
  displayName: "Update with val A and val B"
  steps:
    - ${{ each p in parameters.NameAndID }}:
      - bash: |
          NAME_ID=${{ p }}
          AF=$( echo "$NAME_ID" | cut '-d~' "-f1" )
          PROJ=$( echo "$NAME_ID" | cut '-d~' "-f2" )

          echo "$NAME_ID"
          echo "$AF"
          echo "$PROJ"
 

И это прекрасно работает:

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Комментарии:

1. Это сработало! Большое спасибо. Один из последующих вопросов: почему одинарные и двойные кавычки в этой cut '-d~' "-f1" части?

2. @Freymish В этом нет необходимости, и вместо этого вы можете использовать свои команды вырезания! 🙂 Я не знаком с bash и напрямую использую команды в учебнике.