0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对iPipeline的接口进行优化和实践

8nfr_ZTEdevelop 来源:未知 作者:易水寒 2018-04-05 18:14 次阅读




概述

XXX项目原CI系统由项目自行搭建,使用Jenkins传统的Job方式来实现VerifyCI和MergeCI以及DailyBuild。随着项目规模越来越大,分支越来越多,合代码的频率也逐渐增大的情况下,现有系统呈现出诸多不便之处。为解决这些问题,项目尝试引入一系列现成公司级Devops研发工具并结合Jenkins2.0的Pipeline新特性来改造本项目Pipeline流程。

Pipeline as Code 是 Jenkins 2.0 版本的精华所在,是帮助 Jenkins 实现从 CI 到 CD 华丽转身的关键工具。所谓 Pipeline,简单来说,就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。落实到代码级别,即我们只需要把精力集中在编写 Jenkinsfile 文件上,然后将其随同代码库一起托管,Jenkins可以根据Jenkinsfile来迅速拉起项目的CI流程,方便高效。

但是随着多个项目的试行、落地,发现基于Jenkins2.0的Pipeline功能强大,但是具体应用到各个项目还有如下几个痛点:

各个项目都在编写自己特色的Jenkinsfile,很多时候互相复制修改一下代码实现,Jenkinsfile冗余度非常高;

按照Jenkins1.x时代的思路,订制化自己的CI/CD流程、邮件通知、报告输出,转换过程缓慢而痛苦;

遇到技术问题没有能力解决、采用一些过时的方法和工具,而其他项目组已经解决一些技术问题或者采用了更加先进的方法和工具,互相并不能及时分享;

为了解决这些问题,经过项目反复调研和摸底,最终采用了中开社上开源的Jenkins2.0的Pipeline共创库iPipeline(又称plll库)来辅助本项目重构CI流程。

iPipeline是简化CI Pipeline部署的工具集,是面向开发人员和CI配置管理员的函数库,其封装了Jenkins 2.0的常用函数,集成了Gerrit、制品库、云CI、度量、告警采集、邮件通知,另外提供docker封装的工具集(复杂度、Klocwork、度量分析、度量导入等)。利用其可以帮助我们节省很多精力,避免重复造轮子,因此非常满足我们项目的需求。

问题描述

iPipeline框架在本项目的实践过程中确实提高了很多效率和幸福感,但结合本项目一些实际的使用情况,发现其仍然存在一些优化和改进的点。为此针对我们项目的需要,我们对iPipeline做了如下一些优化并实践。

问题1

利用plll库提供的pdocker接口,可以很方便地在指定的节点上运行指定的Docker容器来完成相关CI任务。比如本项目圈复杂度检查已经Docker化,因此可以利用pdocker接口,通过配置上镜像名、映射目录以及需要运行的指令与脚本来执行代码的圈复杂度检查。

但是实际在对pdocker接口的使用过程中发现,plll库每次都会去节点上pull镜像,然后再运行,这对于镜像其实已经存在于本地节点的情况其实并没有必要,因此需要改造。

问题2

目前plll库提供的Update接口仅支持Gerrit代码仓库的代码检出更新,但本项目运行某些用例测试需要的报文存储于SVN库上,因此有必要扩充plll库原有接口,使其支持SVN库的代码更新

带着这两个问题,我们对plll库做出了对应的一些优化并且实践之。

优化实践

优化1:pdocker接口是否需要拉取镜像由用户自定义

改造pdocker接口,添加参数来控制是否需要pull镜像,接口代码片段如下:

/**

* 工具名称:docker执行

* 工具描述:

* image - 镜像的全路径

* needPull - 是否需要pull镜像

* before_cmd - 以root执行的命令行,在执行user_cmd前执行

* volumes - 路径映射清单,"a:b,c:d"

* params - 执行参数

* profile - 环境文件,可执行

* user_cmd - 以当前用户执行的命令行(需要镜像支持adduser命令)

* after_cmd - 以root执行的命令行,在执行user_cmd后执行

* local_dir - 存放临时文件的目录(要求有权限映射到容器内)

* shared_dir - 存放代码和产出文件的目录(要求有权限映射到容器内)

* sh_exec - shell进程,默认为sh

**/

def call(image, needPull, before_cmd, volumes='',params='', profile='', user_cmd='', after_cmd='',

local_dir=env.LOCAL, shared_dir=env.SHARED, sh_exec='sh'){

// ...此处代码省略...

if( needPull =="no"){

echo "no need to pull image !!! The image exists in local!"

writeFile file:docker_entry_file, text:"""

set -e

docker run --rm ${params} ${volumes} ${image} ${sh_exec} -x -c ${docker_run_file}

"""

}elseif( needPull =="yes"){

writeFile file:docker_entry_file, text:"""

set -e

docker pull ${image}

docker run --rm ${params} ${volumes} ${image} ${sh_exec} -x -c ${docker_run_file}

"""

}

// ...此处代码省略...

}

由代码可以看出,通过添加needPull参数,即可由用户自定义是否需要pull镜像。

使用举例:

例如本项目调用pdocker接口利用自制docker镜像完成代码圈复杂度检查:

pnode("${env.NODE_NAME}"){

plll.Check("CCN_DOCKER","CCN_DOCKER",[

run_execute:{ pdocker (

/* image */"docker.zte.com.cn:5000/10010891/lizard:v1",

/* need pull */"no",

/* cmd */"cd /home/code/ && chmod -R 777 * && cd script/VerifyCI/CCNCheck/ && sh +x lizard.sh",

/* volumes */"-v ${env.SHARESPACE}/${env.XXXXX_DIR}:/home",

/* params */"--privileged",

)

},

param:[

report_file:[]

]

]);

}

由于docker.zte.com.cn:5000/10010891/lizard:v1已经存在于我们的外挂节点上,因此此处needPull参数置为no即可控制pdocker内部无需再去pull镜像。

优化2:扩充框架Update接口,使其支持SVN代码更新

优化Plll库代码,加入UpdateSVN接口来支持SVN库的代码检出与更新

/**

* 功能名称:Update

* 功能描述:通过SVN更新代码

**/

defUpdateSVN(name, desc, args){

LogDebug("[DEBUG] Update: ${name}, ${desc}")

args.run_execute ={

dir("${args.scm.path}"){

svn_checkout( args.scm.keyid, args.scm.repo, args.scm.path )

}

}

/* 调用功能适配 */

FunctionAdapter("Update","update", name, desc, args){}

return

}

/**

* 工具名称:svn_checkout

* 工具描述:svn更新代码

* 参数描述:

* - keyid: SVN库的Credentials ID

* - repo: SVN库Repo路径

* - path: 代码下载路径

**/

def svn_checkout(keyid, repo, path){

checkout([

$class:'SubversionSCM',

additionalCredentials:[],

excludedCommitMessages:'',

excludedRegions:'',

excludedRevprop:'',

excludedUsers:'',

filterChangelog:false,

ignoreDirPropChanges:false,

includedRegions:'',

locations:[

[credentialsId:"${keyid}", depthOption:'infinity', ignoreExternalsOption:true,local:".", remote:"${repo}"]

],

workspaceUpdater:[$class:'UpdateUpdater']

])

return

}

使用举例:

用户只需要配置上:

SVN库的Credentials ID

SVN库Repo路径

代码下载路径

即可完成SVN代码检出和更新,示例如下:

// 先配置好SVN相关参数

env.SVN_KEY_ID ="89a6fe98-8f0c-4fe6-829e-6d1cbda188e1"

env.CASE_DIR ="/jenkins_ci/CASE_TEST/PATH"

env.CASE_SVN_URL ="svn://XXX.XX.XXX.XXX/XXXXXXX/case/XXXX"

// 调用UpdateSVN接口完成SVN库代码更新

plll.UpdateSVN('SVN_UP','更新SVN上报文',[

scm:[keyid:"${env.SVN_KEY_ID}", repo:"${env.CASE_SVN_URL}", path:"env.CASE_DIR"],

run_dir:"${->OUTPUT_PATH}"

])

推广建议

本文章相关优化改进可推广至需要利用docker镜像完成相关CI任务和代码管控涉及SVN库的项目

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148463
  • Pipeline
    +关注

    关注

    0

    文章

    27

    浏览量

    9293

原文标题:干货 | Jenkins2.0 Pipeline框架(iPipeline)优化实践之路(一)

文章出处:【微信号:ZTEdeveloper,微信公众号:中兴开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    优化高速接口的时序裕量

    本文将对源同步定时如何优化高速接口时序裕量进行讨论。时序预算是对系统正常工作所需时序参数或时序要求的计算。
    发表于 03-20 10:46 2457次阅读
    <b class='flag-5'>优化</b>高速<b class='flag-5'>接口</b>的时序裕量

    LabVIEW 助力优化软件开发实践和源代码控制

    的软件开发实践和程序源代码控制管理。  源代码控制管理  源代码控制管理是软件工程最基本的环节之一(因为它决定了如何对一个应用程序的依赖关系进行存储、组织管理以及在开发者之间共享,甚至会直接影响程序
    发表于 09-13 09:30

    CoolRunner-II CPLD入门套件上的USB接口可以进行优化吗?

    亲爱的朋友们,作为一个业余爱好者,我想问一个关于通过板载USB端口连接我的CoolRunner-II CPLD入门套件的问题。是否可以使用板载USB设备对CPLD进行编程,然后将其作为已实现应用程序的通信接口进行
    发表于 08-20 10:48

    工业吸尘吸水机谷歌优化推广,12年实践经验

    `工业吸尘器的外贸怎么推广,网站优化更有效果工业吸尘吸水机谷歌优化推广,12年实践经验扫地机关键词如何SEO优化到GOOGLE首页 曾经我以为GOOGLE SEO
    发表于 10-28 15:53

    高原环境下TD-SCDMA网络的优化实践,不看肯定后悔

    高原环境下TD-SCDMA网络的优化实践,不看肯定后悔
    发表于 05-28 06:57

    虚幻引擎的纹理最佳实践

    纹理是游戏不可或缺的一部分。 这是一个艺术家可以直接控制的领域,以提高游戏的性能。 本最佳实践指南介绍了几种纹理优化,这些优化可以帮助您的游戏运行得更流畅、看起来更好。 最佳实践系列指
    发表于 08-28 06:39

    政府外网优化设计实践

    政府外网优化设计实践 摘  要:本文详细分析了政府外网应用特点,结合当前先进的网络技术和设备功能及其在管理工作中应用,描述了适用于政府各级部
    发表于 05-23 15:44 5次下载

    MySql5.6性能优化最佳实践

    MySql5.6性能优化最佳实践
    发表于 09-08 08:47 13次下载
    MySql5.6性能<b class='flag-5'>优化</b>最佳<b class='flag-5'>实践</b>

    iPipeline的对plll库做出了对应的优化实践之。

    项目CI系统引入了Jenkins2.0 iPipeline 框架(plll库)之后应该说提升了很多幸福感,其中一个很重要的方面来源于框架已经为用户提供了报告和邮件的基本格式,显示直观且高效。
    的头像 发表于 04-05 18:23 4607次阅读
    对<b class='flag-5'>iPipeline</b>的对plll库做出了对应的<b class='flag-5'>优化</b>并<b class='flag-5'>实践</b>之。

    18种接口优化方案汇总1

    之前工作中,遇到一个`504`超时问题。原因是因为接口耗时过长,超过`nginx`配置的`10`秒。然后 真枪实弹搞了一次接口性能优化,最后接口从`11.3s`降为`170ms`。本文
    的头像 发表于 02-15 15:59 496次阅读
    18种<b class='flag-5'>接口</b><b class='flag-5'>优化</b>方案汇总1

    18种接口优化方案汇总2

    之前工作中,遇到一个`504`超时问题。原因是因为接口耗时过长,超过`nginx`配置的`10`秒。然后 真枪实弹搞了一次接口性能优化,最后接口从`11.3s`降为`170ms`。本文
    的头像 发表于 02-15 15:59 472次阅读
    18种<b class='flag-5'>接口</b><b class='flag-5'>优化</b>方案汇总2

    你会从哪些维度进行MySQL性能优化?1

    你会从哪些维度进行MySQL性能优化?你会怎么回答? 所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知
    的头像 发表于 03-03 10:23 329次阅读
    你会从哪些维度<b class='flag-5'>进行</b>MySQL性能<b class='flag-5'>优化</b>?1

    你会从哪些维度进行MySQL性能优化?2

    你会从哪些维度进行MySQL性能优化?你会怎么回答? 所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知
    的头像 发表于 03-03 10:23 325次阅读
    你会从哪些维度<b class='flag-5'>进行</b>MySQL性能<b class='flag-5'>优化</b>?2

    介绍得物App在资源优化上做的一些实践

    包体积优化中,资源优化一般都是首要且容易有成效的优化方向。资源优化是通过优化APK中的资源项来优化
    的头像 发表于 07-24 09:00 459次阅读
    介绍得物App在资源<b class='flag-5'>优化</b>上做的一些<b class='flag-5'>实践</b>

    大规模神经网络优化:超参最佳实践与规模律

    从理论分析入手把握大规模神经网络优化的规律,可以指导实践中的超参数选择。反过来,实践中的超参数选择也可以指导理论分析。本篇文章聚焦于大语言模型,介绍从 GPT 以来大家普遍使用的训练超参数的变化
    的头像 发表于 12-10 21:45 590次阅读