前言碎语
jenkins是一款流行的开源持续集成软件,插件丰富,扩展灵活。2.0后推出pipeline流式构建,支持构建任务脚本化。本文主要旨在使用jenkins 的pipeline功能完成java maven项目的打包,上传jar到目标服务器。pipeline推出时间不长,实际使用的不是很多,网上基本没啥参考资料,官方的文档很详细,但不成本文所述体系。这篇博文是博主摸索半天后的成果,如有错落,欢迎指出。
说明:本文环境默认包含组件:jenkins,maven,jdk
一,安装pipeline支持插件
到配置中心插件管理搜索如下插件,安装
Pipeline Maven Integration Plugin :执行withMaven方法支持,用于构建maven项目工程,使用方式如下图,详细说明见:https://wiki.jenkins.io/display/JENKINS/Pipeline+Maven+Plugin
SSH Agent Plugin :sshagent方法支持,用于上传构建产物到目标服务器,使用详情见:
https://wiki.jenkins.io/display/JENKINS/SSH+Agent+Plugin,这边博主实操时有个大坑,后面说详细说明
二,创建流式Item,如图
三,编写pipeline脚本
脚本分三个步骤块,分别是git clone(下载源码到本地),build(构建工程),deploy(上传构建产物到目标主机),脚本如下:
node {
stage('git clone') { // for display purposes
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxx-xxxx-xxxxx-xxxxxx', url: 'http://git.xx.xxx/xxx/xform-boot.git']]])
}
stage('Build') {
env.JAVA_HOME="${tool 'jdk1.8.0_92'}"
withMaven(
maven: 'M3',
mavenLocalRepo: '.repository') {
sh "mvn clean install -U -P${profile} -Dmaven.test.skip=true"
}
}
stage('deploy') {
sshagent(credentials: ['deploy_ssh_key']) {
sh 'ssh [email protected]'
sh 'echo hello'
sh 'scp producer/target/salesApp-1.0-RELEASES.jar [email protected]:/root/deploy/'
}
}
}
如上脚本需要配置两个认证凭证,分别是git的credentialsId和sshagent的credentials,到配置管理credentials处添加,如图
git的认证比较简单,使用密码用户名验证,直接选Username with password就好了,这里还有个技巧,后面会讲到。
sshagen测试下来只支持私钥,需要选择如下配置:
如图,使用了From the Jenkins master ~./ssh,需要你到jenkins所在主机的.ssh目录,通过命令”ssh-keygen -t rsa“生成公私钥,生成时会询问你是否使用密码 加密,可以直接跳过,如果写了密码,那么上图中Passphrase需要写上加密密码,没写就留空。然后将id_rsa.pub中的内容拷贝到目标主机的/root/.ssh/authorized_keys文件中。上图中的ID可以指定,不指定会生成一个唯一字符串如:
这个ID对应了pipeline脚本中的验证ID,到此,我们准备工作都已经做完了。
添加运行参数
细心的你可能发现了脚本中有类似占位符。这些的代码,如${branch},${profile},其实就是pipeline的占位符,这些参数控制了git从哪个分支拉代码,maven构建的哪个环境的代码,这些参数需要在构建任务中明确指定,用以区分是生产环境还是测试环境等,如图
四,尝试构建任务
到这里我们的准备工作都已完成了,可以开启构建任务测试了,这时博主走了一个好大的坑,无论认证凭证模块怎么配置,总是抛如下的异常:Host key verification failed.
这个异常非常明显,pipeline流式构建前两个步骤已经成功了,代码拉下来并已经构建成功了。但是通过sshagent上传到目标服务器时,认证失败了。这个问题占了我们摸索过程的一大半时间。最后还是感谢唐老大发现了问题。
异常原因:生产公私钥使用的root用户生产的,jenkins是使用jenkins用户启动的,所有jenkins没有权限,
其实上面所有的步骤都没问题。最终在尝试了无数次的构建失败后构建图标终于绿了,构建产物成功上传到目标主机
一次次的失败:
成功的绿标
五,pipeline的一点技巧
流式项目Item创建好后,在左边菜单最下面会有pipeline的语法菜单,点进去,会有如下页面:
1.其中箭头一所指的,就是前文提到的git添加认证的一个小技巧,这个是一个pipeline脚本生成器,选中git scm后会出来git相关的配置,按照提示添加后,点击生成,就会生成以及配置组装好的脚本。特别适合新手
2.箭头而是步骤指南,这个里面罗列了所有pipeline语法支持的一些DSL函数,如git,checkout,wthMaven等,并且详细的描述了方法的具体使用细节,详细 到每个参数的说明,如withMavene:
文末结语
pipeline的概念去年就听说了,现在实际操作了一把,还是非常的震撼,通过在项目中新增jenkinsfile就可以解决构建问题,而且非常灵活,支持写if等的逻辑判断脚本来决定构建行为。经历了无数次失败后成功的成就感不言而喻,有兴趣的都可以试试,彻底改变原先的构建模式。建议刚接触pipeline的新手,多看看pipeline语法页面的相关内容,对理解pipeline语法及书写脚本有很大的帮助。其次就是去相关的插件wiki页面多看看说明。国内的那些博客很多都是一笔带过,看不出在生产上面应用的痕迹,不建议去参考。最后,有任何问题欢迎在下面留言,一起讨论。