基于 SVN 的 CICD 调研方案
定个小目标 经过沟通后,第一阶段来说是至少将 dnm 项目的后端(基于 Springboot 框架) 代码上传到 svn 之后, 能够容器化地去做到热部署。
CICD 工具现状 工具的选择:
比较项目 Jenkins Drone GitlabCi(不考虑)空间容量清理问题 需要定时清理,否则占空间越来越大 无残留 插件升级 每次需要在新环境(测试环境上),升级测试一下,比较繁琐 插件都是 docker 容易,一切都是全自动的. 生态的构建 强大,插件很多 完全基于容器来实现的 CI/CD 工具,构建的过程也完全是在容器中实现的。 CSV 支持(关键) git、svn git. Do drone Support the SVN? git 其中 新锐 Drone 以及 老牌的 gitlabCI 需要和 git 搭配,但是 我们 效能平台部 以及整个雷火的游戏都是在 svn 上的,所以可以告别这俩只有 Jenkins。
方案选定 Jenkins + Docker 自动化集成环境搭建我遇到的问题缺失 构建一个 maven 项目 的选项.image-20220512164618895image-20220512164618895
【解决方案 I 】是需要去插件市场下载的 maven integration
image-20220512164730229image-20220512164730229
【解决方案 II】 直接在 maven 的镜像中打 jar 包进行代码的编译打包,至于我是怎么做的后文有介绍.
对于 java 的项目我该配置哪些流程
流程拆解整体流程整体流程
pull code 选择的是最简单的 poll SCM 的形式,会每一分钟去触发一次。
image-20220517172814179image-20220517172814179
image-20220517172820245image-20220517172820245
完整的 dockerfile
123456789FROM hub.fuxi.netease.com/qa-web/jenkins-maven:3.6002 AS mvnWORKDIR /tmpCOPY / /tmpRUN mvn clean package
FROM openjdk:8-jdk-stretchCOPY --from=mvn /tmp/target/jenkinsImage-0.0.1-SNAPSHOT.jar "/tmp/jenkinsImage-0.0.1-SNAPSHOT.jar"
启动应用程序
ENTRYPOINT ["java", "-server", "-Xms2048m", "-Xmx4096m", "-XX:+UseG1GC", "-jar", "/tmp/jenkinsImage-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=test"]命令
12345
docker buildx build -t hub.fuxi.netease.com/luojiajun/jenkins-build:1.1 .(含义是: 使用当前目录的 Dockerfile 创建镜像,标签为 hub.fuxi.netease.com/luojiajun/jenkins-build:1.1)
docker login hub.fuxi.netease.com
docker push hub.fuxi.netease.com/luojiajun/jenkins-build:1.1 命令详解
Command –docker buildx build 构建镜像–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。Docker 部署后发现运行失败运行失败
1Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.6.7:repackage (repackage) on project jenkinsImage: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.6.7:repackage failed: Unable to find main class -> [Help 1]查看自己的 dockerfile 文件,只有短短几行就是做了一个复制到/tmp 下然后进行 mvn clean package.结果说找不到主类.
1234FROM hub.fuxi.netease.com/qa-web/jenkins-maven:3.6 AS mvnWORKDIR /tmpCOPY * /tmpRUN mvn clean package 于是自己到镜像中查看
镜像中目录文件镜像中目录文件
好家伙发现没有 src 目录。
找到了一个病友, 现象是:
copy 前 copy 前
copy 后 copy 后
最后通过修改 dockerfile
12345FROM hub.fuxi.netease.com/qa-web/jenkins-maven:3.6 AS mvnWORKDIR /tmp
注意这里是 / 不是 *
COPY / /tmp
RUN mvn clean package 最后完美运行。
主类问题解决正常打包主类问题解决正常打包
当把镜像推送上去之后发现,本地运行发现
12
mac M1 上不能运行,linux 正常。
qemu: uncaught target signal 11 (Segmentation fault) - core dumped 举个栗子🌰,Jenkins 通常内存占用较大,部署在一台单独的机器上称作 A,等它镜像打包部署推送完成后,那么如果通知 B 上的机器去更新其应用呢?
可以通过 ssh 去处理,前提是需要到 jenkins 的插件管理市场中下载 ssh.image-20220517165543290image-20220517165543290
123456
登陆 docker
cat /home/luojiajun/docker/fuxiDockerPasswd | sudo docker login -u luojiajun hub.fuxi.netease.com --password-stdin
拉取镜像
sudo docker pull hub.fuxi.netease.com/luojiajun/jenkins-build:latest
运行镜像 需要提前 chmod 777.sh 文件
source /home/luojiajun/docker/jenkinsBuild/jenkinsBuild.sh 通过执行在某个目录下的 sh 脚本去完成。这样不管是第一次运行镜像还是后续维护都能正确执行。
1234567
shell 文件
if [ $(sudo docker ps -a|grep jenkins_build |wc -l) != "0" ]thensudo docker stop jenkins_buildsudo docker rm jenkins_buildfisudo docker run -it -d -p 3426:8080 --name=jenkins_build hub.fuxi.netease.com/luojiajun/jenkins-build:latestmvn 下载依赖速度过慢,导致整个 CICD 流程因为该关键节点所 delay。就连下载最基础的 Spring framework 依赖都花费了 10min!.
image-20220516162440142image-20220516162440142
image-20220516162508450image-20220516162508450
先看效果
image-20220517162936029image-20220517162936029
其实就是把本地已经安装好的依赖放到 maven 的基础镜像库中如何实现可以看步骤一。
步骤拆解
第一步
123FROM hub.fuxi.netease.com/qa-web/jenkins-maven:3.6 AS mvnRUN mkdir /root/.m2/repository/orgCOPY / /root/.m2/repository/org 第二步
1234567
docker buildx build 构建镜像
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
docker buildx build -t hub.fuxi.netease.com/qa-web/jenkins-maven:latest .
登陆仓库
docker login hub.fuxi.netease.com
push 镜像
docker push hub.fuxi.netease.com/luojiajun/jenkins-build:1.1 如何将 ENTRYPOINT 中的启动参数进行抽离,从而做到 Dockerfile 一次编写后续可以 0 维护?
需要解决的事情(持续更新中,按照优先级排序)发送 popo 的消息打 tag 对映的 tag 多 module 的问题是如何处理?代码的 diff,类似发布系统,两个环境的代码进行比对。热部署,在服务升级的时候最好不出现 502 等问题,用户无感知地去升级参考资料热部署手把手带你搭建 jenkins 基于轻舟 CICD 的代码静态扫描流程分享阿里巴巴如何基于 Kubernetes 实践 CI/CD 修改 docker 镜像并重新推送到镜像仓库 Dockerfile 多阶段构建
评论