1. Linux服务器环境下的网站部署核心命令解析
在Linux服务器上部署网站项目是每个开发者必须掌握的硬核技能。不同于Windows的图形化操作,Linux环境下90%的部署工作都需要通过命令行完成。我经历过无数次深夜紧急部署,总结出这套经过实战检验的命令组合拳,涵盖从服务器初始化到项目上线的全流程。
特别提示:所有命令在CentOS 7/8和Ubuntu 18.04/20.04均测试通过,不同发行版可能需要微调包管理命令(yum/apt)
1.1 系统基础配置命令
首次登录服务器必做的"开光三连":
bash复制# 更新系统软件包(生产环境建议先测试再执行)
sudo yum update -y # CentOS/RHEL
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
# 创建部署专用账户(避免直接使用root)
useradd -m -s /bin/bash deployer
passwd deployer
usermod -aG sudo deployer # Ubuntu
usermod -aG wheel deployer # CentOS
# 配置SSH安全策略(修改默认端口+禁用root登录)
sudo vim /etc/ssh/sshd_config
# 修改以下参数:
# Port 58222
# PermitRootLogin no
# PasswordAuthentication no
sudo systemctl restart sshd
1.2 环境准备关键命令
部署不同技术栈项目需要的基础环境安装命令:
bash复制# LAMP环境(PHP项目)
sudo yum install httpd mariadb-server php php-mysqlnd -y
sudo systemctl start httpd mariadb
sudo systemctl enable httpd mariadb
# Java环境(SpringBoot项目)
sudo yum install java-11-openjdk-devel -y
java -version # 验证安装
# Node.js环境(前端/Vue/React项目)
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
sudo yum install nodejs -y
npm install -g pm2 # 进程管理工具
2. 项目部署全流程实战命令
2.1 代码获取与处理
根据项目类型选择不同的获取方式:
bash复制# Git项目克隆(需提前配置SSH Key)
git clone git@github.com:username/project.git
cd project
# 压缩包项目处理
wget https://example.com/project.zip
unzip project.zip -d /var/www/html/
chown -R apache:apache /var/www/html/ # Apache用户权限
# 前端项目构建
npm install
npm run build
cp -r dist/* /usr/share/nginx/html/
2.2 数据库配置命令
MySQL/MariaDB的快速初始化:
bash复制# 安全初始化(交互式)
sudo mysql_secure_installation
# 创建项目数据库
mysql -u root -p
CREATE DATABASE project_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'project_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON project_db.* TO 'project_user'@'localhost';
FLUSH PRIVILEGES;
exit
# 导入SQL文件
mysql -u project_user -p project_db < dump.sql
2.3 Web服务器配置
Nginx反向代理的典型配置:
bash复制sudo vim /etc/nginx/conf.d/project.conf
# 示例配置内容
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
# 测试并重载配置
sudo nginx -t
sudo systemctl reload nginx
3. 高级部署与维护命令
3.1 进程管理方案
使用PM2管理Node.js进程的完整流程:
bash复制# 全局安装
npm install pm2 -g
# 启动项目
pm2 start server.js --name "my-app" -i max
# 常用命令
pm2 list # 查看进程列表
pm2 logs my-app # 查看实时日志
pm2 monit # 监控面板
pm2 save # 保存当前进程列表
pm2 startup # 设置开机自启
# 生成启动脚本
pm2 startup systemd -u deployer --hp /home/deployer
3.2 日志分析与监控
生产环境必备的日志处理命令:
bash复制# 实时查看Nginx访问日志
tail -f /var/log/nginx/access.log
# 按状态码统计访问量
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 查找访问量最大IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# 监控服务器资源
top # 实时进程监控
htop # 增强版top(需安装)
df -h # 磁盘空间
free -m # 内存使用
nload # 网络流量监控
4. 安全加固与性能调优
4.1 防火墙配置
使用firewalld的基本防护策略:
bash复制# 查看当前规则
sudo firewall-cmd --list-all
# 放行常用端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=58222/tcp # SSH自定义端口
sudo firewall-cmd --reload
# 应急情况下快速阻断IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject'
4.2 性能调优参数
针对高并发场景的Linux内核优化:
bash复制# 编辑sysctl配置
sudo vim /etc/sysctl.conf
# 添加以下参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
fs.file-max = 2097152
# 立即生效
sudo sysctl -p
# 调整文件描述符限制
sudo vim /etc/security/limits.conf
# 添加:
* soft nofile 65535
* hard nofile 65535
5. 自动化部署实战
5.1 Shell脚本部署示例
完整的项目部署脚本模板:
bash复制#!/bin/bash
# deploy.sh - 全自动部署脚本
set -e # 遇到错误立即退出
# 定义变量
PROJECT_NAME="my-app"
PROJECT_DIR="/var/www/$PROJECT_NAME"
GIT_REPO="git@github.com:username/repo.git"
NODE_ENV="production"
# 检查依赖
check_dependencies() {
if ! [ -x "$(command -v git)" ]; then
echo "错误: git未安装" >&2
exit 1
fi
# 添加其他依赖检查...
}
# 拉取最新代码
update_code() {
echo "正在更新代码..."
if [ -d "$PROJECT_DIR" ]; then
cd "$PROJECT_DIR"
git pull origin master
else
git clone "$GIT_REPO" "$PROJECT_DIR"
cd "$PROJECT_DIR"
fi
}
# 安装依赖
install_deps() {
echo "正在安装依赖..."
npm install --production
}
# 构建项目
build_project() {
echo "正在构建..."
npm run build
}
# 重启服务
restart_service() {
echo "正在重启服务..."
pm2 restart "$PROJECT_NAME" || pm2 start npm --name "$PROJECT_NAME" -- start
}
# 主流程
main() {
check_dependencies
update_code
install_deps
build_project
restart_service
echo "部署成功!"
}
main
5.2 Crontab定时任务
自动化维护任务的配置方法:
bash复制# 编辑当前用户的crontab
crontab -e
# 每天3点自动备份数据库
0 3 * * * /usr/bin/mysqldump -u backup_user -p'password' project_db > /backups/project_db_$(date +\%Y\%m\%d).sql
# 每周一凌晨清理日志
0 2 * * 1 find /var/log/nginx/ -name "*.log" -mtime +7 -exec rm {} \;
# 每5分钟检查服务是否存活
*/5 * * * * pgrep -f "node server.js" || cd /path/to/project && /usr/bin/pm2 start server.js
6. 故障排查与调试技巧
6.1 服务状态检查
快速诊断问题的命令组合:
bash复制# 检查服务状态
systemctl status nginx mysql php-fpm
# 检查端口监听
netstat -tulnp | grep -E '80|443|3306'
# 检查进程资源占用
ps aux | grep -E 'node|java|python'
# 检查磁盘IO性能
iotop -o # 需要安装
iostat -x 1
# 完整系统状态报告
sudo apt install sysstat -y
sar -A # 显示所有统计信息
6.2 网络问题诊断
常见的网络调试命令:
bash复制# 测试端口连通性
telnet yourdomain.com 80
nc -zv yourdomain.com 443
# 路由追踪
traceroute yourdomain.com
mtr yourdomain.com # 需要安装
# DNS解析检查
dig yourdomain.com
nslookup yourdomain.com
# HTTP请求测试
curl -I https://yourdomain.com # 只显示头信息
curl -v https://yourdomain.com/api # 详细输出
7. 实用辅助命令集锦
7.1 文件操作进阶
高效管理项目文件的技巧:
bash复制# 递归查找并替换文件内容
find . -type f -name "*.js" -exec sed -i 's/old_string/new_string/g' {} +
# 批量修改文件权限
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 快速统计代码行数
find . -name "*.js" | xargs wc -l
# 文件差异比较
diff -u file1.txt file2.txt
vimdiff config.prod.js config.dev.js
# 实时监控目录变化
watch -n 1 'ls -lht | head'
7.2 系统信息查询
快速获取服务器状态的命令:
bash复制# 查看系统信息
uname -a
cat /etc/*release
lsb_release -a
# 查看硬件信息
lscpu # CPU信息
lsblk # 磁盘分区
lspci -tv # PCI设备
lsusb -tv # USB设备
# 查看内核日志
dmesg | tail -20
journalctl -xe # systemd日志
# 查看登录历史
last -n 10
who -b # 系统启动时间
8. 面试常考命令解析
8.1 高频面试命令精讲
bash复制# 1. 查看进程及其子进程树
ps auxf
# 2. 查找占用80端口的进程
lsof -i :80
ss -tulnp | grep :80
# 3. 统计Nginx日志中404错误
grep ' 404 ' /var/log/nginx/access.log | wc -l
# 4. 批量杀进程
pkill -f "pattern"
kill $(ps aux | grep 'node' | awk '{print $2}')
# 5. 查看文件修改时间
stat filename
ls -l --time-style=full-iso filename
# 6. 实时监控命令输出变化
watch -n 1 'command'
# 7. 生成随机密码
openssl rand -base64 12
date | md5sum | head -c 16
8.2 Shell脚本面试题
常见Shell脚本考题示例:
bash复制#!/bin/bash
# 题目:编写脚本监控网站状态,异常时发送邮件报警
URL="https://yourdomain.com"
EMAIL="admin@example.com"
LOG_FILE="/var/log/website_monitor.log"
# 检查网站状态
status_code=$(curl -o /dev/null -s -w "%{http_code}\n" "$URL")
# 记录日志
echo "$(date) - Status code: $status_code" >> "$LOG_FILE"
# 判断状态并报警
if [ "$status_code" -ne 200 ]; then
echo "网站异常,状态码: $status_code" | mail -s "网站监控警报" "$EMAIL"
# 尝试自动重启服务
systemctl restart nginx
fi
9. 容器化部署方案
9.1 Docker基础部署
使用Docker简化环境配置:
bash复制# 安装Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
# 运行MySQL容器
docker run --name mysql-server \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-e MYSQL_DATABASE=app_db \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
# 运行Node.js应用
docker run -d --name node-app \
-p 3000:3000 \
-v /path/to/app:/usr/src/app \
-w /usr/src/app \
node:14 \
npm start
9.2 Docker Compose编排
多容器项目的部署方案:
yaml复制# docker-compose.yml 示例
version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./dist:/usr/share/nginx/html
depends_on:
- api
api:
build: ./api
ports:
- "3000:3000"
environment:
- DB_HOST=db
- DB_PORT=3306
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动命令:
bash复制docker-compose up -d # 后台运行
docker-compose logs -f web # 查看日志
10. 性能监控与优化
10.1 实时性能监控
bash复制# 综合监控工具
sudo yum install epel-release -y
sudo yum install htop iftop iotop -y
# 内存使用分析
free -h
vmstat 1 # 每秒刷新
# CPU使用率
mpstat -P ALL 1 # 每个CPU核心的使用率
pidstat 1 # 进程级CPU使用
# IO性能
iostat -x 1
iotop -o
# 网络流量
iftop -n -i eth0
nethogs eth0 # 按进程统计
10.2 性能瓶颈分析
bash复制# 系统调用跟踪
strace -p <pid> -c # 统计系统调用
strace -T -e trace=open,read,write -p <pid>
# 函数级性能分析(Node.js)
npm install -g clinic
clinic doctor -- node server.js
# Java项目性能分析
jps -l # 列出Java进程
jstack <pid> > thread_dump.txt # 线程转储
jmap -heap <pid> # 堆内存分析
# 慢查询分析(MySQL)
mysqldumpslow -s t /var/log/mysql/mysql-slow.log
pt-query-digest /var/log/mysql/mysql-slow.log
11. 备份与恢复策略
11.1 自动化备份方案
bash复制#!/bin/bash
# backup.sh - 全量备份脚本
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d)
MYSQL_USER="backup_user"
MYSQL_PASS="password"
# 创建备份目录
mkdir -p "$BACKUP_DIR/$DATE"
# MySQL全库备份
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" --all-databases \
| gzip > "$BACKUP_DIR/$DATE/mysql_all_$DATE.sql.gz"
# 项目代码备份
tar -czvf "$BACKUP_DIR/$DATE/project_code_$DATE.tar.gz" /var/www/html
# Nginx配置备份
tar -czvf "$BACKUP_DIR/$DATE/nginx_conf_$DATE.tar.gz" /etc/nginx
# 保留最近7天备份
find "$BACKUP_DIR" -type d -mtime +7 -exec rm -rf {} \;
# 上传到远程存储(可选)
rsync -avz "$BACKUP_DIR/$DATE" backup-server:/remote/backup/path/
11.2 快速恢复方案
bash复制# MySQL恢复
zcat mysql_all_20230501.sql.gz | mysql -u root -p
# 项目代码恢复
tar -xzvf project_code_20230501.tar.gz -C /
# 配置文件恢复
tar -xzvf nginx_conf_20230501.tar.gz -C /
# 权限修复
chown -R nginx:nginx /var/www/html
chmod -R 755 /var/www/html
12. 安全审计与加固
12.1 常规安全检查
bash复制# 检查可疑进程
ps aux | grep -E '(curl|wget|base64)'
# 检查异常登录
lastb | head -20 # 失败登录尝试
lastlog # 所有用户最后登录时间
# 查找SUID可疑文件
find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null
# 检查计划任务
crontab -l # 当前用户
ls -la /etc/cron* # 系统级
# 检查系统账户
awk -F: '($3 == 0) {print}' /etc/passwd # 所有UID=0的用户
12.2 安全扫描工具
bash复制# 安装安全扫描工具
sudo yum install lynis rkhunter -y
# 系统安全扫描
lynis audit system
rkhunter --check
# 网络端口扫描(本地)
nmap -sT -O localhost
# Web漏洞扫描(需安装)
docker run --rm owasp/zap2docker-stable zap-baseline.py -t https://yourdomain.com
# SSL证书检查
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com | openssl x509 -noout -text
13. 多服务器管理技巧
13.1 批量操作方案
bash复制# 使用SSH密钥批量登录
for server in server1 server2 server3; do
ssh deployer@$server "sudo yum update -y"
done
# 并行执行(需要安装parallel)
echo -e "server1\nserver2\nserver3" | parallel -j 10 "ssh deployer@{} 'hostname; uptime'"
# 使用Ansible基础命令(需安装)
ansible all -m ping -i hosts.ini
ansible web_servers -m apt -a "update_cache=yes" -i hosts.ini
ansible db_servers -m yum -a "name=mysql-server state=present" -i hosts.ini
13.2 配置同步策略
bash复制# 使用rsync同步配置文件
rsync -avz -e "ssh -p 58222" /etc/nginx/conf.d/ deployer@server2:/etc/nginx/conf.d/
# 使用inotify-tools实现实时同步(需安装)
inotifywait -m -r -e modify,create,delete /etc/nginx | while read path action file; do
rsync -avz --delete /etc/nginx/ deployer@server2:/etc/nginx/
done
# 使用unison双向同步(需安装)
unison /etc/nginx ssh://server2//etc/nginx -auto -batch
14. 版本回滚策略
14.1 代码版本控制
bash复制# Git回滚到指定版本
git log --oneline # 查看提交历史
git checkout <commit-hash> # 临时查看旧版本
git reset --hard <commit-hash> # 永久回滚
# 使用标签管理发布版本
git tag -a v1.0.1 -m "Production release 2023-05-01"
git push origin --tags
# 回滚到上一个稳定标签
git checkout $(git describe --tags --abbrev=0)
14.2 数据库回滚方案
bash复制# 使用binlog实现增量回滚(MySQL)
mysqlbinlog --start-datetime="2023-05-01 14:00:00" \
--stop-datetime="2023-05-01 15:00:00" \
/var/lib/mysql/mysql-bin.000123 | mysql -u root -p
# 使用LVM快照回滚(需提前配置)
lvcreate -L 1G -s -n db_snap /dev/vg00/mysql
# 恢复快照
umount /var/lib/mysql
lvconvert --merge /dev/vg00/db_snap
mount /var/lib/mysql
systemctl start mysql
15. 高级调试技巧
15.1 网络包分析
bash复制# 安装抓包工具
sudo yum install tcpdump wireshark -y
# 基本抓包命令
tcpdump -i eth0 -w capture.pcap port 80
tcpdump -i eth0 -nn 'tcp and (port 80 or port 443)'
# 实时分析HTTP请求
tcpdump -i eth0 -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 解析pcap文件
tshark -r capture.pcap -Y "http.request" -T fields \
-e frame.time -e ip.src -e http.host -e http.request.uri
15.2 性能剖析工具
bash复制# Linux系统性能分析
perf top # 实时CPU热点
perf record -a -g -- sleep 30 # 记录30秒性能数据
perf report # 分析记录
# Node.js性能剖析
node --prof server.js # 生成isolate-*.log
node --prof-process isolate-*.log > processed.txt
# Java堆转储分析
jmap -dump:live,format=b,file=heap.hprof <pid>
jhat heap.hprof # 启动分析服务器
16. 日志管理进阶
16.1 日志集中化管理
bash复制# 使用rsyslog转发日志
sudo vim /etc/rsyslog.conf
# 添加:
*.* @192.168.1.100:514
# 日志文件轮转配置
sudo vim /etc/logrotate.d/nginx
# 示例配置:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/lib/nginx/modules/nginx -s reopen >/dev/null 2>&1 || true
endscript
}
16.2 日志分析实战
bash复制# 统计HTTP状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 查找请求时间超过3秒的请求
awk '$NF > 3 {print $7, $NF}' access.log | sort -k2 -rn | head -20
# 实时监控错误日志
tail -f error.log | grep -E 'error|exception|fail'
# 使用GoAccess生成可视化报告
goaccess access.log -o report.html --log-format=COMBINED
17. 服务器维护日历
17.1 日常维护任务
bash复制# 每日检查清单
#!/bin/bash
echo "===== 每日维护报告 $(date) ====="
echo "1. 磁盘使用情况:"
df -h | grep -v tmpfs
echo -e "\n2. 内存使用情况:"
free -h
echo -e "\n3. 最近登录用户:"
last -n 5
echo -e "\n4. 运行时间:"
uptime
echo -e "\n5. 关键服务状态:"
systemctl list-units --type=service --state=running | grep -E 'nginx|mysql|php'
17.2 月度维护任务
bash复制# 每月执行一次的维护脚本
#!/bin/bash
echo "===== 月度维护报告 $(date) ====="
# 1. 清理旧内核(CentOS)
echo -e "\n1. 清理旧内核..."
package-cleanup --oldkernels --count=1
# 2. 更新系统
echo -e "\n2. 系统更新..."
yum update -y --security
# 3. 检查文件系统
echo -e "\n3. 文件系统检查..."
for mount in $(df -h | awk '{print $6}' | grep -v Mounted); do
touch $mount/.fs_test 2>/dev/null && rm -f $mount/.fs_test || echo "无法写入 $mount"
done
# 4. 备份验证
echo -e "\n4. 备份验证..."
ls -lh /backups/$(date +%Y%m)* | tail -5
18. 应急响应流程
18.1 入侵检测与响应
bash复制# 可疑活动检查清单
#!/bin/bash
echo "===== 安全应急检查 $(date) ====="
# 1. 检查异常进程
echo -e "\n1. 异常进程检查:"
ps aux | awk '{print $1,$11}' | sort | uniq -c | sort -n | tail -10
# 2. 检查异常网络连接
echo -e "\n2. 网络连接检查:"
netstat -tulnp | grep -vE '127.0.0.1|::1'
# 3. 检查计划任务
echo -e "\n3. 计划任务检查:"
ls -la /etc/cron*/* /var/spool/cron/*
# 4. 检查SUID文件变更
echo -e "\n4. SUID文件检查:"
find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null | grep -vE 'crontab|passwd|mount|umount|sudo'
18.2 服务中断恢复
bash复制# 服务恢复检查清单
#!/bin/bash
SERVICE=$1
case $SERVICE in
nginx)
# 检查配置
nginx -t
# 查看错误日志
tail -n 20 /var/log/nginx/error.log
# 重启服务
systemctl restart nginx
;;
mysql)
# 检查错误日志
tail -n 20 /var/log/mysql/error.log
# 检查磁盘空间
df -h /var/lib/mysql
# 尝试修复
mysqlcheck --all-databases --repair -u root -p
;;
*)
echo "Usage: $0 {nginx|mysql}"
exit 1
;;
esac
19. 服务器性能基准测试
19.1 硬件性能测试
bash复制# CPU性能测试
sysbench cpu --cpu-max-prime=20000 run
# 内存速度测试
sysbench memory --memory-block-size=1K --memory-total-size=10G run
# 磁盘IO测试
sysbench fileio --file-total-size=5G prepare
sysbench fileio --file-total-size=5G --file-test-mode=rndrw --time=300 --max-requests=0 run
sysbench fileio --file-total-size=5G cleanup
# 数据库性能测试
sysbench oltp_read_write --db-driver=mysql --mysql-host=localhost \
--mysql-user=root --mysql-password=yourpassword --mysql-db=sbtest \
--tables=10 --table-size=100000 prepare
sysbench oltp_read_write --db-driver=mysql --mysql-host=localhost \
--mysql-user=root --mysql-password=yourpassword --mysql-db=sbtest \
--tables=10 --table-size=100000 --threads=8 --time=300 run
19.2 Web性能测试
bash复制# 安装测试工具
sudo yum install httpd-tools -y # ab
sudo pip install locust
# Apache Benchmark测试
ab -n 1000 -c 100 https://yourdomain.com/
# wrk测试(需安装)
wrk -t4 -c100 -d30s https://yourdomain.com/api
# Locust分布式测试
locust -f locustfile.py --headless -u 1000 -r 100 --run-time 1h --host https://yourdomain.com
20. 持续集成/持续部署(CI/CD)
20.1 Jenkins自动化部署
bash复制# Jenkins安装
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins java-11-openjdk -y
sudo systemctl start jenkins
# 典型Jenkinsfile示例
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'git@github.com:username/repo.git'
}
}
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Deploy') {
steps {
sshagent(['deploy-key']) {
sh 'rsync -avz dist/ deployer@production:/var/www/html/'
sh 'ssh deployer@production "sudo systemctl restart nginx"'
}
}
}
}
}
20.2 GitHub Actions自动化
yaml复制# .github/workflows/deploy.yml 示例
name: Node.js CI/CD
on:
push:
branches: [ "main" ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js 16
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build project
run: npm run build
- name: Deploy to production
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USER }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
script: |
cd /var/www/html
git pull origin main
npm install --production
pm2 restart all
