Azure DevOps Shell脚本无法检测Jfrog Artifactory组是否存在
问题分析与修复方案
问题根源
- jq返回结果带引号导致匹配失败:当Artifactory组存在时,
jq .name返回的是带双引号的字符串(例如"demo-project-developers"),但判断条件中直接与无引号的${{ project.projectname }}-developers做比较,两者不相等,因此第一个if分支永远不会执行。 - curl 404错误未正确处理:当组不存在返回404时,curl会抛出错误,此时
exists_grp变量可能为空或包含错误信息,而非预期的null,导致第二个if分支逻辑也可能失效。 - YAML语法缺失:原配置中
job节点下缺少steps关键字,这是Azure DevOps任务执行的必要结构,可能导致脚本无法被正确识别。
修复后的脚本
stages: - ${{ each project in parameters.projectList }}: - stage: Group_Creation_${{ project.projectname }} displayName: 'Group creation for the ${{ project.projectname }}' variables: - group: jfrog-config pool: name: az-dev jobs: - job: GroupExistanceCheck steps: - script: | echo "Checking if Groups already exists..." # 用-r返回无引号纯字符串,同时处理404场景返回null exists_grp=$(curl -s -u '$(jfuser):$(jfpass)' -X GET "$(jfurl)/api/security/groups/${{ project.projectname }}-developers" | jq -r '.name // "null"') if [[ "$exists_grp" == "${{ project.projectname }}-developers" ]] ; then echo "${{ project.projectname }}-developers is existing and nothing to do" elif [[ "$exists_grp" == "null" ]]; then echo "${{ project.projectname }}-developers is NOT existing and will be creating now" /azp/_work/_tool/jf/2.25.5/x64/jf rt group-create ${{ project.projectname }}-developers --url $(jfurl) --user $(jfuser) --password $(jfpass) else echo "Unexpected response when checking group existence" fi displayName: 'check Developer Group Existance & create if not existing'
关键修改说明
jq -r参数:-r(raw output)让jq返回不带双引号的纯文本字符串,确保与判断条件中的组名完全匹配。- 404场景处理:使用
jq '.name // "null"',当API返回404或.name字段不存在时,强制返回字符串"null",保证变量有预期值。 - 逻辑优化:将两个独立
if改为if-elif-else,避免分支重叠,同时增加异常分支处理未知情况。 - 补充
steps关键字:修复Azure DevOps YAML的语法结构,确保脚本任务能被正确加载执行。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

