GitHub Actions中Secrets无法注入Node.js应用环境变量问题
Node.js应用无法读取GitHub Actions注入的环境变量问题
已在GitHub仓库设置中添加Secret变量,需求为:
- 从Secrets读取变量
- 将变量注入环境供Node.js应用读取
目前问题:MySQL初始化阶段Secrets可正常调用,但Node.js代码因缺失环境变量报错,相关Workflow配置如下:
# .github/workflows/nodejs.yml name: Node.js CI on: push: branches: [ "main" ] pull_request: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [14.x, 16.x, 18.x] services: mysql: image: mysql:5.7 env: # user: root, password: root (default) MYSQL_DATABASE: ${{ secrets.employeeadmin }} MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }} ports: - 3306:3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - uses: actions/checkout@v3 - name: MySQL Initialization Script run: | mysql -h127.0.0.1 -u${{ secrets.MYSQL_USER }} -p${{ secrets.MYSQL_ROOT_PASSWORD }} -e "CREATE DATABASE IF NOT EXISTS ${{ secrets.MYSQL_DATABASE }};" mysql -h127.0.0.1 -u${{ secrets.MYSQL_USER }} -p${{ secrets.MYSQL_ROOT_PASSWORD }} ${{ secrets.MYSQL_DATABASE }} < assets/schema.sql - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' - name: Start application run: sudo npm start env: # issue these variables are not available to nodejs app DATABASE_HOST: ${{secrets.DATABASE_HOST}} DATABASE_PORT: ${{secrets.DATABASE_PORT}} MYSQL_DATABASE: ${{secrets.MYSQL_DATABASE}} MYSQL_USER: ${{secrets.MYSQL_USER}} MYSQL_PASSWORD: ${{secrets.MYSQL_PASSWORD}} MYSQL_ROOT_PASSWORD: ${{secrets.MYSQL_ROOT_PASSWORD}} - name: Run tests run: npm test
核心问题:sudo重置环境变量
你的Start application步骤使用了sudo npm start,sudo会默认清除大部分环境变量,导致注入的Secrets变量无法被Node.js进程读取。
修复方案
方案一:移除sudo
GitHub Actions的Ubuntu runner环境中,普通用户权限已足够运行npm start,直接修改步骤:
- name: Start application run: npm start env: DATABASE_HOST: ${{secrets.DATABASE_HOST}} DATABASE_PORT: ${{secrets.DATABASE_PORT}} MYSQL_DATABASE: ${{secrets.MYSQL_DATABASE}} MYSQL_USER: ${{secrets.MYSQL_USER}} MYSQL_PASSWORD: ${{secrets.MYSQL_PASSWORD}} MYSQL_ROOT_PASSWORD: ${{secrets.MYSQL_ROOT_PASSWORD}}
方案二:使用sudo -E保留环境变量
如果确实需要sudo权限,添加-E参数让sudo保留当前环境变量:
- name: Start application run: sudo -E npm start env: DATABASE_HOST: ${{secrets.DATABASE_HOST}} DATABASE_PORT: ${{secrets.DATABASE_PORT}} MYSQL_DATABASE: ${{secrets.MYSQL_DATABASE}} MYSQL_USER: ${{secrets.MYSQL_USER}} MYSQL_PASSWORD: ${{secrets.MYSQL_PASSWORD}} MYSQL_ROOT_PASSWORD: ${{secrets.MYSQL_ROOT_PASSWORD}}
额外检查项
- 确认Node.js代码中正确读取环境变量,比如使用
process.env.DATABASE_HOST的标准方式 - 核对仓库Secrets中的变量名是否与Workflow配置完全一致,避免拼写错误
内容的提问来源于stack exchange,提问作者AppDeveloper
相关产品推荐
相关产品推荐

