8

使用 CODING 进行 SpringBoot 项目的持续集成

 3 years ago
source link: https://www.wencst.com/archives/1325
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

持续集成简介

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

 
image
通用的持续集成流程大体是像上图所示一样,借助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天,于是注册一个玩一玩。

Coding持续集成

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

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

Git操作

下面为Git的操作了,相信看文章的大部分人可以略过这一步。
详细的Git步骤可以参考:Coding中的Git操作
Git操作主要为后续持续集成操作的触发器。
持续集成操作的设置相对比较简单,按照提示一步步下来即可。有一块需要注意的,就是构建所用的分支,在配置持续集成时,需要选择构建触发方式,触发时间(代码上传时触发/手动触发),以及完成时邮件发送提醒(提醒触发者/不做任何事/只有失败时提醒)。对于多分支代码工程一定要注意,选择自己所需的配置。我这里所用的为系统默认配置,即当有人提交代码至master时触发构建,完成时总是发邮件提示开发者。
官方提供了三套不同的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到对应的分支上,会自动执行构建,发现构建失败。
点开后,查看构建失败的具体原因,输出与maven编译时输出的没有什么差别。
原因提示: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 "镜像上传完毕"
            }
        } 
    } 
}
提交代码后,会自动执行构建。
可以显示程序编译过程,可以显示每一步详细输出,可以增加状态徽标到相应的文档或网页中。可以说Coding想的是比较周到的,基本集成了开源代码托管系统相应的职能。
构建使用默认的https://repo.maven.apache.org源,构建速度也还可以。
至此持续集成完成,界面清晰整洁,并且可以对测试报告和构建结果进行下载,构建过程也会发邮件给相关人员。确实让开发更简单了。以前在做这一系列工作时,架构师起码要做几件事情:
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 会越来越完善,越来越好!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK