You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的执行环境:

  1. 用sudo -E保留当前环境
    修改执行脚本的命令,添加-E参数让sudo保留当前用户的环境变量:

    sudo -E ./testing.sh
    

    这样ert变量就能被脚本中的env命令捕获到。

  2. 直接在sudo命令中指定环境变量
    如果只需要传递特定变量,可以在sudo后直接声明:

    sudo ert=hola ./testing.sh
    
  3. 结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:47:12