写点什么

基于 SVN 的 CICD 调研方案

作者:ZuccRoger
  • 2022 年 5 月 17 日
  • 本文字数:2540 字

    阅读完需:约 8 分钟

定个小目标​ 经过沟通后,第一阶段来说是至少将 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


  1. docker buildx build -t hub.fuxi.netease.com/luojiajun/jenkins-build:1.1 .(含义是: 使用当前目录的 Dockerfile 创建镜像,标签为 hub.fuxi.netease.com/luojiajun/jenkins-build:1.1)

  2. docker login hub.fuxi.netease.com

  3. 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 多阶段构建

用户头像

ZuccRoger

关注

还未添加个人签名 2019.10.06 加入

还未添加个人简介

评论

发布
暂无评论
基于SVN的CICD调研方案_5月月更_ZuccRoger_InfoQ写作社区