1. 持续集成(CI)的核心概念与优势
- 定义:频繁将代码集成到主干(如每日多次),通过自动化构建、测试和部署流程确保代码质量。
- 组成要素:
- 自动化构建:包含代码检出、编译、测试、结果记录等步骤。
- 代码存储库:使用Git或SVN管理代码版本。
- 持续集成服务器:如Jenkins,用于调度和执行自动化流程。
- 优势:
- 降低风险:早期发现问题,减少修复成本。
- 减少重复工作:自动化流程替代手动操作。
- 支持持续交付:快速生成可部署的单元包。
2. 软件开发模式对比
- 瀑布模型:
- 线性流程:需求分析→设计→实现→测试→进化。
- 缺点:无法适应需求变化,交付周期长。
- 敏捷开发:
- 迭代开发:将大项目拆分为多个小周期(迭代),每个迭代完成完整功能。
- 增量开发:每个版本新增完整功能,而非分阶段完成所有模块。
- 优势:早期交付、快速响应需求变化。
3. Jenkins核心配置与工具集成
- 安装与初始化:
- 通过YUM或RPM安装Jenkins,配置端口和用户权限。
- 访问管理后台,安装默认插件并创建管理员用户。
- 插件安装:
- 必要插件:Maven Integration、GitLab、Docker、SSH等。
- 配置镜像源:解决插件安装失败问题。
- 全局工具配置:
- 指定JDK、Maven、Docker路径,确保构建环境一致性。
4. 微服务部署与Docker集成
- 多环境配置:
- 通过
spring.profiles.active
指定环境(dev/test/prod)。 - 在Nacos配置中心管理不同环境的配置文件。
- 通过
- Docker镜像构建:
- Dockerfile示例:
FROM java:8 VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENV JAVA_OPTS="-server -Xms256m -Xmx512m" ENTRYPOINT ["sh", "-c", "java -jar $JAR_FILE $PARAMS"]
VOLUME
:避免容器存储层写入临时文件。ENTRYPOINT
:启动时执行Java命令,支持动态传参(如--spring.profiles.active=prod
)。
- Maven插件配置:
用于将微服务打包为Docker镜像并推送至私有仓库。<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <configuration> <repository>${docker.image}/${project.artifactId}</repository> </configuration> </plugin>
- Dockerfile示例:
5. Jenkins自动化部署流程
- 基础依赖打包:
- 从Git拉取代码,执行
mvn install
安装公共依赖到本地仓库。
- 从Git拉取代码,执行
- 微服务打包与镜像构建:
- Maven命令:
clean install -Dmaven.test.skip=true dockerfile:build -f heima-leadnews-service/pom.xml
-Dmaven.test.skip=true
:跳过测试。dockerfile:build
:触发Docker镜像构建。
- Shell脚本:
# 清理旧容器和镜像 docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}') docker image prune -f # 启动新容器 docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $IMAGE_TAG
--net=host
:容器使用宿主机网络,避免端口映射问题。-e PARAMS
:传递启动参数(如指定环境)。
- Maven命令:
6. 远程服务器部署与私有仓库
- 私有仓库配置:
- 启动Docker Registry服务:
docker run -d -p 5000:5000 --name registry -v /data/registry:/var/lib/registry registry:latest
- 客户端配置
insecure-registry
以允许HTTP访问。
- 启动Docker Registry服务:
- Jenkins远程部署流程:
- 镜像推送:
docker tag local-image 192.168.200.100:5000/remote-image docker push 192.168.200.100:5000/remote-image
- 远程服务器拉取并启动:
docker pull 192.168.200.100:5000/remote-image docker run -d --name service-name 192.168.200.100:5000/remote-image
- 镜像推送:
7. Jenkins触发器配置
- 触发方式:
- URL触发:通过访问特定URL触发构建(如
http://jenkins-server/job/job-name/build?token=TOKEN
)。 - 定时构建:使用Cron表达式(如
H H/2 * * *
表示每2小时构建一次)。 - 轮询SCM:定时检查代码仓库变更,触发构建。
- URL触发:通过访问特定URL触发构建(如
关键代码解释说明
1. Dockerfile指令
FROM java:8
:基于Java 8镜像构建。ARG JAR_FILE
:定义构建参数,用于传递JAR包路径。COPY ${JAR_FILE} app.jar
:将本地JAR包复制到容器内。ENTRYPOINT
:指定容器启动时执行的命令,支持动态参数(如$PARAMS
)。
2. Maven多环境配置
pom.xml
中的profiles
:
通过Maven Profile切换不同环境配置。<profiles> <profile> <id>dev</id> <properties> <spring.profiles.active>dev</spring.profiles.active> </properties> </profile> </profiles>
3. Jenkins Shell脚本
- 清理旧容器:
根据任务名称(docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
$JOB_NAME
)删除旧容器,避免冲突。 - 镜像清理:
删除未被使用的镜像,释放磁盘空间。docker image prune -f
4. Cron表达式示例
H/30 * * * *
:每30分钟构建一次。0 8,12,22 * * *
:每天8点、12点、22点构建。
技术亮点
- 全流程自动化:从代码提交到镜像构建、测试、部署,全程无需人工干预。
- 环境隔离:通过Docker和Nacos实现多环境配置隔离,确保生产环境稳定性。
- 高效资源管理:利用Docker镜像和私有仓库,实现快速部署和版本回滚。
- 灵活触发机制:支持多种触发方式(如定时、代码变更),适应不同场景需求。