Azure DevOps流水线循环获取SecureFile路径报错的解决方法
解决Azure DevOps流水线循环访问Secure File路径的问题
问题原因
你在bash脚本中使用$(${taskName}.secureFilePath)的写法错误,bash会将该表达式识别为待执行的命令而非环境变量引用。Azure DevOps会将任务输出变量转换为全大写、下划线分隔的环境变量,例如任务名为abc_def时,其secureFilePath输出对应的环境变量是ABC_DEF_SECUREFILEPATH。另外你代码中还存在笔误:循环内写的是secureFileName,实际应该是secureFilePath。
解决方案
方案一:Bash间接环境变量引用
修改AWSShellScript任务的内联脚本,通过转换变量名格式并使用bash间接引用语法获取路径:
- task: AWSShellScript@1 displayName: 'someDisplayName' inputs: awsCredentials: ${{ parameters.credentials }} regionName: $(DEFAULT_REGION) scriptType: 'inline' inlineScript: | sanitizedTaskNames="${{ join(' ', parameters.secureFileNames) }}" sanitizedTaskNames=${sanitizedTaskNames//./_} for taskName in $sanitizedTaskNames; do # 将任务名转为大写,拼接环境变量后缀 env_var=$(echo "${taskName}_SECUREFILEPATH" | tr '[:lower:]' '[:upper:]') # 间接引用环境变量获取文件路径 echo "${!env_var}" # 在这里添加对文件的操作逻辑,比如 cat "${!env_var}" done
方案二:模板编译阶段预生成路径列表
利用Azure DevOps模板表达式,在流水线编译阶段直接生成所有Secure File的路径列表,避免bash环境变量转换的麻烦:
- task: AWSShellScript@1 displayName: 'someDisplayName' inputs: awsCredentials: ${{ parameters.credentials }} regionName: $(DEFAULT_REGION) scriptType: 'inline' inlineScript: | # 编译阶段生成所有Secure File的路径数组 secureFilePaths=(${{ join(' ', parameters.secureFileNames | replace('.', '_') | map('format', '$({0}.secureFilePath)') ) }}) for filePath in "${secureFilePaths[@]}"; do echo "$filePath" # 执行文件操作,例如 cp "$filePath" /target/dir done
内容的提问来源于stack exchange,提问作者Dominique M
相关产品推荐
相关产品推荐

