Azure Pipeline Maven任务设置输出变量的正确方法
解决Azure Pipeline中Maven@4任务设置输出变量的问题
为什么会出现"Unexpected property script"错误
Maven@4任务的inputs配置项中并没有script属性,直接添加这个属性属于无效配置,因此会抛出该错误。
正确设置输出变量的两种方法
方法一:在Maven任务后添加独立脚本任务
通过PowerShell或Bash任务检查目标目录下的JAR文件,再用Azure Pipeline的日志命令设置输出变量:
PowerShell版本
- task: Maven@4 displayName: 'XYZ' inputs: mavenPomFile: 'pom.xml' goals: 'package' # 填写你的其他Maven配置项 - task: PowerShell@2 name: SetSnapshotVar # 任务名称,后续通过此名称引用变量 displayName: '检查SNAPSHOT包并设置变量' inputs: targetType: 'inline' script: | # 查找目标目录下的JAR文件 $jarFiles = Get-ChildItem -Path "$(Build.ArtifactStagingDirectory)\*.jar" -ErrorAction SilentlyContinue # 判断是否包含SNAPSHOT $hasSnapshot = $jarFiles.Name -match 'SNAPSHOT' # 设置输出变量,isOutput=true标记为跨任务可用 Write-Host "##vso[task.setvariable variable=VAR;isOutput=true]$hasSnapshot" # 后续任务中引用变量 - script: | echo "VAR的值是: $(SetSnapshotVar.VAR)" displayName: '使用输出变量'
Bash版本
- task: Maven@4 displayName: 'XYZ' inputs: mavenPomFile: 'pom.xml' goals: 'package' # 填写你的其他Maven配置项 - task: Bash@3 name: SetSnapshotVar displayName: '检查SNAPSHOT包并设置变量' inputs: targetType: 'inline' script: | # 检查是否存在含SNAPSHOT的JAR文件 if ls $(Build.ArtifactStagingDirectory)/*SNAPSHOT*.jar 1> /dev/null 2>&1; then echo "##vso[task.setvariable variable=VAR;isOutput=true]true" else echo "##vso[task.setvariable variable=VAR;isOutput=true]false" fi # 后续任务中引用变量 - script: | echo "VAR的值是: $(SetSnapshotVar.VAR)" displayName: '使用输出变量'
方法二:利用Maven@4的postBuildScript属性
如果希望在Maven构建完成后直接执行检查逻辑,可以使用任务自带的postBuildScript配置项(仅适用于Bash环境):
- task: Maven@4 name: MavenBuild displayName: 'XYZ' inputs: mavenPomFile: 'pom.xml' goals: 'package' # 填写你的其他Maven配置项 postBuildScript: | # 检查并设置输出变量 if ls $(Build.ArtifactStagingDirectory)/*SNAPSHOT*.jar 1> /dev/null 2>&1; then echo "##vso[task.setvariable variable=VAR;isOutput=true]true" else echo "##vso[task.setvariable variable=VAR;isOutput=true]false" fi # 后续任务中引用变量 - script: | echo "VAR的值是: $(MavenBuild.VAR)" displayName: '使用输出变量'
关键说明
- 使用
##vso[task.setvariable]日志命令是Azure Pipeline中设置跨任务变量的标准方式,isOutput=true会将变量标记为任务输出变量,允许同作业内的后续任务通过任务名称.变量名的格式引用。 - 你最初尝试的
${{ contains($(Build.ArtifactStagingDirectory)/*.jar, 'SNAPSHOT')}}表达式无法直接生效,因为contains函数仅用于字符串匹配,无法处理文件通配符,必须通过脚本实际检查文件系统中的文件。
内容的提问来源于stack exchange,提问作者Stack_IQ
相关产品推荐
相关产品推荐

