【问题标题】:Azure Devops - Setting variable in YAML script to datetimeAzure Devops - 将 YAML 脚本中的变量设置为日期时间
【发布时间】:2019-06-16 06:31:15
【问题描述】:

我正在尝试为 Azure DevOps YAML 管道中的 NuGet 包生成名称。

上下文是在每个自动构建上使用包名称、分支名称、日期和递增的修订号创建包。

packageName-branchName-year-month-day-revision

这样,当一个新的特性分支被创建时,它会生成一个独特的包,可用于在需要它的项目中进行测试。

我正在努力根据日期或修订号等环境变量在 YAML 文件中设置一个变量。

使用##vso 命令,我可以将'myVariable' 设置为hello 并打印出来。

- script: |
    echo '##vso[task.setvariable variable=myVariable]hello'

- script: |
    echo my variable is $(myVariable)

当我尝试按如下方式从 PowerShell 设置变量时,我收到以下错误“#$dateStr”不被识别为内部或外部命令”。

# Create a variable
- script: |
    #$dateStr = (Get-Date).ToString('yyyy-MM-dd') 
    echo '##vso[task.setvariable variable=myVariable]#$dateStr'

# Print the variable
- script: |
    echo my variable is $(myVariable) 

当我尝试在 YAML 文件的变量部分中设置变量时。

variables:
  solution: '**/*.sln'
  foo: $(Date:yyyyMMdd)

- script: |
    echo my variable is $(foo)

变量没有被插值,它输出为。

'我的变量是 $(Date:yyyyMMdd)'

如何根据 $(rev) 和 $(Date) 等环境变量创建变量?

【问题讨论】:

    标签: azure-devops yaml azure-pipelines devops


    【解决方案1】:

    我认为没有内置的date 变量,但对于 powershell 情况,您只需在变量之前删除 # 并且必须用 " 括起来,否则 powershell 不会扩展您的变量

    echo "##vso[task.setvariable variable=myVariable]$dateStr"
    

    【讨论】:

      【解决方案2】:

      感谢您的帮助。

      这就是我最终解决问题的方法。对于非发布分支,我使用 build# + beta + 分支名称为我正在创建的 nuget 包生成一个唯一名称。对于发布分支,我只使用构建#。

      # Create version number for non release package(s) - 1.0.xxx-beta-develop for example
      - powershell: |
          [String]$buildNumber = $Env:BUILD_BUILDNUMBER.Substring($Env:BUILD_BUILDNUMBER.LastIndexOf('.') + 1)
          [String]$branchName = $Env:BUILD_BUILDNUMBER.Substring(0, $Env:BUILD_BUILDNUMBER.LastIndexOf('.'))
          Write-Host "##vso[task.setvariable variable=nugetVersion]1.0.$($buildNumber)-beta-$($branchName)"
        displayName: 'Create beta version number for production nuget packages - run when in non release branch' 
        condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'release/'))
      
      # Create version number for release package(s) - 1.0.xxx for example
      - powershell: |
          [String]$buildNumber = $Env:BUILD_BUILDNUMBER.Substring($Env:BUILD_BUILDNUMBER.LastIndexOf('.') + 1)
          Write-Host "##vso[task.setvariable variable=nugetVersion]1.0.' + $($buildNumber)
        displayName: 'Create version number for production nuget packages - run when in release branch' 
        condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'release/'))
      
      
      - task: NuGetCommand@2
        inputs:
          command: 'pack' # Options: restore, pack, push, custom
          versioningScheme: byEnvVar
          versionEnvVar: nugetVersion
          packDestination: '$(Build.ArtifactStagingDirectory)\nuget'
          packagesToPack: '**/Floww.*.nuspec'     
      

      【讨论】:

        【解决方案3】:

        使用-script 非常适合运行可以跨平台执行的命令,例如npm i

        由于日期不是全局变量,您需要创建它。问题在于,根据您正在运行的构建代理 (window|mac|linx),您将有不同的方法来设置该变量,请参阅 documentation...

        以下将允许您像其他变量一样使用$d 变量

         steps:
            - bash: |
                export d=$(date +%F)
                echo "The Date is $d"
                echo "##vso[task.setvariable variable=fileName]$d"
              condition: eq( variables['Agent.OS'], 'Linux' )
            - powershell: |
                Set-Variable -Name d -Value (Get-Date).ToString('yyyy-MM-dd')
                Write-Host "##vso[task.setvariable variable=fileName]$d"
              condition: eq( variables['Agent.OS'], 'Windows_NT' )
        

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 1970-01-01
          • 1970-01-01
          • 2020-05-29
          • 2021-11-16
          • 2020-01-18
          • 2022-10-13
          • 1970-01-01
          • 2022-06-29
          相关资源
          最近更新 更多