使用 CODING 进行 Spring Boot 项目的集成 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding.NET 轻量级社交
开源项目广场
使用帮助
意见反馈
CodingNET
V2EX    Coding

使用 CODING 进行 Spring Boot 项目的集成

  •  
  •   CodingNET 2019 年 2 月 13 日 3341 次点击
    这是一个创建于 2532 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文作者:CODING 用户 - 高文

    持续集成 (Continuous integration) 是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。成员之间的代码相互影响,可能会出现各种编译、运行的错误,为了避免提交代码影响到其他开发者,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现错误,使得开发过程更加简单方便。

    Fz64HS.png

    通用的持续集成流程大体是像上图所示一样,借助 Jenkins 连通 Git 与 Docker 镜像仓库,为后续的持续部署做准备。

    而在「 CODING 持续集成」中,可以省去其中很多环境部署的麻烦事,下面说一下我在 CODING 平台做的持续集成工作。

    我与 CODING 之缘

    CODING 是国内首个一站式云端软件服务平台,致力于通过技术创新推动软件开发升级转型,让开发更简单。将代码托管、项目管理、Cloud Studio、一键部署等开发工具集成到浏览器中,免除繁杂的开发环境部署,降低软件开发部署成本。

    最初了解 「 CODING 」 ,是我在开发微信小程序时,腾讯云推荐托管代码到 CODING 上,于是注册了一个 CODING 账号。

    开始使用时,主要以 Web 版开发工具为主,觉得只是一个 Eclipse 的 Che 版本,当时也自己部署一个 Eclipse 的 Che 版本。但部署 Che 版本时,才发现,CODING 其实比 Che 好用得不是一点半点。流畅性、易用性已经高出 Che 一个等级了,功能上也比 Che 更丰富。后来逐渐用起来了,发现 「 CODING 」 不只是 WebIDE,还是 Git、Jenkins、Wiki、敏捷开发工具、项目管理工具……现在持续集成功能出来了,可以免费试用 15 天,于是注册一个玩一玩。

    wencst 的个人主页

    「 CODING 持续集成」

    基础操作

    • 首先需要创建企业账号;
    • 然后创建自己的项目;
    • 进入项目维护项目代码。

    本文所使用的源代码为本人开源的自动开发框架。

    Git 操作

    下面为 Git 的操作了,相信看文章的大部分人可以略过这一步。

    详细的 Git 步骤可以参考:《 CODING 中的 Git 操作》

    Git 操作主要为后续持续集成操作的触发器。

    持续集成

    持续集成操作的设置相对比较简单,按照提示一步步下来即可。有一块需要注意的,就是构建所用的分支,在配置持续集成时,需要选择构建触发方式,触发时间(代码上传时触发 /手动触发),以及完成时邮件发送提醒(提醒触发者 /不做任何事 /只有失败时提醒)。对于多分支代码工程一定要注意,选择自己所需的配置。我这里所用的为系统默认配置,即当有人提交代码至 master 时触发构建,完成时总是发邮件提示开发者。

    Fz6hB8.png

    「 CODING 持续集成」提供了三套不同的 Jenkinsfile 模板供开发者使用:简易模板、并行模板、自定义模板。我这里选用简易模板,并稍作修改。

    pipeline { agent { label "default" } stages { stage("检出") { steps { sh 'ci-init' checkout( [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } } stage("构建") { steps { echo "构建中..." sh 'mvn clean install' echo "构建完成." archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物 } } stage("Docker") { steps { echo "Docker 镜像生成中..." sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .' echo "镜像生成完成." sh 'docker push wencst/wencst-generatorJPA' echo "镜像上传完毕" } } } } 

    更新 Jenkinsfile 后,代码 push 到对应的分支上,会自动执行构建,发现构建失败。

    Fz6g1I.png

    点开后,查看构建失败的具体原因,输出与 maven 编译时输出的没有什么差别。

    Fz62ct.png

    原因提示:there is no POM in this directory。

    原来我中间还有一层目录,需要进入目录后才能编译。

    pipeline { agent { label "default" } stages { stage("检出") { steps { sh 'ci-init' checkout( [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } } stage("构建") { steps { echo "构建中..." sh 'cd wencst-generatorJPA && mvn clean install' echo "构建完成." archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物 } } stage("Docker") { steps { echo "Docker 镜像生成中..." sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .' echo "镜像生成完成." sh 'docker push wencst/wencst-generatorJPA' echo "镜像上传完毕" } } } } 

    提交代码后,会自动执行构建。

    Fz6c9A.png

    Fz6RjP.png

    可以显示程序编译过程,可以显示每一步详细输出,可以增加状态徽标到相应的文档或网页中。可以说「 CODING 持续集成」 想的是比较周到的,基本集成了绝大部分开源系统中相应的职能。

    构建使用默认的 https://repo.maven.apache.org 源,构建速度也还可以。

    Fz6fnf.png

    至此持续集成完成,界面清晰整洁,并且可以对测试报告和构建结果进行下载,构建过程也会发邮件给相关人员。确实让开发更简单了。以前在做这一系列工作时,架构师起码要做几件事情:

    1.搭建 git 仓库

    2.搭建 jenkins

    3.在 git 仓库中增加 CI 配置

    4.邮箱配置

    「 CODING 持续集成」为开发者省去了很多工作,除了构建过程中必要的工作以外,其他的基本一键搞定,不用关心各个组件的安装配置,环境情况,网络情况,存储备份等内容。

    Jenkinsfile 拆解

    重点解释一下 stages 部分,整体分为三个 stages:

    • 第一步为代码检出
     stage("检出") { steps { sh 'ci-init' checkout( [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } } 

    这一步检出项目中的代码到 jenkins 的 workspace 目录下,这一步是 「 CODING 持续集成」 默认的配置,无需过多解释。

    • 第二步为编译构建
     stage("构建") { steps { echo "构建中..." sh 'cd wencst-generatorJPA && mvn clean install' echo "构建完成." archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } 

    这一步是执行代码编译,我所用的是 maven 编译 spring boot 工程, 「 CODING 持续集成」 集成了 mvn 命令,可以直接执行 maven 操作。

    注意:jenkins 执行 sh 命令的根路径都是在当前 workspace 下,所以切换路径与 maven 编译命令要在同一个 sh 命令下。

    编译执行后,收集编译的产物,archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true这一步的意思是,将所有工程的 target 路径下的 jar 包都算作工程产物。

    • 第三步为 docker 镜像生成
     stage("Docker") { steps { echo "Docker 镜像生成中..." sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .' echo "镜像生成完成." sh 'docker push wencst/wencst-generatorJPA' echo "镜像上传完毕" } } 

    对于熟悉 docker 的人并不是很陌生,依旧使用 shell 命令来执行 docker build 操作。 cd wencst-generatorJPA/target 首先切换路径到 jar 包所在目录。 cp classes/Dockerfile . 拷贝 Dockerfile 到当前路径下。 docker build -t wencst/wencst-generatorJPA .执行 docker build 操作,用以创建 docker 镜像。 docker push wencst/wencst-generatorJPA 将创建出来的 docker 镜像上传到 dockerhub 中去。

    总结

    整体来说 「 CODING 持续集成」 想的很周全了,无论从易用性、美观度以及人性化角度上来说,做得都非常不错。下面着重说说我使用 「 CODING 企业版」 的持续集成后的感受:

    1. 满足了从开发到代码管理,到代码集成,到单元测试,甚至到后续部署,一站式管理;
    2. 配置相对简单,只需配置 Jenkinsfile 即可完成,无需花费大量的人力物力来做各系统间的整合操作;
    3. 系统集成后,会给开发人员发送邮件,报告集成成功或失败,这一点还是比较人性化的;
    4. 「 CODING 持续集成」平台集成了很多种命令,起码我用到的 mvn/java/docker/git 这一类的命令基本都集成在服务中了。

    希望 CODING 会越来越完善,越来越好!

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3223 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:32 PVG 20:32 LAX 04:32 JFK 07:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86