首页 > 解决方案 > 如何使用 each 表达式连接 Azure Pipelines 中的 bash 脚本

问题描述

我有几个地方,需要在部署的各个阶段定义一组 K8s 机密,所以我想将循环脚本提取到模板中:

parameters:
  - name: secretName
    type: string
    default: ""
  - name: secrets
    type: object
    default:
      Foo: Bar

steps:
  - task: Bash@3
    displayName: Create generic secret ${{ parameters.secretName }}
    inputs:
      targetType: inline
      script: |
        echo "Creating generic secret ${{ parameters.secretName }}"
        microk8s kubectl delete secret ${{ parameters.secretName }}
        microk8s kubectl create secret generic ${{ parameters.secretName }} ${{ each secret in parameters.secrets }}: --from-literal=${{ secretKey }}="${{ secret.value }}" 

我想多次这样称呼它,为每个阶段的部署创建所有必要的秘密

- job: CreateSecrets
  pool:
    name: $(poolName)
  steps:
    - template: "Templates/template-create-secret.yml"
      parameters:
        secretName: "testSecret"
        secrets:
          username: $(staging-user)
          password: $(staging-password)
          foo: $(bar)

它应该简单地执行一个类似于这个的脚本:

kubectl create secret generic secretName \
  -- from-literal=username=user1 \
  -- from-literal=password=pass1 \
  -- ...etc 

使用我目前的方法,我收到错误:

/Code/BuildScripts/Templates/template-create-secret.yml(第 18 行,第 15 列):在此上下文中不允许使用指令“每个”。嵌入在字符串中的表达式不支持指令。仅当整个值是表达式时才支持指令。

如何迭代对象类型的参数并使用其键和值来为 bash 构建字符串?另一种方法是简单地为每个秘密使用一个键值对并创建多个秘密,我想避免这种情况

标签: bashkubernetesazure-devopsyamlazure-pipelines

解决方案


根据文档:参数数据类型,我们可以知道我们需要在脚本之前使用“每个”关键字,这里是帮助您了解更多关于运行时参数的文档。这是演示脚本:

parameters:
- name: listOfStrings
  type: object
  default:
  - one
  - two

steps:
- ${{ each value in parameters.listOfStrings }}:
  - script: echo ${{ value }}

推荐阅读