使用pipeline实现jenkins CI/CD
因使用jenkins的maven插件去构建java项目的时候发现构建速度非常慢,通过查找问题发现maven的插件在构建完成的同时会将包上传到master节点上去,这个时候如果网络不好的话会导致上传速度非常的缓慢,非常影响开发速率。之后就想直接抛弃maven插件去构建java项目,也就是自由风格的软件项目。但是后面考虑到扩展性以及其他的一些原因,最终使用了pipeline去实现CI/CDpipe..
因使用jenkins的maven插件去构建java项目的时候发现构建速度非常慢,通过查找问题发现maven的插件在构建完成的同时会将包上传到master节点上去,这个时候如果网络不好的话会导致上传速度非常的缓慢,非常影响开发速率。之后就想直接抛弃maven插件去构建java项目,也就是自由风格的软件项目。但是后面考虑到扩展性以及其他的一些原因,最终使用了pipeline去实现CI/CD
pipeline是通过Groovy脚本实现jenkins持续集成发布的一种方式,它可以完成单个任务难以完成的复杂发布流程.首先我们要了解pipeline里的几个基本的元素
node:
在Jenkins环境中分配一个执行器和工作空间。
agent:表示Jenkins应该为Pipeline的这一部分分配一个执行者和工作区。
stage:
描述了这条Pipeline的一个阶段。
stages: pipeline中stage的所有阶段。
steps 描述了要在其中运行的步骤 stage,也就是说steps步骤肯定是在stage中
在jenkins中有2种方式实现pipeline工作流。pipeline script以及pipeline script from scm(也就是jenkinsfile)通过一下脚本可以看出他们的一个区别
pipeline script的例子:
node{
stage('git'){
checkout([$class: 'GitSCM', branches: [[name: "${new_tag}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'id号', url: 'git地址']]])
}
stage('add mvn path'){
def mvnHome=tool 'maven'
env.PATH = "${mvnHome}/bin:${env.PATH}"
}
stage('build'){
echo "mvn clean build"
sh "mvn clean package -Dautoconfig.interactive=false -U -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -P ${envpath}"
}
stage("Deploy"){
echo "Deploy ing"
}
}
在这个例子中我是以gitlab作为代码仓库,通过pipeline syntax 可以直接生成对应的脚本内容 也就是说不需要去记住这个怎么写,
pipeline syntax 如下:
在add mvn path这个stage的步骤中,主要是为了解决mvn命令识别不到的问题,也就是说jenkins pipeline本身的环境变量中是不存在mvn命令的,通过这个捕捉我可以在我的jenkins 中的Global Tool Configuration中找到自己的mvn配置 比如:
在这里我已经安装了名为maven的mvn工具,这样我就可以在pipeline中直接引用了,在def mvnHome=tool 'maven' 中maven就是上图的mvn的name值
在build的stage中主要是通过sh参数执行java的mvn编译。
编译完成之后就可以直接通过stage Deploy步骤去发布到对应的服务器,这部分的脚本需要根据自己的环境去编写。
最后执行构建,构建完成就可以看到如下图内容 可以看到每个步骤耗时多少:
通过jenkinsfile文件的形式 如下:
jenkinsfile的形式需要将脚本以文件的形式放到代码仓库里 通过jenkins里的pipeline script from scm 指定jenkinsfile的目录路径
node("${node}") {
def mvnHome=tool 'maven'
env.PATH = "${mvnHome}/bin:${env.PATH}"
checkout scm
stage('build'){
echo "mvn clean build"
sh "mvn clean package -Dautoconfig.interactive=false -U -Dmaven.test.skip=true -P ${envpath}"
}
stage("Deploy"){
echo "Deploy ing"
sh "sh /home/environment.common/jenkins/shell/deploy-local-tomcat.sh cif_${envpath} cif.web/target/cif.web*.war ROOT.war"
}
}
jenkinsfile的形式其实跟pipeline script的形式差不多除了指定node 以及使用checkout scm 切换指定的git以及node指定运行的slave节点
更多推荐
所有评论(0)