【问题标题】:how can we pass variable as a parameters(as a list)我们如何将变量作为参数传递(作为列表)
【发布时间】:2020-08-22 09:27:51
【问题描述】:

我们可以将变量作为参数(作为列表)传递吗?

下面的代码不起作用。这意味着它不会将它作为一个列表,而是将它作为一个参数作为整个字符串。 例如:

我们有 $(templateParm) = dir1/dir2, dir3/dir4

  • -模板:dockerBuild.yml

    参数:

      DOCKER_FILE: [ "$(templateParm)" ]
      SOURCE_BRANCH_NAME: $(Build.SourceBranchName)
      BUILD_NUMBER: $(Build.BuildNumber)
      SOURCE_DIR: $(Build.SourcesDirectory)   
    

如果我们像下面这样在此处传递值,它将把它作为一个列表。这意味着它将它作为 2 个参数。

  • -模板:dockerBuild.yml

    参数:

      DOCKER_FILE: [ "dir1/dir2", "dir3/dir4" ]
      SOURCE_BRANCH_NAME: $(Build.SourceBranchName)
      BUILD_NUMBER: $(Build.BuildNumber)
      SOURCE_DIR: $(Build.SourcesDirectory)
    

有什么解决办法吗?

【问题讨论】:

    标签: bash arraylist azure-devops yaml parameter-passing


    【解决方案1】:

    这是不可能的。 TemplateParam 将始终是一个字符串。但您可以尝试不同的方法。

    如果您以这种方式定义模板:

    #template.yaml
    parameters:
    - name: 'DOCKER_FILES'
      type: object
      default: {}
    - name: 'server'
      type: string
      default: ''
    
    steps:
    - ${{ each dockerFile in parameters.DOCKER_FILES }}:
      - script: echo ${{ parameters.server }}:${{ dockerFile }}
    

    并在此构建

    
    pool:
      vmImage: 'ubuntu-latest'
    
    steps:
    - template: template.yaml
      parameters:
        DOCKER_FILES: 
        - "dir1/dir2"
        - "dir3/dir4"
        server: someServer
    

    但是在这种情况下,您仍然需要将它们分开放置。变量至少目前被视为字符串。

    我也尝试了这种方法:Pass pipeline variable from Designer to YAML job template 但我得到了相同的结果。

    编辑

    下面这行不通。我只是想展示我为节省您的时间所做的努力。

    我尝试过这样的事情:

    variables:
    - name: templateParam
      value: "dir1/dir2,dir3/dir4"
    
    pool:
      vmImage: 'ubuntu-latest'
    
    steps:
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
            $array = $variable.Split(',)
            Write-Host "##vso[task.setvariable variable=templateParamArray]$array"
    - template: template.yaml
      parameters:
        instances: 
        ${{ each s in templateParamArray }}:
          - ${{ s }}:
        server: someServer
    

    但没有成功。你也可以对这个developer community topic感兴趣。

    总而言之,我认为目前无法实现您想要实现的目标,将列表放在一个变量中。

    【讨论】:

    • 我不够清楚。变量中不可能有数组。我只是在上面展示了我试图节省您的时间的方法。只有第一部分在您有单独项目的地方工作。很抱歉给您带来不便。
    • 感谢 Krzysztof Madej,但我们在使用实例时遇到了一些问题。我们在 parms=dir1/dir2,dir3/dir4 中传递参数 将参数作为环境变量传递 echo "##vso[task.setvariable variable=templateParm]$parms" - 模板:template.yaml 参数:DOCKER_FILE:${{ templateParm 中的每个 }}:-${{ s }}:BUILD_NUMBER:$(Build.BuildNumber) SOURCE_DIR:$(Build.SourcesDirectory ) 输出:无法识别的值:'templateParm'。位于表达式中的位置 1:templateParm。你能建议吗!
    • 感谢 Krzysztof Madej 兄弟
    • 我建议将它们保存在单独的变量中并使用它: pool: vmImage: 'ubuntu-latest' 步骤:-模板:template.yaml 参数:DOCKER_FILES:-“dir1/dir2”- “dir3/dir4”服务器:someServer
    • 但很可能变量不是固定的,当文件夹发生变化时它会动态出现。那么我们如何才能将它们分开呢?
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2014-10-20
    相关资源
    最近更新 更多