GitHub Action动态生成含GITHUB_SHA的tar文件名报错解决
问题:GitHub Actions中使用Commit SHA动态命名tar包失败
在GitHub Actions部署Workflow中,尝试将制品打包为tar文件并使用github.sha作为文件名,编写了以下步骤:
- name: Create deployment artificact with ${{ github.sha }} as Commit-Hash env: GITHUB_SHA: ${{ github.sha }} run: tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
使用静态名称(如app.tar.gz)时能正常运行,但动态命名报错,错误信息如下:
0s Run tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests * tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests * shell: /usr/bin/bash -e {0} env: GITHUB_SHA: 134e1d9adb515cfe908866092a37aa0880ada128 /home/runner/work/_temp/32bf4668-1034-4849-9eab-b789d201b43f.sh: line 1: ${ GITHUB_SHA }: bad substitution Error: Process completed with exit code 1.
解决方案
错误原因
报错bad substitution是因为Bash变量引用时,${ GITHUB_SHA }里的变量名和大括号之间多了空格,Bash无法识别这个变量格式。
修改方式1:修正变量引用格式并简化步骤
去掉变量名前后的空格,同时无需手动定义env(GitHub Actions会自动注入GITHUB_SHA环境变量):
- name: Create deployment artifact with commit SHA as filename run: tar vcfz "${GITHUB_SHA}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
修改方式2:直接使用GitHub表达式拼接文件名
跳过环境变量,直接在run命令里用${{ github.sha }}生成文件名:
- name: Create deployment artifact with commit SHA as filename run: tar vcfz "${{ github.sha }}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
额外优化建议
- 建议调整tar参数顺序为
tar czfv(f参数紧跟文件名是更标准的写法,避免部分环境下的参数解析问题):
run: tar czfv "${GITHUB_SHA}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
- 避免用
*通配所有文件,可明确指定要打包的目录/文件,减少不必要的内容被打包。
内容的提问来源于stack exchange,提问作者MartinTTS
相关产品推荐
相关产品推荐

