Github Actions环境变量与脚本内环境变量不一致问题排查
GitHub Actions环境变量无法传递到sudo执行脚本的问题分析
问题描述
我设置了如下GitHub Actions工作流:
name: System Test on: repository_dispatch: types: - test jobs: run-tests: runs-on: ubuntu-latest steps: - name: Checkout Testing Repository uses: actions/checkout@v3 - name: setting env env: ert: hola run: | echo "test: $ert" echo "ert=hola" >> $GITHUB_ENV env - name: System testing (build + execution) run: | ls export ert=hola chmod +x testing.sh sudo ./testing.sh
我尝试了各种方法都没得到预期结果:setting env步骤里的env命令能显示ert=hola,但testing.sh脚本(仅包含一条env命令)里却看不到这个变量。为什么这个变量没被设置成环境变量?
原因与解决方案
核心原因:sudo默认重置环境变量
当使用sudo执行命令时,系统会默认以root用户的干净环境运行,会清除当前用户的大部分环境变量,包括你设置的ert。哪怕你在当前shell里export ert=hola,sudo执行时也不会携带这个变量。
解决方法
有几种方式可以让环境变量传递到sudo的执行环境:
用
sudo -E保留当前环境
修改执行脚本的命令,添加-E参数让sudo保留当前用户的环境变量:sudo -E ./testing.sh这样
ert变量就能被脚本中的env命令捕获到。直接在sudo命令中指定环境变量
如果只需要传递特定变量,可以在sudo后直接声明:sudo ert=hola ./testing.sh结合
GITHUB_ENV的变量直接传递
你已经通过echo "ert=hola" >> $GITHUB_ENV把变量写入了环境文件,后续步骤中不需要手动export,直接结合sudo参数使用即可:sudo -E ./testing.sh或者精准传递单个变量:
sudo ert=$ert ./testing.sh
补充说明
GITHUB_ENV设置的变量会自动在后续步骤中生效,所以System testing步骤里不需要手动export ert=hola,直接引用$ert即可。- 如果需要让脚本以root身份运行且保留所有环境变量,
sudo -E是最简便的方式;如果只需要传递个别变量,直接在sudo命令前指定更安全,避免不必要的环境变量泄露。
内容的提问来源于stack exchange,提问作者ATLAS
相关产品推荐
相关产品推荐

