如何本地部署无源码的Next.js+Node.js项目并实现CI/CD?
实现Windows环境下无源码部署Next.js+Node.js应用及CI/CD配置
一、用Git实现无本地源码的部署方案
核心思路是:在部署机器上通过Git拉取代码,完成构建后立即删除源码文件,只保留构建产物、依赖包和启动脚本,确保离线可运行且无源码留存。
具体步骤:
- 在部署机器上创建临时工作目录(比如
D:\temp-deploy),拉取远程Git仓库代码:git clone <你的Git仓库地址> D:\temp-deploy - 进入临时目录,安装依赖并执行构建:
cd D:\temp-deploy npm install npm run build - 创建正式部署目录(比如
D:\next-app-deploy),复制必要文件:- 复制
.next目录(Next.js构建核心产物) - 复制
node_modules目录(离线运行依赖) - 复制
package.json、package-lock.json(用于启动服务) - 若有自定义Node后端,仅复制编译后的构建产物(如
dist目录),源码留在临时目录
- 复制
- 删除临时目录
D:\temp-deploy,彻底清除源码 - 启动服务:
此时应用仅依赖部署目录内的文件,无网络时可正常运行。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:
- 进入GitHub仓库「Settings」→「Actions」→「Runners」,选择Windows系统,按照提示下载并配置Runner到部署机器。
- 在仓库根目录创建
.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
相关产品推荐
相关产品推荐

