GitHub Actions工作流action入参环境变量未解析问题
问题根因
run步骤能正常识别路径,是因为run字段的内容会传入shell执行,shell会自动解析${VAR}格式的环境变量;但action的with入参不会经过shell解析流程,直接写shell风格的${GITHUB_WORKSPACE}、${FILE_NAME}时,action拿到的是未替换的原文字符串,自然会提示文件不存在。
解决方案
两种配置方式任选其一即可:
方案1:使用GitHub Actions原生表达式语法引用变量
GitHub Actions 工作流字段、action入参的变量取值,必须使用${{ }}包裹的表达式语法,从对应上下文(环境变量存于env上下文、内置工作区路径存于github上下文、密钥存于secrets上下文)中取值,修改后的上传步骤配置如下:
- uses: hkusu/s3-upload-action@v2 id: upload with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: "eu-west-2" aws-bucket: ${{ secrets.AWS_BUCKET }} # 用Actions原生表达式拼接路径,不要用shell的${}变量写法 file-path: ${{ github.workspace }}/build/${{ env.FILE_NAME }}.zip output-file-url: "true"
如果FILE_NAME是之前步骤通过echo "FILE_NAME=xxx" >> $GITHUB_ENV写入的环境变量,${{ env.FILE_NAME }}同样可以正常取到值。
方案2:提前拼接完整路径存入环境变量再引用
如果路径拼接逻辑复杂,可以提前在run步骤中把完整文件路径写入环境变量,再在action入参中直接引用:
# 提前拼接完整路径并存为环境变量 - run: | ls -l "${GITHUB_WORKSPACE}/build/${FILE_NAME}.zip" echo "FULL_FILE_PATH=${GITHUB_WORKSPACE}/build/${FILE_NAME}.zip" >> $GITHUB_ENV - uses: hkusu/s3-upload-action@v2 id: upload with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: "eu-west-2" aws-bucket: ${{ secrets.AWS_BUCKET }} file-path: ${{ env.FULL_FILE_PATH }} output-file-url: "true"
避坑提示
- 不要混淆两种变量语法:shell执行环境内用
${VAR}格式,工作流配置字段、action入参必须用${{ 上下文.变量名 }}的表达式格式 - 不需要给
with块的参数值额外套多余引号,多余引号会被识别为路径的一部分,反而导致路径匹配失败
内容的提问来源于stack exchange,提问作者TrivialCase
相关产品推荐
相关产品推荐

