CI/CD实战项目
CI/CD实战项目:构建自动化部署流水线
目录
简介
在现代软件开发中,持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)已经成为提升开发效率、降低发布风险的重要手段。通过CI/CD,开发团队可以快速地将代码变更集成到主分支,并通过自动化测试和部署流程,确保代码质量与系统稳定性。
本文将通过一个具体的实战项目,展示如何从零开始搭建一套完整的CI/CD流水线,涵盖代码构建、自动化测试、部署到云环境等关键环节。读者将学会如何使用GitHub Actions、Jenkins等主流工具,实现高效的自动化开发与部署流程。
CI/CD概述
什么是CI/CD?
持续集成(CI)是指开发人员将代码频繁地提交到共享仓库中,每次提交后由自动化系统自动构建和测试,以快速发现和修复问题。持续交付(CD)则是指在CI的基础上,确保代码在任何时刻都可以被部署到生产环境,从而实现快速、可靠、可重复的发布。
CI/CD的核心目标是:
- 提高代码质量
- 缩短发布周期
- 降低发布风险
- 提高团队协作效率
为什么需要CI/CD?
在传统开发模式中,代码集成和部署常常是手动操作,容易出错,效率低下。而CI/CD通过自动化流程,可以:
- 避免错误的代码被合并
- 快速反馈开发结果
- 保证每次提交都可部署
- 降低部署复杂度
项目背景与目标
项目背景
本项目是一个基于Spring Boot的Web应用,用于管理用户的在线课程信息。项目包含前端(React)和后端(Spring Boot)两部分,需要部署到AWS EC2实例上。
项目目标
本项目的CI/CD流程需要实现以下功能:
- 当代码提交到GitHub仓库时,自动触发构建流程
- 自动运行单元测试和集成测试
- 构建Docker镜像并推送到私有仓库
- 自动部署到AWS EC2实例
- 实现可视化监控和日志查看
技术选型
| 模块 | 技术 | 说明 |
|---|---|---|
| 代码仓库 | GitHub | 代码托管平台 |
| CI/CD工具 | GitHub Actions / Jenkins | 自动化构建与部署 |
| 容器化 | Docker | 应用容器化 |
| 部署环境 | AWS EC2 | 云服务器环境 |
| 依赖管理 | Maven / npm | 项目依赖管理 |
| 日志系统 | ELK Stack(Elasticsearch, Logstash, Kibana) | 日志收集与分析 |
项目结构
本项目的目录结构如下:
/course-management-app/
├── backend/ # Spring Boot 后端项目
│ ├── pom.xml
│ ├── src/
│ └── ...
├── frontend/ # React 前端项目
│ ├── package.json
│ ├── src/
│ └── ...
├── Dockerfile # 后端Docker镜像构建文件
├── .github/workflows/ # GitHub Actions 工作流配置
│ └── ci-cd.yml
├── README.md
CI/CD流程设计
1. 代码提交
开发者将代码提交到GitHub的main分支,触发CI/CD流程。
2. 构建阶段
- 使用GitHub Actions或Jenkins启动构建任务
- 执行Maven或npm构建命令
- 构建成功后,生成Docker镜像
3. 测试阶段
- 运行单元测试和集成测试
- 使用JUnit、Jest等框架进行测试
- 生成测试报告
4. 部署阶段
- 将构建的Docker镜像推送到私有仓库(如Docker Hub或AWS ECR)
- 通过SSH连接AWS EC2实例
- 使用Docker命令拉取镜像并启动容器
5. 监控与反馈
- 使用ELK Stack收集日志
- 通过Jenkins或GitHub Actions显示构建状态
- 实现邮件或Slack通知
Jenkins配置
安装Jenkins
-
在AWS EC2实例上安装Jenkins:
bashsudo apt update sudo apt install openjdk-11-jdk -y wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt update sudo apt install jenkins -y -
启动Jenkins服务:
bashsudo systemctl start jenkins sudo systemctl enable jenkins -
访问Jenkins网页:
http://<EC2_PUBLIC_IP>:8080
创建Jenkins任务
- 登录Jenkins后,点击“新建任务”。
- 输入任务名称(如
course-management-cicd)。 - 选择“自由风格项目”。
- 在“源码管理”中配置GitHub仓库地址。
- 在“构建触发器”中配置“GitHub hook trigger for GITScm polling”。
- 在“构建”中添加以下命令:
# 构建后端项目
cd backend
mvn clean install
# 构建前端项目
cd ../frontend
npm install
npm run build
# 构建Docker镜像
cd ../
docker build -t course-management-backend:latest .
# 推送镜像到Docker Hub
docker login
docker push your-docker-hub-username/course-management-backend:latest
- 在“构建后操作”中添加“Execute shell”脚本,用于部署到EC2:
ssh -i /path/to/your-key.pem user@ec2-public-ip << 'EOF'
docker pull your-docker-hub-username/course-management-backend:latest
docker stop course-management-backend
docker rm course-management-backend
docker run -d -p 8080:8080 --name course-management-backend your-docker-hub-username/course-management-backend:latest
EOF
GitHub Actions配置
创建GitHub Actions工作流
在项目根目录下创建.github/workflows/ci-cd.yml文件:
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'adopt'
- name: Build backend
run: |
cd backend
mvn clean install
- name: Build frontend
run: |
cd frontend
npm install
npm run build
- name: Build Docker image
run: |
docker build -t course-management-backend:latest .
- name: Push Docker image
run: |
docker login -u ${{ secrets.DOCKER_HUB_USER }} -p ${{ secrets.DOCKER_HUB_TOKEN }}
docker tag course-management-backend:latest ${{ secrets.DOCKER_HUB_USER }}/course-management-backend:latest
docker push ${{ secrets.DOCKER_HUB_USER }}/course-management-backend:latest
- name: Deploy to EC2
run: |
ssh -i ${{ secrets.SSH_PRIVATE_KEY }} user@ec2-public-ip << 'EOF'
docker pull ${{ secrets.DOCKER_HUB_USER }}/course-management-backend:latest
docker stop course-management-backend
docker rm course-management-backend
docker run -d -p 8080:8080 --name course-management-backend ${{ secrets.DOCKER_HUB_USER }}/course-management-backend:latest
EOF
配置Secrets
在GitHub仓库的“Settings > Secrets and variables > Secrets”中添加以下Secret:
DOCKER_HUB_USER: Docker Hub用户名DOCKER_HUB_TOKEN: Docker Hub API TokenSSH_PRIVATE_KEY: 用于SSH连接EC2的私钥(建议使用GitHub Actions的secrets配置)
部署到云环境
1. 选择云平台
本项目部署在AWS EC2实例上。选择Ubuntu 22.04 LTS作为操作系统。
2. 安装Docker
在EC2实例上安装Docker:
sudo apt update
sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
3. 配置SSH密钥
将GitHub Actions中使用的SSH密钥添加到EC2实例的~/.ssh/authorized_keys中,确保GitHub Actions可以访问EC2。
测试与验证
1. 构建测试
- 提交代码到GitHub的
main分支,触发GitHub Actions构建流程。 - 检查构建日志,确认是否成功完成构建和部署。
2. 功能测试
- 打开浏览器,访问
http://<EC2_PUBLIC_IP>:8080,查看前端页面是否正常加载。 - 测试后端API接口是否正确响应。
3. 日志监控
- 使用ELK Stack收集Docker容器日志。
- 在Kibana中查看日志,确保无错误信息。
4. 自动化测试
- 使用Jest或JUnit编写单元测试和集成测试。
- 在CI/CD流程中运行测试,确保代码质量。
总结
通过本项目,我们完成了从代码提交到自动部署的完整CI/CD流程。使用GitHub Actions和Jenkins,我们实现了自动化构建、测试与部署,提高了开发效率和系统稳定性。
CI/CD不仅是一种技术实践,更是一种开发文化。通过自动化流程,我们能够更快速地响应需求变化,降低错误率,并提升产品的交付质量。
在实际项目中,CI/CD的流程需要根据团队规模、项目复杂度和部署环境进行定制化配置。希望本文能够为读者提供一个清晰的参考,帮助大家掌握CI/CD的核心理念与实战技巧。
作者:技术专家
日期:2025年4月5日
版本:1.0