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

如何本地部署无源码的Next.js+Node.js项目并实现CI/CD?

实现Windows环境下无源码部署Next.js+Node.js应用及CI/CD配置

一、用Git实现无本地源码的部署方案

核心思路是:在部署机器上通过Git拉取代码,完成构建后立即删除源码文件,只保留构建产物、依赖包和启动脚本,确保离线可运行且无源码留存。

具体步骤:

  1. 在部署机器上创建临时工作目录(比如D:\temp-deploy),拉取远程Git仓库代码:
    git clone <你的Git仓库地址> D:\temp-deploy
    
  2. 进入临时目录,安装依赖并执行构建:
    cd D:\temp-deploy
    npm install
    npm run build
    
  3. 创建正式部署目录(比如D:\next-app-deploy),复制必要文件:
    • 复制.next目录(Next.js构建核心产物)
    • 复制node_modules目录(离线运行依赖)
    • 复制package.json、package-lock.json(用于启动服务)
    • 若有自定义Node后端,仅复制编译后的构建产物(如dist目录),源码留在临时目录
  4. 删除临时目录D:\temp-deploy,彻底清除源码
  5. 启动服务:
    cd D:\next-app-deploy
    npm run start
    
    此时应用仅依赖部署目录内的文件,无网络时可正常运行。

进阶优化:用Git裸仓库+钩子自动完成流程

  • 在部署机器上创建裸仓库:
    git init --bare D:\next-app-bare.git
    
  • 在裸仓库的hooks目录下创建post-receive.ps1脚本(PowerShell示例):
    $tempDir = "D:\temp-deploy"
    $deployDir = "D:\next-app-deploy"
    
    # 清理临时目录并拉取代码
    if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force }
    git clone D:\next-app-bare.git $tempDir
    
    # 安装依赖并构建
    Set-Location $tempDir
    npm install
    npm run build
    
    # 清空部署目录并复制产物
    if (Test-Path $deployDir) { Remove-Item $deployDir -Recurse -Force }
    New-Item $deployDir -ItemType Directory
    Copy-Item ".next" $deployDir -Recurse
    Copy-Item "node_modules" $deployDir -Recurse
    Copy-Item "package.json" $deployDir
    Copy-Item "package-lock.json" $deployDir
    # 复制后端构建产物(如有)
    # Copy-Item "dist" $deployDir -Recurse
    
    # 删除临时目录
    Remove-Item $tempDir -Recurse -Force
    
    # 重启服务(需提前安装pm2)
    pm2 restart next-app
    
  • 本地开发机器添加裸仓库作为远程:
    git remote add deploy D:\next-app-bare.git
    
  • 推送代码时,裸仓库会自动触发钩子完成构建、部署和源码清理,部署机器全程无源码留存。

二、搭建CI/CD监听Git新推送

在Windows环境下,可通过两种方式实现:

1. 使用GitHub/GitLab Runner(推荐)

  • GitHub Actions Runner:

    1. 进入GitHub仓库「Settings」→「Actions」→「Runners」,选择Windows系统,按照提示下载并配置Runner到部署机器。
    2. 在仓库根目录创建.github/workflows/deploy.yml:
      name: Deploy to Windows Server
      on:
        push:
          branches: [ main ] # 监听main分支推送
      
      jobs:
        deploy:
          runs-on: self-hosted
          steps:
            - name: Checkout code
              uses: actions/checkout@v4
      
            - name: Setup Node.js
              uses: actions/setup-node@v4
              with:
                node-version: 18.x # 匹配你的Node版本
      
            - name: Install dependencies
              run: npm install
      
            - name: Build application
              run: npm run build
      
            - name: Clear old deployment
              run: Remove-Item D:\next-app-deploy\* -Recurse -Force
      
            - name: Copy build artifacts
              run: |
                Copy-Item .next D:\next-app-deploy -Recurse
                Copy-Item node_modules D:\next-app-deploy -Recurse
                Copy-Item package.json D:\next-app-deploy
                Copy-Item package-lock.json D:\next-app-deploy
                # 复制后端构建产物(如有)
                # Copy-Item dist D:\next-app-deploy -Recurse
      
            - name: Restart application
              run: pm2 restart next-app
      

    此后,向main分支推送代码时,部署机器上的Runner会自动执行构建、部署流程,源码仅存于Runner临时目录,执行完毕自动清除。

  • GitLab Runner:
    类似GitHub Runner,在部署机器上安装Windows版本的GitLab Runner并注册到仓库,编写.gitlab-ci.yml配置文件实现推送触发部署。

2. 自定义脚本监听Git推送

若不想用第三方Runner,可编写PowerShell脚本定时检查远程仓库新提交:

$repoUrl = "<你的Git仓库地址>"
$tempDir = "D:\temp-deploy"
$deployDir = "D:\next-app-deploy"
$lastCommit = ""

while ($true) {
  # 获取远程最新提交哈希
  $currentCommit = (git ls-remote $repoUrl HEAD).Split()[0]

  if ($currentCommit -ne $lastCommit) {
    Write-Host "发现新提交,开始部署..."
    $lastCommit = $currentCommit

    # 拉取代码、构建、部署流程同前
    if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force }
    git clone $repoUrl $tempDir
    Set-Location $tempDir
    npm install
    npm run build

    Remove-Item $deployDir -Recurse -Force
    New-Item $deployDir -ItemType Directory
    Copy-Item ".next" $deployDir -Recurse
    Copy-Item "node_modules" $deployDir -Recurse
    Copy-Item "package.json" $deployDir
    Copy-Item "package-lock.json" $deployDir

    Remove-Item $tempDir -Recurse -Force
    pm2 restart next-app
  }

  # 每隔5分钟检查一次
  Start-Sleep -Seconds 300
}

将脚本保存为deploy-monitor.ps1,通过Windows任务计划程序设置开机自动运行,即可持续监听Git推送。

注意事项

  • 部署机器需提前安装Node.js、Git、pm2(用于进程管理,避免终端关闭后服务停止)
  • 若应用依赖环境变量,需在部署目录创建.env.local文件,提前配置所有必要变量
  • 定期备份构建产物和依赖包,避免意外丢失导致无法运行

内容的提问来源于stack exchange,提问作者Cascade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:31:18