浅谈: DevOps 落地之 「持续集成」

2019-02-27 15:18 评论 0 条

2018 年对许多人来说是艰难与变革的一年,势如破竹的发展势头似乎被打破,小微创新型企业生存艰难。“产业互联网”“企业数字化转型”等寻求从内破局的呼声也越来越高。DevOps(/de'vɒps/)成为了企业数字化转型的热点 ,大家纷纷开始讨论要不要采用 DevOps 、DevOps 到底有没有那么神奇。

Google Trends 中 DevOps 历年的热度数据

DevOps 是什么

软件开发最高效的组织形式是“One Man Work”,只有一个人干活,写个小项目,从需求到开发,从测试到部署全部独立完成,非常高效。但随着业务的增长,项目开始逐渐变得庞大,变成团队,出现了分工,出现了产品经理、项目经理、开发、数据、测试、运维等等角色。这些角色间存在天然的工作目标上的矛盾。

DevOps 的理念就是希望能打破这种屏障,让研发(Development)和运维(Operations)一体化,让团队从业务需求出发,向着同一个目标前进。

困难重重的 DevOps 落地

大多数企业都愿意尝试运用 DevOps ,但是在实践 DevOps 中,普遍碰到了比较大的困难。实践 DevOps 的原则中很重要的一点就是对工具的运用及依赖工具搭建合适企业的自动化流程。但是目前市面上缺乏成熟的 DevOps 工具链,各个服务商的细分工具层出不穷,企业为了搭建整套 DevOps 流程,需要研究几十种工具,并选取其中的 7-8 种进行落地实践。非常依赖于管理者的项目经验,没有 DevOps 经验的团队起步将会比较困难。

上图是 Netflix 的整个系统架构。如此复杂的系统架构同时还能每天迭代几十个版本,无法通过传统的研发管理模式来维护,只有通过实践 DevOps 的理念,来优化组织的分工、资源和能效,才能得以实现。

DevOps落地大致由云基础架构、持续集成、持续交付、自动化测试和配置管理五部分组成,而很多企业,为了巩固和提高自己的市场竞争力,非常急于达成上述高效的状态,并且希望能一步到位。国内其实大部分团队都没到大规模实践 DevOps 的时间点,有些团队甚至连分支开发、并行开发的方式都没有。所以我给的建议是:可以先从git + 持续集成(CI)开始落地,逐步完善DevOps体系。

持续集成的概念

持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

持续集成的优点

        1.解放了重复性劳动。

自动化部署工作可以解放集成、测试、部署等重复性劳动,而机器集成的频率明显比手工高很多。

        2.更快地修复问题。

持续集成更早的获取变更,更早的进入测试,更早的发现问题,解决问题的成本显著下降。

        3.更快的交付成果。

更早发现错误减少解决错误所需的工作量。集成服务器在构建环节发现错误可以及时通知开发人员修复。集成服务器在部署环节发现错误可以回退到上一版本,服务器始终有一个可用的版本。

        4.减少手工的错误。

在重复性动作上,人容易犯错,而机器犯错的几率几乎为零。

        5.减少了等待时间。

缩短了从开发、集成、测试、部署各个环节的时间,从而也就缩短了中间可以出现的等待时机。持续集成,意味着开发、集成、测试、部署也得以持续。

        6.更高的产品质量。

集成服务器往往提供代码质量检测等功能,对不规范或有错误的地方会进行标致,也可以设置邮件和短信等进行警告。

持续集成的模式

如下图所示:

CI 过程:代码编写 -> 源代码库 -> CI 服务器(代码构建、自动化测试、结果反馈【构建结果】)

涉及到的 CI 工具:Jenkins、Travis CI、CODING CI、TeamCity、Gitlab CI等,相关资料可以查询对应的官网,其中应用比较广泛的是 Jenkins 和 Travis CI。

持续集成服务的选择

网上关于集成服务的工具很多,其中以 Jenkins 服务最受欢迎,但是 Jenkins 服务需要在自己服务器上进行配置安装,以及安装各种插件,对于刚上手的小白来说,可能存在一定的门槛,操作步骤繁多,操作不够智能,缺少一键发布构建服务等。我这里选择了「CODING 企业版」来进行实践举例,这个产品的持续集成功能是基于 Jenkins 的,并且兼容 Jenkinsfile 配置文件,如果之前有使用过或者写过 Jenkinsfile 可以很快上手。

基于 CODING 的 Spring Boot 持续集成项目示例

登录 coding,进入项目中心,点击左边菜单集成服务,开通集成服务,配置完成之后会手动触发第一次构建过程。

找到或者创建 Jenkinsfile,如果你对于 Jenkins 比较熟悉的话,可以自己编写 Jenkinsfile 配置文件,也可以采用 CODING 提供的模板文件。我这里采用了 Jenkinsfile 模板文件来实行自动化持续集成服务,可以在修改 Jenkinsfile 的时候修改触发方式,并选择自行推送到某个标签或者某个分支时间触发构建。jenkins 已经能够为 agent 默认配置好 timezone 和 localtime(默认中国上海)。

配置好 Jenkinsfile 文件以及配置好环境变量,点击保存,便可以进行持续集成项目了。

如图所示,集成步骤分为拉取代码-》构建-》测试-》部署等步骤,点击每个步骤可以看到相应的命令执行情况,下面来一个一个步骤配合 Jenkinsfile 文件解释命令的一些执行情况:

代码工程结构如图所示

1.检出项目

如下所示 Jenkinsfile 配置文件第一步通过 Git 检出在远程仓库分支的代码,至于哪个分支可以通过环境变量配置读取 REF 这个环境变量

stage("检出") {

steps {

sh 'ci-init'

checkout(

[$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],

userRemoteConfigs: [[url: env.GIT_REPO_URL]]]

)

}

}

如上图所示,第一步主要是执行从 Git 仓库远程拉取代码,所以命令都是 Git 里面的,包括读取 Git 配置的环境变量包括更新 Jenkinsfile 文件。

2.构建项目

如下命令所示构建这一步主要是初始化代码和打包代码,因为这个示例工程是以 Java 为主要开发语言,所以重点关注 Java 版本和 安装 Maven 命令即可打包,目前CODING提供的语言环境包括了 java-1.8.0_181, go-1.7.4, node-10.11.0, php-7.0.30, ruby-2.3, python-2.7.13 等。如有需要可以联系客服进行开通其它语言环境。

stage("构建") {

steps {

echo "构建中..."

sh 'go version'

sh 'node -v'

sh 'java -version'

// sh 'php -v'

// sh 'python -V'

// sh 'gcc -v'

// sh 'make -v'

// 请在这里放置您项目代码的单元测试调用过程,例如:

sh 'mvn clean' // mvn 清除缓存

sh 'mvn install' // 构建 Maven 工程

// sh 'make' // make 示例

echo "构建完成."

// archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物

}

}

因为这个 SpringBoot 项目是以 Java 为主的项目,所以在 Jenkinsfile 文件命令里面其实可以把其它语言的检查版本命令去掉,只需要执行 java -version 命令即可。

第一次构建失败:

如上图所示,第一次执行执行构建 jar 包失败,因为在本地可以正常 mvn install,所以起初我百思不得其解,上网找了很多资料,经过多番查找,最后在Stack Overflow 找到了答案,这是由于  OpenJDK 1.8.0_181 这个版本中存在的一个 bug 所致,原文如下:链接最终解决方案采用更改 pom.xml 文件:

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<configuration>

<useSystemClassLoader>false</useSystemClassLoader>

<skipTests>true</skipTests>

</configuration>

</plugin>

成功构建结果如下:

3.测试项目

如下所示,SpringBoot 工程通过 mvn test 测试命令即可,比如测试其中一个用户信息相关的单元测试:

stage("测试") {

steps {

echo "单元测试中..."

// 请在这里放置您项目代码的单元测试调用过程,例如:

sh 'mvn test -Dtest=com.my.blog.website.Pwdtest'  //测试其中一个单元测试

echo "单元测试完成."

}

}

第一次失败测试结果如下:

经过检查,是单元测试代码其中存在 bug,修正之后,正确的第二次测试结果如下:

4.部署项目

如下所示,部署项目命令可以执行自己写的部署脚本文件。各位可以结合自己项目的真实环境,编写简单的部署脚本,比如上传 jar 包到服务器,然后通过 java - jar XXXX.jar 包执行方式,以及上传 war 包到 tomcat 服务器,然后启动 tomcat 服务器等,也可以结合自己公司项目需要编写复杂的执行脚本文件,然后调用执行脚本命令,比如下面举一个简单的执行脚本例子。

部署命令:

stage("部署") {

steps {

echo "部署中..."

sh './deploy.sh start' // 启动 tomcat 服务

// sh './deploy.sh stop' // 停止 tomcat 服务

echo "部署完成"

}

}

deploy.sh 脚本:(其中一些tomcat 服务路径配置根据自己需要进行修改)

#!/bin/bash

tomcat_home=/usr/tomcat/apache-tomcat-8.0.48  //修改为自己服务器的 tomcat 路径

SHUTDOWN=$tomcat_home/bin/shutdown.sh

STARTTOMCAT=$tomcat_home/bin/startup.sh

case $1 in

start)

echo "启动$tomcat_home"

$STARTTOMCAT

;;

stop)

echo "关闭$tomcat_home"

$SHUTDOWN

pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'`

kill -9 $pidlist

#!/bin/bash

tomcat_home=/usr/tomcat/apache-tomcat-8.0.48

SHUTDOWN=$tomcat_home/bin/shutdown.sh

STARTTOMCAT=$tomcat_home/bin/startup.sh

case $1 in

start)

echo "启动$tomcat_home"

$STARTTOMCAT

;;

stop)

echo "关闭$tomcat_home"

$SHUTDOWN

pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'`

kill -9 $pidlist

stop)

echo "关闭$tomcat_home"

$SHUTDOWN

pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'`

kill -9 $pidlist

#删除日志文件,如果你不先删除可以不要下面一行

rm $tomcat_home/logs/* -rf

#删除tomcat的临时目录

rm $tomcat_home/work/* -rf

;;

restart)

echo "关闭$tomcat_home"

$SHUTDOWN

pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'`

kill -9 $pidlist

#删除日志文件,如果你不先删除可以不要下面一行

rm $tomcat_home/logs/* -rf

#删除tomcat的临时目录

rm $tomcat_home/work/* -rf

sleep 5

echo "启动$tomcat_home"

$STARTTOMCAT

#看启动日志

#tail -f $tomcat_home/logs/catalina.out

;;

logs)

cd /mnt/alidata/apache-tomcat-7.0.68/logs

tail -f catalina.out

;;

esac

一点题外话

在使用CODING的过程中,我发现CODING的产品理念还挺好的,一站式提供需求管理、代码管理、持续集成、开发环境管理、测试管理、缺陷管理等功能,适用于传统模式和敏捷模式的软件研发项目和产品运营,对落地DevOps有一定的帮助。并且CODING的各个流程之间可以相互关联,企业内部的信息流转比较顺畅,这一点区别于很多同类型的厂商,推荐大家去试试。

另外,我向 CODING 要了一批小福利,点击下面链接注册,或者识别下面图片二维注册,下单除了可以享受首充特别优惠(999/10人/年)之外,还可以管我要洋葱猴抱枕礼品一个。

注册链接:https://e.coding.net?cps_source=PIRHNJiI

敲黑板:因为 CODING 要进行渠道溯源认证才会送礼品,所以请大家一定要用上面链接注册哦。

来源:CODING成都运营中心

版权声明:倡导尊重与保护知识产权,本文著作权归原作者所有。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至admin@cnitweb.cn,我们将及时沟通与处理,谢谢支持!
转载请注明:浅谈: DevOps 落地之 「持续集成」 | IT小喇叭-关注移动互联网创新创业的科技媒体,助力企业的品牌宣传!企业品牌宣传,就找IT小喇叭!www.itxiaolaba.com
分类:新闻中心 标签:

发表评论

您必须 登录 才能发表留言!