jenkins maven设置远程仓库 jenkins远程构建_maven


一、背景

1.想法

jenkins1.x主要是实现的持续集成过程,集成各个插件,但是终究需要人为手工的操作,如果job太复杂,人为容易出错。于是jenkins2.x开始流行pipeline的写法,以代码的方式来进行job的构建。正如社会潮流总是从人工到自动化的过程,在之前那篇文章中提及,要做一个devops的小工具,从java代码实现上来说,对于我还是比较复杂,代码实现部分还在钻研中。本篇文章只是讲讲jenkins中pipeline怎么写!


二、pipeline基本语法介绍

学习一种编程语言(groovy)最开始的步骤总是学习它的语法,知晓它的规则。但是对于pipeline来说,暂时还不需要深入去学习groovy,下面简单的为大家介绍下pipeline的一些主要的基本知识:

agent:该部分指定整个Pipeline或特定阶段将在Jenkins环境中执行的位置,具体取决于该agent 部分的放置位置。该部分必须在pipeline块内的顶层定义 ,也可以使用在stage级。

stage:表示这个Pipeline的某一个执行阶段(使用stage使得逻辑变得更加简单明了)

steps: 包含一个或者多个在stage块中执行的step序列(在这里执行操作:运行maven或者部署等等)

environment:指定键值对,可用于step中,主要是为常量或者变量赋值,根据所在的位置来决定其作用范围(类似于java中全局和局部的概念)

options:允许执行pipeline内置的专用选项,也可以使用由插件提供的

parameters:提供触发pipeline时的参数列表

trigger:定义了触发pipeline的方式(jenkins1.x中的pollscm定时构建)

tools:自动安装工具,注意这里使用的一定是在jenkins全局配置中已经定义好了的

when:可以用来执行一些代码逻辑

post:可以根据pipeline的状态来执行一些操作

以上是属于个人理解,具体以官方文档为准。下面再来详细说说里面比较重要的agent,其他的部分请大家自行google或者百度,相对来说比较简单。我的理解是:agent是一个机器总代理,它其中的参数都是为了指定一些可以使用的机器

agent的一些参数如下:

any : 在任何可用的机器上执行pipeline

none : 当在pipeline顶层使用none时,每个stage需要指定相应的agent,比方说:


pipeline{
    agent none   //没有指定agent
    stages{
        stage('checkout code'){
            steps{
                sh 'echo "checkout code"'
            }
        }
    }
}


以上代码会报下面这串错误,原因就是没有指定agent应用的节点:


jenkins maven设置远程仓库 jenkins远程构建_maven_02


label:在指定的机器上运行pipeline或者stage,比方说


agent{ label 'slave1'}  //指定slave1的节点机器运行该stage或者pipeline


这个设置的作用:在大规模集群中,CI机器往往是相同的配置,而此时你的项目又需要一些额外的配置,这个时候这个设置可以很好的完成这个功能

docker:定义这个参数后,指定pipeline或stage时会动态的接收一个指定节点的docker的镜像,并且还可以接受一个args的参数用于执行docker run 的参数。比方说你的项目要在A环境中做测试,在B环境中做预发验证,在C环境做灰度发布(这里只是简单的打个比方,实际中不是这样的,只是为了说明此时需要在不同的环境中做不同的事情),这个时候涉及到多个环境,常规做法可以是直接指定几个不同的slave的从节点,但是如果我此时想做测试并且只有一台机器,那我可以在这台机器上做几个docker镜像,分别用于不同的构建过程.比方说:


agent{
    docker{
        image 'mydocker'  //指定docker的镜像名称
        label 'slave1'    //指定在哪个机器上执行docker镜像
        args  '-v /tmp:/tmp' //运行时传入docker run的参数
    }
}


以上命令是在slave1的从节点机器上用mydocker的镜像生成一个容器,并传入-v /tmp:/tmp的参数

以上是我想分享给大家的基本知识,可能其中理解不对,也请大牛出来指正.

这个网站也推荐给大家:Jenkins持续集成 - 管道详解,如若作者认为我放在这里不合适,请联系我删除.同时也推荐大家浏览一下官方文档:

Getting started with Pipelinejenkins.io


jenkins maven设置远程仓库 jenkins远程构建_git_03



三、pipeline实际应用(小实例)

实例1.用pipeline实现:从代码库中拉取最新的代码,然后做pmd检测,如果此次构建成功的话输出“hello!success!”;如果失败的话输出“failed!Please check pipeline code!”并发送邮件到指定的地址上。按照以下流程做测试:

a.本地构建一个maven项目并上传到github上(最近github贼慢,之后考虑在自己服务器上搭建gerrit作为代码存放地址来演示)

***注意项目上传时一些不需要的文件及时使用.gitignore给忽略掉,要在git add 之前写好.gitignore文件,避免文件被track后忽略不了***


jenkins maven设置远程仓库 jenkins远程构建_docker_04


以上表示文件上传成功.

b.写好pipeline并运行,最后核查结果

***部分脚本可以使用jenkins中的Pipeline Syntax来生成,比如拉取代码的***


jenkins maven设置远程仓库 jenkins远程构建_docker_05


下面开始演示失败时候的场景,此时没配置mvn的环境,但是执行mvn命令,按照预计中的报错了:


jenkins maven设置远程仓库 jenkins远程构建_jenkins maven设置远程仓库_06


下面开始演示正确的构建结果并附pipeline的代码:


pipeline{
    agent any
    tools{
        maven 'maven3' //maven3必须是已经在jenkins上配置的工具
    }
    stages{
        stage('checkout code'){
            steps{
                git credentialsId: '2c7a38c6-f536-4e93-bf3c-2ff4563fae8e', url: 'https://github.com/XXX/pipeline_script_test.git'
            }
        }
        stage('mvn test'){
            steps{
                sh "mvn -B -f ${env.workspace}/pom.xml pmd:pmd"
            }
        }
    }
    post{
        always{   //always表示不管怎么样都做下面的操作
            pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
        }
        failure{ 
            step([
                $class: 'Mailer',
                notifyEveryUnstableBuild: true,
                recipients: "738402018@qq.com",
                sendToIndividuals: true
            ])
            echo "failed!Please check pipeline code!"
        }
        success{
            echo "hello!success!"}
    }
}


构建结果如下:


jenkins maven设置远程仓库 jenkins远程构建_maven_07


实例2:


以上就是一些关于jenkins的pipeline的简单介绍,关于实例,之后会陆续更新上来。