如何在GitHub Action部署Node.js进程时设置环境变量
解决GitHub Action中Node.js无法获取环境变量的问题
你遇到的核心问题其实是sudo执行命令时会重置环境变量,导致Node.js进程读不到ENGINE_API_KEY。下面是具体的解决方案和修改建议:
关键原因
在GitHub Action的Ubuntu runner环境中,使用sudo执行命令时,默认会清除当前用户的所有环境变量(包括你在工作流/步骤中定义的env)。这就是为什么本地Mac上可行但CI中不行的原因——本地sudo的配置可能保留了环境变量,而CI环境的sudo是严格重置的。
解决方案步骤
1. 移除不必要的sudo(推荐)
GitHub Action的ubuntu-latest runner默认使用的runner用户已经拥有足够权限执行npm install、全局包安装等操作,完全不需要sudo。去掉sudo后,环境变量会正常传递给Node.js进程:
修改后的步骤代码:
- name: Apollo Schema Update env: ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }} run: | npm install npm install -g apollo npm run dev & sleep 3 apollo service:push --serviceURL=http://auth-cluster-ip-service --serviceName=auth --tag=master --endpoint=http://localhost:3051
2. 如果必须使用sudo(不推荐)
如果你的场景确实离不开sudo,需要添加-E参数强制保留当前环境变量:
- name: Apollo Schema Update env: ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }} run: | sudo -E npm install sudo -E npm install -g apollo sudo -E npm run dev & sleep 3 sudo -E apollo service:push --serviceURL=http://auth-cluster-ip-service --serviceName=auth --tag=master --endpoint=http://localhost:3051
3. 优化环境变量定义
你已经在工作流级别定义了env,步骤里可以不用重复声明,简化代码:
name: Build and Deploy to GKE on: pull_request: branches: - master env: ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }} # 全局生效,所有步骤都能访问 jobs: setup-build-publish-deploy: name: Setup, Build, Publish, and Deploy runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Apollo Schema Update run: | npm install npm install -g apollo npm run dev & sleep 3 apollo service:push --serviceURL=http://auth-cluster-ip-service --serviceName=auth --tag=master --endpoint=http://localhost:3051
额外验证建议
- 在
npm run dev前添加一行echo $ENGINE_API_KEY,确认环境变量在步骤中是否能正常读取:run: | echo "ENGINE_API_KEY is: $ENGINE_API_KEY" # 验证变量是否存在 npm install # ... 其他命令 - 如果你的Node.js项目使用了
dotenv,确保没有在代码中覆盖环境变量,或者不需要额外加载.env文件(CI中直接用GitHub Secrets传递即可)。
内容的提问来源于stack exchange,提问作者Sihoon Kim
相关产品推荐
相关产品推荐

