Ubuntu Node.js项目如何进行持续集成与持续部署
导读:Ubuntu Node.js项目持续集成与持续部署(CI/CD)实践指南 一、前置准备 在开始配置前,需完成以下基础环境准备: Ubuntu服务器配置:确保服务器安装了Node.js(建议16.x及以上版本)、npm及PM2(进程管理工具...
Ubuntu Node.js项目持续集成与持续部署(CI/CD)实践指南
一、前置准备
在开始配置前,需完成以下基础环境准备:
- Ubuntu服务器配置:确保服务器安装了Node.js(建议16.x及以上版本)、npm及PM2(进程管理工具)。可通过以下命令安装:
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt install -y nodejs sudo npm install -g pm2 - GitHub仓库设置:将Node.js项目推送到GitHub仓库,确保代码包含
package.json(定义依赖与脚本)、ecosystem.config.js(PM2配置文件,可选)等必要文件。
二、持续集成(CI):自动化构建与测试
持续集成的核心是通过自动化流程验证代码的正确性,避免“集成地狱”。以GitHub Actions(与GitHub深度集成、开箱即用)为例,配置步骤如下:
1. 创建GitHub Actions工作流文件
在项目根目录下创建.github/workflows/ci.yml文件,定义CI流程。以下是一个基础配置示例:
name: Node.js CI
on:
push: # 当代码推送到以下分支时触发
branches: [ main, dev ]
pull_request: # 当提交Pull Request到以下分支时触发
branches: [ main, dev ]
jobs:
build-and-test:
runs-on: ubuntu-latest # 使用Ubuntu环境运行
strategy:
matrix:
node-version: [16.x] # 指定Node.js版本(可扩展为多个版本测试兼容性)
steps:
- name: Checkout code # 拉取代码
uses: actions/checkout@v3
- name: Set up Node.js # 安装指定版本的Node.js
uses: actions/setup-node@v3
with:
node-version: ${
{
matrix.node-version }
}
- name: Cache node_modules # 缓存node_modules,加速后续构建
uses: actions/cache@v3
with:
path: ~/.npm
key: ${
{
runner.os }
}
-node-${
{
hashFiles('**/package-lock.json') }
}
restore-keys: |
${
{
runner.os }
}
-node-
- name: Install dependencies # 安装依赖(使用--prefer-offline优先使用缓存)
run: npm ci --prefer-offline
- name: Run tests # 执行测试(需项目已配置测试框架,如Jest、Mocha)
run: npm test
关键说明:
on字段定义了触发条件(代码推送或Pull Request);jobs.build-and-test包含构建与测试的具体步骤;actions/cache用于缓存依赖,减少重复下载时间(提升CI效率)。
三、持续部署(CD):自动化发布到生产环境
持续部署是CI的延伸,将通过测试的代码自动发布到生产环境。以下是两种常见方案的配置:
方案1:GitHub Actions + SSH + PM2(推荐,适合中小项目)
通过SSH连接到Ubuntu服务器,拉取最新代码并使用PM2重启应用,实现自动化部署。
1. 服务器配置SSH密钥
- 在服务器上生成SSH密钥对(若未生成):
ssh-keygen -t rsa -b 4096 -C "github_actions" cat ~/.ssh/id_rsa.pub > > ~/.ssh/authorized_keys # 将公钥添加到authorized_keys chmod 600 ~/.ssh/authorized_keys # 设置权限(防止权限过高导致连接失败) - 复制服务器公钥(
cat ~/.ssh/id_rsa.pub)到GitHub仓库的Settings → Secrets → Actions中,命名为SSH_PRIVATE_KEY; - 添加服务器IP、部署路径等Secrets:
SERVER_IP:服务器公网IP;DEPLOY_PATH:项目部署路径(如/var/www/node-app)。
2. 配置GitHub Actions工作流文件
在.github/workflows/deploy.yml中添加部署流程:
name: Node.js CD
on:
push:
branches: [ main ] # 仅main分支触发部署(避免dev分支误触发)
jobs:
deploy:
runs-on: ubuntu-latest
environment: production # 关联production环境(需在GitHub仓库中创建)
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: SSH Deploy # 使用appleboy/ssh-action插件执行远程命令
uses: appleboy/ssh-action@v0.1.10
with:
host: ${
{
secrets.SERVER_IP }
}
username: root # 服务器用户名(如ubuntu、root)
key: ${
{
secrets.SSH_PRIVATE_KEY }
}
script: |
cd ${
{
secrets.DEPLOY_PATH }
}
# 进入部署目录
git pull origin main # 拉取最新代码
npm install --production # 安装生产依赖(忽略devDependencies)
pm2 reload ecosystem.config.js --env production # 重启PM2进程(加载新代码)
pm2 save # 保存当前进程列表(防止重启后丢失)
关键说明:
appleboy/ssh-action是GitHub Actions的SSH插件,用于执行远程命令;pm2 reload实现零停机重启(保持应用可用性);environment: production关联环境,便于后续权限管理与审计。
方案2:GitHub Actions + Docker(适合容器化项目)
通过Docker将应用打包为镜像,推送到Docker Hub或私有仓库,再部署到服务器(需服务器安装Docker)。
1. 项目配置Dockerfile
在项目根目录下创建Dockerfile:
FROM node:16-alpine # 使用轻量级Node.js镜像
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production # 仅安装生产依赖
COPY . .
EXPOSE 3000 # 暴露应用端口
CMD ["node", "app.js"] # 启动应用(根据实际入口文件调整)
2. 配置GitHub Actions工作流文件
在.github/workflows/ci-cd.yml中添加构建与推送步骤:
name: Node.js CI/CD with Docker
on:
push:
branches: [ main ]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm ci
- name: Build Docker image # 构建Docker镜像
run: docker build -t your-dockerhub-username/node-app:${
{
github.sha }
}
.
- name: Login to Docker Hub # 登录Docker Hub(需配置secrets)
uses: docker/login-action@v2
with:
username: ${
{
secrets.DOCKER_USERNAME }
}
password: ${
{
secrets.DOCKER_PASSWORD }
}
- name: Push Docker image # 推送镜像到Docker Hub
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: your-dockerhub-username/node-app:${
{
github.sha }
}
deploy:
needs: build-and-push # 依赖构建步骤完成
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: SSH Deploy Docker # 使用SSH执行远程Docker命令
uses: appleboy/ssh-action@v0.1.10
with:
host: ${
{
secrets.SERVER_IP }
}
username: root
key: ${
{
secrets.SSH_PRIVATE_KEY }
}
script: |
docker pull your-dockerhub-username/node-app:${
{
github.sha }
}
# 拉取最新镜像
docker stop node-app || true # 停止旧容器(若存在)
docker rm node-app || true
docker run -d --name node-app -p 3000:3000 your-dockerhub-username/node-app:${
{
github.sha }
}
# 启动新容器
关键说明:
Dockerfile定义了应用的运行环境,确保开发与生产环境一致;docker/login-action用于登录Docker Hub(需在GitHub Secrets中配置DOCKER_USERNAME和DOCKER_PASSWORD);- 服务器需提前安装Docker(
sudo apt install -y docker.io)。
四、优化与注意事项
- 缓存优化:在CI步骤中添加
actions/cache,缓存node_modules和npm缓存,减少构建时间(提升30%-50%); - 权限管理:使用GitHub Secrets管理敏感信息(如SSH私钥、Docker密码),避免硬编码;
- 环境隔离:通过
environment字段区分开发、测试、生产环境,便于审计与权限控制; - 零停机部署:使用
pm2 reload或Docker滚动更新,确保应用持续可用; - 监控与报警:结合PM2的
pm2 monit(实时监控)、pm2 logs(查看日志)或第三方工具(如Prometheus+Grafana),及时发现并解决问题。
通过以上配置,Ubuntu Node.js项目可实现从代码提交到测试、构建、部署的全自动化流程,提升开发效率与应用可靠性。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Node.js项目如何进行持续集成与持续部署
本文地址: https://pptw.com/jishu/735542.html
