上节课和大家介绍了Gitlab CI结合Kubernetes进行 CI/CD 的完整过程。这节课结合前面所学的知识点给大家介绍一个完整的示例:使用 Jenkins + Gitlab + Harbor + Helm + Kubernetes 来实现一个完整的 CI/CD 流水线作业。
其实前面的课程中我们就已经学习了 Jenkins Pipeline 与 Kubernetes 的完美结合,我们利用 Kubernetes 来动态运行 Jenkins 的 Slave 节点,可以和好的来解决传统的 Jenkins Slave 浪费大量资源的缺点。之前的示例中我们是将项目放置在 Github 仓库上的,将 Docker 镜像推送到了 Docker Hub,这节课我们来结合我们前面学习的知识点来综合运用下,使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业。
流程
下图是我们当前示例的流程图
- 1. 开发人员提交代码到 Gitlab 代码仓库
- 2. 通过 Gitlab 配置的 Jenkins Webhook 触发 Pipeline 自动构建
- 3. Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建
- 4. 先进行代码静态分析,单元测试
- 5. 然后进行 Maven 构建(Java 项目)
- 6. 根据构建结果构建 Docker 镜像
- 7. 推送 Docker 镜像到 Harbor 仓库
- 8. 触发更新服务阶段,使用 Helm 安装/更新 Release
- 9. 查看服务是否更新成功。
项目
本次示例项目是一个完整的基于 Spring Boot、Spring Security、JWT、React 和 Ant Design 构建的一个开源的投票应用,项目地址:https://github.com/callicoder/spring-security-react-ant-design-polls-app。
我们将会在该项目的基础上添加部分代码,并实践 CI/CD 流程。
服务端
首先需要更改的是服务端配置,我们需要将数据库链接的配置更改成环境变量的形式,写死了的话就没办法进行定制了,修改服务端文件src/main/resources/application.properties,将下面的数据库配置部分修改成如下形式:
spring.datasource.url= jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:polling_app}?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=falsespring.datasource.username= ${DB_USER:root}spring.datasource.password= ${DB_PASSWORD:root}
当环境变量中有上面的数据配置的时候,就会优先使用环境变量中的值,没有的时候就会用默认的值进行数据库配置。
由于我们要将项目部署到 Kubernetes 集群中去,所以我们需要将服务端进行容器化,所以我们在项目根目录下面添加一个Dockerfile文件进行镜像构建:
FROM openjdk:8-jdk-alpineMAINTAINER cnych ENV LANG en_US.UTF-8ENV LANGUAGE en_US:enENV LC_ALL en_US.UTF-8ENV TZ=Asia/ShanghaiRUN mkdir /appWORKDIR /appCOPY target/polls-0.0.1-SNAPSHOT.jar /app/polls.jarEXPOSE 8080ENTRYPOINT ["java