因使用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节点

噜噜噜的博客

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐