什么是 CI/CD
CI(Continuous Integration,持续集成)是指频繁地将代码合并到主分支,并自动进行构建和测试。CD(Continuous Delivery/Deployment,持续交付/部署)是指将通过测试的代码自动部署到生产环境。
简单来说,CI/CD 就是一套自动化的流程,让你的代码从提交到部署全程自动化,减少人工操作,提高发布效率。
Jenkins 入门 Pipeline
Jenkins 是目前最流行的 CI/CD 工具之一。下面是一个完整的 Jenkins Pipeline 示例,展示了从拉代码到远程发布的完整流程:
pipeline {
agent any
triggers {
gitlab(triggerOnPush: true)
}
options {
disableConcurrentBuilds()
}
environment {
REMOTE_USER = "root"
REMOTE_HOST = "47.116.193.82"
REMOTE_DIR = "/data/www/tool"
}
stages {
stage('清理工作区') {
steps {
deleteDir()
}
}
stage('拉代码') {
steps {
git branch: 'test',
url: 'http://192.168.233.11:8929/yeyou/go.git',
credentialsId: 'gitlab-token'
}
}
stage('打包') {
steps {
sh '''
set -e
tar --warning=no-file-changed \
--exclude=.git \
--exclude=node_modules \
-czf release.tar.gz .
'''
}
}
stage('上传') {
steps {
sh '''
set -e
scp release.tar.gz ${REMOTE_USER}@${REMOTE_HOST}:/tmp/
'''
}
}
stage('远程发布') {
steps {
sh '''
set -e
ssh root@47.116.193.82 "
set -e
cd /data/www/tool
echo '备份'
tar -czf /tmp/backup_$(date +%s).tar.gz . || true
echo '清理旧文件'
rm -rf * .[^.]* || true
echo '解压新版本'
tar -xzf /tmp/release.tar.gz -C /data/www/tool
echo '完成'
"
'''
}
}
}
post {
success {
echo "✅ 部署成功"
}
failure {
echo "❌ 部署失败(旧版本已备份在 /tmp)"
}
}
}
核心概念解析
1. agent
agent any 表示该 Pipeline 可以在任何可用的 Jenkins 节点上运行。你也可以指定特定的节点标签。
2. triggers
gitlab(triggerOnPush: true) 配置 GitLab 推送触发器,当代码推送到 GitLab 时自动触发构建。
3. stages
stages 是 Pipeline 的核心,包含多个 stage,每个 stage 代表一个阶段:
- 清理工作区:清理之前构建留下的文件
- 拉代码:从 Git 仓库拉取指定分支的代码
- 打包:将代码打包成 tar.gz 文件
- 上传:将打包文件上传到远程服务器
- 远程发布:在远程服务器上执行部署脚本
4. post
post 块在 Pipeline 结束后执行,根据构建结果执行不同操作,比如发送通知。
常见问题与解决
tar: file changed as we read it
这是因为在 tar 打包过程中,文件系统发生了变化(可能是 Jenkins 写入临时文件)。解决方法是在 tar 命令中添加 --warning=no-file-changed 参数:
tar --warning=no-file-changed \
--exclude=.git \
--exclude=node_modules \
-czf release.tar.gz .
SSH 免密登录配置
为了让 Jenkins 能够免密 SSH 到远程服务器,需要配置 SSH 密钥:
# 在 Jenkins 服务器上生成密钥
ssh-keygen -t rsa -b 4096
# 将公钥复制到远程服务器
ssh-copy-id root@47.116.193.82
CI/CD 的优势
- 自动化:减少人工操作,降低出错概率
- 快速反馈:代码提交后立即知道是否有问题
- 可追溯:每次构建都有记录,方便回滚
- 提高效率:发布时间从小时级降到分钟级
- 团队协作:多人协作时自动合并和测试代码
进阶建议
对于更复杂的项目,建议:
- 添加单元测试、集成测试阶段
- 使用 Docker 容器化部署
- 配置蓝绿部署或金丝雀发布
- 集成监控和告警系统
- 使用更现代的工具如 GitLab CI、GitHub Actions 或 ArgoCD