Ubuntu Node.js项目持续集成与部署(CI/CD)实践指南
在开始配置CI/CD前,需完成以下基础环境准备:
# 安装Node.js 16.x(或指定版本)
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
# 全局安装PM2
sudo npm install -g pm2
# 配置PM2开机自启
pm2 startup systemd
sudo systemctl enable pm2
package.json、ecosystem.config.js(PM2配置文件,可选)等必要文件。GitHub Actions是Node.js项目最常用的CI/CD工具之一,无需自建服务器,直接集成在GitHub中。以下是详细步骤:
在GitHub仓库的Settings → Secrets → Actions中添加以下敏感信息(用于SSH部署):
SERVER_IP:Ubuntu服务器公网IPSSH_PRIVATE_KEY:服务器SSH私钥(生成命令:cat ~/.ssh/id_rsa)DEPLOY_PATH:项目在服务器上的部署路径(如/var/www/node-app)在项目根目录创建.github/workflows/deploy.yml文件,定义CI/CD流程(以下示例实现“代码推送→依赖安装→构建→PM2重启”):
name: Node.js CI/CD Pipeline
on:
push:
branches: [ main ] # 监听main分支的push事件
pull_request:
branches: [ main ] # 可选:监听pull request事件
jobs:
build-and-deploy:
runs-on: ubuntu-latest # 使用GitHub提供的Ubuntu runner
steps:
# 1. 检出代码
- name: Checkout code
uses: actions/checkout@v3
# 2. 设置Node.js环境(指定版本)
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16 # 匹配项目要求的Node.js版本
# 3. 安装依赖(使用--prefer-offline加速)
- name: Install dependencies
run: npm ci --prefer-offline
# 4. 运行测试(若有测试脚本)
- name: Run tests
run: npm test
# 5. 构建项目(根据项目需求调整,如Vue/React的build命令)
- name: Build project
run: npm run build
# 6. SSH部署到服务器
- name: SSH Deploy
uses: appleboy/ssh-action@v0.1.10 # 使用GitHub Marketplace的SSH Action
with:
host: ${{ secrets.SERVER_IP }}
username: root # 服务器用户名(如ubuntu、root)
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# 进入部署目录
cd ${{ secrets.DEPLOY_PATH }}
# 拉取最新代码(若使用Git部署)
git pull origin main
# 安装生产依赖(避免安装devDependencies)
npm install --production
# 重启PM2进程(先删除旧进程,再启动新进程)
pm2 delete all || true # 忽略“进程不存在”的错误
pm2 start app.js --name "node-app" # 替换为你的入口文件(如app.js、index.js)
pm2 save # 保存当前进程列表
actions/cache Action缓存node_modules,减少依赖安装时间(参考):- uses: actions/cache@v3
with:
path: |
**/node_modules
${{ github.workspace }}/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
if条件判断分支,实现“main分支部署到生产环境,dev分支部署到预发布环境”:jobs:
deploy:
if: github.ref == 'refs/heads/main' # 仅main分支触发生产部署
runs-on: ubuntu-latest
environment: production # 关联GitHub Environment(需提前创建)
steps: [...]
main分支,观察GitHub Actions工作流运行状态(需等待“Build and Deploy”步骤完成)。pm2 list # 查看进程是否运行
pm2 logs # 查看实时日志(排查部署问题)
若需更灵活的流水线控制(如Docker构建、多环境切换),可使用Jenkins。以下是简要步骤:
在Ubuntu服务器上执行以下命令安装Jenkins:
# 安装Java(Jenkins依赖)
sudo apt install -y openjdk-11-jdk
# 添加Jenkins仓库并安装
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install -y jenkins
# 启动Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
访问http://<服务器IP>:8080,按照提示完成初始化(输入管理员密码)。
Manage Jenkins → Global Tool Configuration,配置以下工具:
nodejs-16),选择版本(如16.x)。/usr/bin/git,可通过which git查看)。New Item,选择“Pipeline”,填写名称(如node-app-ci-cd),点击“OK”。Pipeline选项卡中,选择“Pipeline script from SCM”,配置以下信息:
Git,填写仓库URL(如https://github.com/your-repo/node-app.git)。*/main(监听main分支)。Jenkinsfile(项目根目录下的流水线脚本文件)。在项目根目录创建Jenkinsfile,定义流水线步骤(以下示例实现“拉取代码→安装依赖→构建→SSH部署”):
pipeline {
agent any
tools {
nodejs 'nodejs-16' // 使用全局配置的Node.js工具
}
stages {
stage('Checkout') {
steps {
checkout scm // 拉取代码
}
}
stage('Install Dependencies') {
steps {
sh 'npm ci --prefer-offline' // 安装依赖
}
}
stage('Build') {
steps {
sh 'npm run build' // 构建项目
}
}
stage('Deploy') {
steps {
sshagent(['jenkins-ssh-key']) { // 使用Jenkins存储的SSH密钥
sh '''
ssh root@${SERVER_IP} << 'EOF'
cd ${DEPLOY_PATH}
git pull origin main
npm install --production
pm2 delete all || true
pm2 start app.js --name "node-app"
pm2 save
EOF
'''
}
}
}
}
post {
always {
echo 'Deployment completed!'
}
failure {
echo 'Deployment failed!'
}
}
}
Manage Jenkins → Credentials中添加SSH密钥(ID为jenkins-ssh-key),并在Jenkinsfile中替换${SERVER_IP}、${DEPLOY_PATH}为实际值。triggers块,或配置GitHub Webhook(参考)。sudo ufw allow 22/tcp),GitHub Secrets中的私钥是否正确(无换行符)。pm2 logs),确认应用端口是否被占用(sudo netstat -tulnp | grep :3000)。package.json中的依赖版本是否兼容,或尝试npm cache clean --force清理缓存。通过以上步骤,即可实现Ubuntu Node.js项目的持续集成与部署,提升开发效率和应用稳定性。