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

如何将GitHub Secrets注入NextJS应用的Vercel CI/CD部署

问题

希望使用GitHub Secrets中的环境变量(而非.env文件或Vercel直接配置)构建并部署NextJS应用到Vercel,开发环境工作流配置如下:

on:
  push:
    branches:
      - development

jobs:
  Deploy-Development:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Configure node
        uses: ./.github/actions/setup-project

      - name: Format & Lint code
        uses: ./.github/actions/format-code

      - name: Build app
        run: npm run build
        env:
          DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
          NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
          NEXT_ENV: 'development'

      - name: Deploy app to Vercel development env
        uses: ./.github/actions/vercel-deployment
        with:
          mode: 'development'
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
        env:
          VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
          VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
          VERCEL_FORCE_NO_BUILD_CACHE: 1
          DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
          NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
          API_KEY: ${{ secrets.API_KEY }}
          NEXT_ENV: 'development'

对应的action配置如下:

inputs:
  vercel-token:
    description: 'Vercel token'
    required: true
  mode:
    description: 'Deployment mode'
    required: true

runs:
  using: 'composite'
  steps:
    - name: Install Vercel CLI
      run: npm install --global vercel@canary
      shell: bash

    - name: PRODUCTION Vercel Deployment
      if: ${{ inputs.mode == 'production' }}
      run: |
        vercel pull --yes --environment=production --token=${{ inputs.vercel-token }}
        vercel build --prod --token=${{ inputs.vercel-token }}
        vercel deploy --prebuilt --prod --token=${{ inputs.vercel-token }}
      shell: bash

    - name: DEVELOPMENT Vercel Deployment
      if: ${{ inputs.mode == 'development' }}
      run: |
        vercel pull --yes --environment=development --token=${{ inputs.vercel-token }}
        vercel build --token=${{ inputs.vercel-token }}
        vercel deploy --prebuilt --token=${{ inputs.vercel-token }}
      shell: bash

需要做出哪些修改才能正确注入环境变量?要求为开发和生产环境配置不同的数据库,且了解NextJS的环境变量优先级规则。

解决方案

根据需求,需调整工作流和Vercel部署Action的配置,确保GitHub Secrets的环境变量能正确注入到Next.js构建和部署流程中,具体修改如下:

1. 移除冗余的本地构建步骤

当前工作流中先执行npm run build,之后又在Vercel Action里执行vercel build,导致构建重复,且本地构建的环境变量无法传递到Vercel的构建流程。直接删除工作流中的Build app步骤即可。

修改后的开发工作流片段:

# 移除以下整个步骤
# - name: Build app
#   run: npm run build
#   env:
#     DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
#     NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
#     NEXT_ENV: 'development'

2. 修改Vercel部署Action,避免变量冲突并显式注入环境变量

vercel pull会拉取Vercel平台上配置的环境变量,会覆盖我们从GitHub Secrets注入的值,因此需要移除该命令;同时在Action的对应环境步骤中直接注入GitHub Secrets的变量,确保构建时能读取到正确的值。

修改后的Action配置:

inputs:
  vercel-token:
    description: 'Vercel token'
    required: true
  mode:
    description: 'Deployment mode'
    required: true

runs:
  using: 'composite'
  steps:
    - name: Install Vercel CLI
      run: npm install --global vercel@canary
      shell: bash

    - name: PRODUCTION Vercel Deployment
      if: ${{ inputs.mode == 'production' }}
      run: |
        vercel build --prod --token=${{ inputs.vercel-token }}
        vercel deploy --prebuilt --prod --token=${{ inputs.vercel-token }}
      shell: bash
      env:
        DATABASE_URL: ${{ secrets.PROD_DATABASE_URL }}
        NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
        API_KEY: ${{ secrets.API_KEY }}
        NEXT_ENV: 'production'

    - name: DEVELOPMENT Vercel Deployment
      if: ${{ inputs.mode == 'development' }}
      run: |
        vercel build --token=${{ inputs.vercel-token }}
        vercel deploy --prebuilt --token=${{ inputs.vercel-token }}
      shell: bash
      env:
        DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
        NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
        API_KEY: ${{ secrets.API_KEY }}
        NEXT_ENV: 'development'

3. 简化工作流中传递给Action的变量

由于已在Action内部配置了业务环境变量,工作流中只需保留Vercel平台相关的组织、项目ID等变量即可:

修改后的工作流部署步骤:

- name: Deploy app to Vercel development env
  uses: ./.github/actions/vercel-deployment
  with:
    mode: 'development'
    vercel-token: ${{ secrets.VERCEL_TOKEN }}
  env:
    VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
    VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
    VERCEL_FORCE_NO_BUILD_CACHE: 1

4. 确认Next.js环境变量前缀(按需调整)

如果变量需要在客户端组件中使用,记得添加NEXT_PUBLIC_前缀(例如NEXT_PUBLIC_API_KEY),否则变量仅能在服务端生效。根据实际需求调整变量名即可。

关键注意事项

  • 利用Next.js环境变量优先级:系统环境变量优先级高于.env文件,直接注入系统环境变量会覆盖本地.env配置,符合需求;
  • 清空Vercel平台配置:确保Vercel项目中未配置同名环境变量,避免部署时覆盖GitHub Secrets注入的值。

内容的提问来源于stack exchange,提问作者Paweł Gnat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:33:17