持续集成与持续部署:CI/CD实现教程
以下是一个基于常见工具实现 CI/CD 的基本教程示例,这里以 Git、Jenkins、Maven(用于 Java 项目构建和管理依赖,其他语言项目可替换为对应构建工具)以及 Docker(用于容器化部署,非必需但很常用)为例,展示如何搭建一个简单的 CI/CD 流程,你可以根据实际项目情况进行调整和扩展。
一、环境准备
1. 安装 Git
- 根据操作系统不同,在官网(https://git-scm.com/)下载对应版本的 Git 安装包进行安装。安装完成后,通过命令行输入
git --version
验证是否安装成功。
2. 安装 Jenkins
- Windows 系统:
- 从 Jenkins 官网(Jenkins)下载 Windows 安装包,运行安装程序,按照提示逐步完成安装。安装完成后,在浏览器中访问
http://localhost:8080
(默认端口是 8080,如果安装过程中修改了端口则使用修改后的端口号),按照初始设置向导进行配置,包括安装推荐插件等操作。
- 从 Jenkins 官网(Jenkins)下载 Windows 安装包,运行安装程序,按照提示逐步完成安装。安装完成后,在浏览器中访问
- Linux 系统(以 Ubuntu 为例):
- 先更新系统软件包列表:
sudo apt update
- 安装 Java 环境(Jenkins 依赖 Java),执行命令
sudo apt install openjdk-11-jdk
(这里以 Java 11 为例,可根据需求选择其他版本)。 - 添加 Jenkins 软件源,在
/etc/apt/sources.list.d/
目录下创建一个名为jenkins.list
的文件,内容为deb https://pkg.jenkins.io/debian-stable binary/
,然后运行命令wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
导入 Jenkins 官方密钥。 - 再次更新软件包列表后安装 Jenkins:
sudo apt install jenkins
,安装完成后,启动 Jenkins 服务sudo service jenkins start
,同样在浏览器中访问http://<服务器 IP 地址>:8080
进行初始配置。
- 先更新系统软件包列表:
3. 安装 Maven(针对 Java 项目,其他语言项目按需安装对应构建工具)
- Windows 系统:
- 从 Maven 官网(Welcome to Apache Maven – Maven)下载二进制压缩包,解压到指定目录(如
C:\Program Files\apache-maven
),然后配置环境变量,在系统环境变量的Path
变量中添加 Maven 的bin
目录路径(如C:\Program Files\apache-maven\bin
),通过命令行输入mvn -version
验证安装是否成功。
- 从 Maven 官网(Welcome to Apache Maven – Maven)下载二进制压缩包,解压到指定目录(如
- Linux 系统(以 Ubuntu 为例):
- 执行命令
sudo apt install maven
进行安装,安装完成后通过mvn -version
检查安装情况。
- 执行命令
4. 安装 Docker(如果有容器化部署需求)
- Windows 系统:
- 从 Docker 官网(https://www.docker.com/)下载 Docker Desktop for Windows 安装包,运行安装程序,按照提示完成安装,安装完成后需重启电脑使 Docker 生效,通过命令行输入
docker --version
验证。
- 从 Docker 官网(https://www.docker.com/)下载 Docker Desktop for Windows 安装包,运行安装程序,按照提示完成安装,安装完成后需重启电脑使 Docker 生效,通过命令行输入
- Linux 系统(以 Ubuntu 为例):
- 先卸载旧版本(如果有):
sudo apt-get remove docker docker-engine docker.io containerd runc
。 - 安装依赖包:
sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl gnupg lsdv
。 - 添加 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
。 - 设置稳定版软件源:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
。 - 安装 Docker 引擎:
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
,安装完成后通过docker --version
验证安装情况,并且可以运行sudo systemctl start docker
启动 Docker 服务,还可以设置开机自启sudo systemctl enable docker
。
- 先卸载旧版本(如果有):
二、项目配置
1. 创建 Git 仓库
- 在 Git 服务器(如 GitHub、GitLab 或者自建的 Git 服务器)上创建一个新的项目仓库,用于存放你的项目源代码。如果是本地已有项目,可以通过命令行进入项目目录,执行
git init
创建本地仓库,然后关联远程仓库(例如git remote add origin <远程仓库 URL>
),再将本地代码推送到远程仓库(git push -origin master
等,具体根据实际分支情况)。
2. 在 Jenkins 中配置项目
- 登录 Jenkins 网页界面,点击 “新建 Item”,输入项目名称,选择 “Freestyle project”(自由风格项目,对于简单项目比较适用,也可以后续探索更复杂的项目类型如 Pipeline 等),点击 “确定”。
- 在项目配置页面:
- General(常规):可设置项目的一些基本描述信息等。
- 源码管理:选择 “Git”,填写你的 Git 仓库地址(如
https://github.com/<用户名>/<项目名>.git
),如果是私有仓库,可能需要配置认证信息(如 SSH 密钥或者用户名密码等),然后设置要构建的分支(如master
或者其他开发分支)。 - 构建触发器:有多种触发构建的方式,例如 “Poll SCM” 可以设置定时检查代码仓库是否有更新来触发构建(如
*/5 * * * *
表示每 5 分钟检查一次);“GitHub hook trigger for GITscm polling”(如果项目托管在 GitHub 上)可以通过 GitHub 推送事件来触发构建,更加实时高效;你也可以手动点击 “立即构建” 按钮来触发构建。 - 构建环境:根据项目需求配置,比如是否需要使用 Docker 等,这里如果使用 Docker,可勾选相关 Docker 配置选项(后续还需进一步配置 Docker 相关参数)。
- 构建步骤:
- 对于 Java 项目,如果使用 Maven 构建,添加 “Execute Maven goal” 构建步骤,在 “Goals” 文本框中输入构建命令,比如
clean install
(清除之前的构建结果并重新安装项目到本地仓库,一般会生成可部署的 JAR 文件等制品)。 - 如果有其他操作,比如运行脚本、复制文件等,可以继续添加相应的构建步骤来完成对应的任务。
- 对于 Java 项目,如果使用 Maven 构建,添加 “Execute Maven goal” 构建步骤,在 “Goals” 文本框中输入构建命令,比如
三、持续集成(CI)流程实现
1. 开发人员提交代码
- 开发团队成员在本地完成代码编写、测试(本地可以先进行一些简单的单元测试等)后,将代码提交到前面创建的 Git 仓库对应的分支中(如
master
分支或者开发分支),根据设置的构建触发器,会触发 Jenkins 的构建流程。
2. Jenkins 执行构建和自动化测试
- 当触发构建后,Jenkins 会按照配置的构建步骤进行操作:
- 首先从 Git 仓库拉取最新的代码到 Jenkins 工作空间(一个临时的目录,用于存放项目代码及构建相关的文件等)。
- 然后执行 Maven 的构建命令(以 Java 项目为例),进行编译、打包等操作,生成相应的软件制品(如 JAR 文件等)。
- 接着会执行自动化测试,对于 Java 项目,如果在项目中有使用 JUnit 等测试框架编写的单元测试用例,Maven 在构建过程中会自动运行这些测试用例,并将测试结果反馈给 Jenkins。如果测试不通过,Jenkins 会在构建历史记录中标记该次构建失败,并通过之前配置的通知机制(如邮件等)通知开发人员,开发人员则需要根据测试报告去查找和修复代码中的问题,然后再次提交代码触发新的构建。
3. 查看构建结果与反馈
- 在 Jenkins 的项目页面,可以查看每次构建的详细情况,包括构建是否成功、构建时间、测试报告等信息。开发人员和相关团队成员可以通过这些信息及时了解代码集成的状态以及存在的问题,持续优化代码质量,确保每次代码提交后都能顺利通过构建和测试环节,保证代码仓库中的代码处于可随时发布的状态。
四、持续交付 / 持续部署(CD)流程实现
1. 制品管理(以 Nexus 为例,也可选用其他制品库)
- 安装 Nexus(可选步骤,如果已有合适的制品库可跳过):
- Windows 系统:从 Nexus 官网下载安装包进行安装,按照提示配置相关参数,比如端口号、仓库设置等。
- Linux 系统(以 Ubuntu 为例):可以下载 Nexus 的压缩包进行解压安装,也可以通过一些包管理工具(如 apt 等)查找是否有对应的安装包进行安装。安装完成后,配置相关参数并启动服务,通过浏览器访问对应的端口(默认是 8081)进入 Nexus 管理界面,创建相应的仓库(如 Maven 仓库用于存储 Java 项目制品等)。
- 将构建制品推送到制品库:
- 在 Jenkins 的项目配置中添加 “构建后操作” 步骤,选择 “Deploy artifacts to Maven repository”(针对 Java 项目推送制品到 Maven 仓库的情况,其他项目可根据对应工具和制品库进行相应配置),填写 Nexus 仓库的相关信息,如仓库 URL、认证信息(如果需要)等,这样在每次构建成功后,会自动将生成的软件制品(如 JAR 文件等)推送到 Nexus 制品库中进行存储和管理,方便后续部署使用。
2. 环境部署(以下以 Docker 容器化部署为例)
- 创建 Dockerfile(如果使用 Docker 部署):
在项目的根目录下创建一个Dockerfile
文件,用于定义如何将项目打包成一个 Docker 容器,例如对于一个简单的 Java 项目,其Dockerfile
内容可能如下:FROM openjdk:11-jdk-alpine WORKDIR /app COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
这表示基于
openjdk:11-jdk-alpine
这个基础 Docker 镜像(轻量级的 Java 11 环境镜像),在容器内创建/app
工作目录,将项目构建生成的 JAR 文件(假设在target
目录下)复制到容器内的/app
目录下,并设置容器启动时执行的命令为运行该 JAR 文件。 - 配置 Jenkins 进行部署(结合 Docker):
- 在 Jenkins 的项目配置 “构建后操作” 中,添加 “Execute shell”(如果是 Linux 环境)或者 “Execute Windows batch script”(如果是 Windows 环境)等步骤,在脚本内容中编写 Docker 相关的部署命令,比如:
docker build -t your-project-image. docker run -d -p 8080:8080 your-project-image
这两条命令分别表示根据项目的
Dockerfile
构建一个名为your-project-image
的 Docker 容器镜像,然后以守护进程模式(-d
)运行该容器,并将容器内的 8080 端口映射到主机的 8080 端口(这里端口可根据项目实际需求修改),使得项目可以通过主机的 8080 端口对外提供服务。 - 验证部署情况:
在目标环境(如预发布环境、生产环境等)中,通过访问相应的 URL(如http://<服务器 IP 地址>:8080
)来验证项目是否成功部署并正常运行,可以进行一些功能测试、性能测试等操作进一步确认软件在该环境下的状态,确保符合质量要求。 -
对于持续交付来说,在完成上述步骤后,还需要相关人员根据业务情况决定何时将软件从预发布环境等最终部署到生产环境中;而对于持续部署,只要前面所有流程(包括构建、测试、制品管理、环境部署验证等)都顺利通过,就会自动将软件部署到生产环境中,无需人工干预,实现快速高效的软件交付和部署。
这就是一个基于常见工具搭建 CI/CD 流程的基本教程,实际应用中可以根据不同的项目类型、团队规模、业务需求等进行更加复杂和精细化的配置与优化。
- 在 Jenkins 的项目配置 “构建后操作” 中,添加 “Execute shell”(如果是 Linux 环境)或者 “Execute Windows batch script”(如果是 Windows 环境)等步骤,在脚本内容中编写 Docker 相关的部署命令,比如: