GVKun编程网logo

使用 Jenkinsfile-Runner 对流水线 / 共享库测试(jenkins流水线配置)

8

针对使用Jenkinsfile-Runner对流水线/共享库测试和jenkins流水线配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1个Jenkins作业和2个Jenkinsfiles

针对使用 Jenkinsfile-Runner 对流水线 / 共享库测试jenkins流水线配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)、Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式、Jenkins pipeline 之声明式的 jenkinsfile、jenkins Pipeline 脚本 jenkinsfile 实操指南等相关知识,希望可以帮助到你。

本文目录一览:

使用 Jenkinsfile-Runner 对流水线 / 共享库测试(jenkins流水线配置)

使用 Jenkinsfile-Runner 对流水线 / 共享库测试(jenkins流水线配置)

如果您确实想从 CLI 运行 Pipeline 而不启动完整的 Jenkins 实例,则可以查看 Jenkinsfile-runner 项目。在某些情况下可能出于开发 / 测试目的而适用。


Jenkinsfile Runner 是将 Jenkins Pipeline 执行打包为命令行工具的实验。预期的用例包括:在功能即服务的上下文中使用 Jenkins; 协助 Jenkinsfile 本地编辑;集成测试共享库。Jenkinsfile Runner 可以通过命令行运行也可以通过 Docker 方式运行。


在命令行中使用



准备工作:需要下载 Jenkins 的 war 包,并解压。

wget jenkins/war-stable/2.204.2/jenkins.warunzip jenkins.war -d /test/jenkins


下载 Jenkinsfile-runner 项目,进行编译打包并生成可执行程序。

git clone https://github.com/jenkinsci/jenkinsfile-runner.gitcd jenkinsfile-runner/mvn clean package  -Dmaven.test.failure.ignore=true


Jenkinsfile-runner 的使用方法:

jenkinsfile-runner -w <path to war> \ -p <path to plugins> \ -f <path to Jenkinsfile> \                   -a "param1=Hello&param2=value2"


  • -w 指定我们刚才解压的 war 目录 

  • -p 指定 Jenkins 的插件目录

  • -f 指定我们要运行的 Jenkinsfile

  • -a 指定对 Jenkinsfile 传递的参数




编写一个用于测试的 Jenkinsfile。

pipeline { agent any parameters { string(name: ''param1'', defaultValue: '''', description: ''Greeting message'') string(name: ''param2'', defaultValue: '''', description: ''2nd parameter'')     }        stages {               stage(''Build'') {                      steps {               echo ''Hello world!''               echo "message: ${params.param1}"               echo "param2: ${params.param2}"                               sh ''ls -la''                       }                }        }}


让我们使用 Jenkinsfile-runner 运行测试。

jenkinsfile-runner -w test/jenkins \                   -p $JENKINS_HOME/plugins \                   -f Jenkinsfile \ -a "param1=Hello&param2=value2"
                   StartedRunning in Durability level: PERFORMANCE_OPTIMIZEDRunning on Jenkins in /tmp/jenkinsTests.tmp/jenkins8090792616816810094test/workspace/job[Pipeline] node[Pipeline] {[Pipeline] // stage[Pipeline] stage[Pipeline] { (Build)[Pipeline] echoHello world![Pipeline] echomessage: Hello[Pipeline] echoparam2: value2[Pipeline] sh[job] Running shell script+ ls -latotal 12drwxrwxr-x 2 kohsuke kohsuke 4096 Feb 24 15:36 .drwxrwxr-x 4 kohsuke kohsuke 4096 Feb 24 15:36 ..-rw-rw-r-- 1 kohsuke kohsuke 0 Feb 24 15:36 abc-rw-rw-r-- 1 kohsuke kohsuke 179 Feb 24 15:36 Jenkinsfile[Pipeline] }[Pipeline] // stage[Pipeline] }[Pipeline] // node[Pipeline] End of PipelineFinished: SUCCESS







使用 Docker 方式


使用 docker 方式相对简单许多,我们只需要下载镜像,将要测试的 jenkinsfile

以 volume 的当时挂载到容器中即可。

docker run --rm \ -v $(pwd)/Jenkinsfile:/workspace/Jenkinsfile \ jenkins4eval/jenkinsfile-runner


  • -v 挂载本地的 Jenkinsfile

  • 镜像名称 

  • jenkins4eval/jenkinsfile-runner





总结: 

在使用 jenkinsfile-runner 进行测试 Jenkinsfile 的过程中需要安装所需的插件,第一种方式是使用当前 JenkinsHome 目录中的插件,另一种方式是重新安装插件。 我觉得每次测试都安装插件会影响测试的效率,直接使用 JenkinsHome 中的插件也有可能在远端不便于使用。总之 Jenkinsfile 插件还是个问题!






本文分享自微信公众号 - DevOps 云学堂(idevopsvip)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)

1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)

如何解决1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)?

我有 1 个工作,有 2 个声明性管道脚本,我从 1 个脚本调用另一个脚本

现在我收到此错误消息:

java.lang.IllegalStateException: 只有一个管道 { ... } 块可以 在一次运行中执行。

stage(''Loading app Deployment File'') {
    steps {
        script {
           def util = load ''./abcd/Jenkinsfile.groovy''
        }
    }
}

解决方法

您不能在一个作业中使用两个管道脚本,我看到两个选项

  1. 创建另一个作业并将其称为下游作业

build job: "path/to/jenkins_job",parameters:([string(name:'''',value:'''')]),propagate: false,wait: true

  1. 将文件作为 jenkins 文件中的闭包调用

    stage(''foo''){
     options {
         timeout(time: 5,unit: "MINUTES")
     }
    
     steps{
         script{
             script1.call(arg1,arg2)
    
         }
     }
    

    }

并配置script1.groovy如下

script1.groovy

#!groovy

def call(arg1,arg2){
    try{
        <do something>
        return
    } catch (Exception){
        < something has failed >
    }

  // you can also add stages here

    stage(''bar''){
      try{
          <do something>
          return
      } catch (Exception){
        < something has failed >
      } 
    }
}

需要注意的一点是,使用此方法也可以使用所有管道变量。

Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式

Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式

Jenkins pipeline jenkinsfile的两种写作方式,声明式和脚本式。

为什么需要pipeline?

在多年前Jenkins成为最流行的持续集成服务器的Jenkins 1.x时代,所有的新功能都是通过安装插件来增强,所有的配置都是通过网页界面来实现的。

在Jenkins迈入2.x的时代,为了跟随时代的步伐(everything is code),Jenkins引入了配置及代码的概念。用代码来表示流程是为了版本控制和自动化的方便,使得配置跟源代码一样可重现,更加容易地支持多分支开发部署。 具体地来说,就是Jenkins引入了pipeline的概念,可以使用groovy来编写Jenkinsfile。

为什么两种实现pipeline的方式呢?

真的是看戏的不嫌事大,同一功能两种实现,很多用户也会被搞迷吧。下面咱们就来捋一捋这个发展过程。
Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。

但是groovy毕竟是一种语言,对于没有太多编程经验的小白这个学习曲线有点太陡峭。这个时候声明式的pipeline就出现了,主要是为了降低入门的难度。

作为Jenkins用户该如何选择呢?

  • 声明式pipeline鼓励声明式编程模型,比较适合没有编程经验的初学者。
  • 脚本式pipeline,是基于groovy的DSL语言实现的,为Jenkins用户提供了大量的灵活性性和可扩展性。
  • 声明式pipeline会得到越来越多的官方支持,可以使用Visual Pipeline Editor来编辑和验证声明式pipeline。
  • 如果实在是声明式语法还没有支持的功能,还可以在声明式里直接调用脚本。

所以推荐新手从声明式pipeline开始。

声明式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
脚本式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline


下面我们分别来个例子来初步感受下,看看你更喜欢哪种?

声明式pipeline

pipeline {
    agent any
    stages {
        stage(''Example Build'') {
            steps {
                echo ''Hello World''
            }
        }
        stage(''Example Deploy'') {
            when {
                branch ''production''
                environment name: ''DEPLOY_TO'', value: ''production''
            }
            steps {
                echo ''Deploying''
            }
        }
    }
}

脚本式pipeline

node {
    stage(''Example'') {
        if (env.BRANCH_NAME == ''master'') {
            echo ''I only execute on the master branch''
        } else {
            echo ''I execute elsewhere''
        }
    }
}

声明式pipeline里调用脚本式语法

pipeline {
    agent any
    stages {
        stage(''Example'') {
            steps {
                echo ''Hello World''

                script {
                    def browsers = [''chrome'', ''firefox'']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

参考:

https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline
https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97

Jenkins pipeline 之声明式的 jenkinsfile

Jenkins pipeline 之声明式的 jenkinsfile

Jenkins pipeline 之声明式的 jenkinsfile

内置的关键字

  • pipeline : 是 pipeline 的跟节点
  • agent: 定义 piple 使用哪个账号在哪个机器上执行
  • post: 定义 pipeline 最后执行的一组任务,支持多种条件判断 always, changed, fixed, regression, aborted,failure, success, unstable, unsuccessful, and cleanup.
  • stages: 是多个 stage 的父节点。
  • stage: 代表整个 pipleline 里的一个阶段,stage 里面才是具体的 steps。
  • steps: 定义在 stage 的内部,表示具体如何执行。
  • environment: 定义公用的环境变量
  • options: 定义 pipeline 或者 plugin 的参数设置。
  • parameters: 定义了整个 pipeline 的外部参数,必须有默认值,用户也可以在启动时指定新的参数
  • triggers: 定义如何触发 pipeline,例如 cron,pollSCM,或者 upstream。
  • tools: 定义需要安装的工具,且会自动加入到 PATH
  • input: 允许 pipeline 与用户交互,等待用户确认然后继续。
  • when: 条件语句

pipeline 的实例代码

其实还是非常直观易懂的:

pipeline {
  agent {
    node {
      label ''DEBIAN8''
    }
  }
    triggers {
        cron(''H */4 * * 1-5'')
    }
  environment {
    ARTIFACTORY_URL = ''https://path.to.artifacts/some-registry''
  }
  options {
    disableConcurrentBuilds()
    retry(1)
    skipStagesAfterUnstable()
    timeout(time: 10, unit: ''MINUTES'')
    skipDefaultCheckout()
    buildDiscarder(logRotator(numToKeepStr: ''10'',           artifactNumToKeepStr: ''1''))
  }
  tools {
    /**
     * Predefined environment variables MAVEN3 and JDK-1.8
     */
    maven ''MAVEN3''
    jdk ''JDK-1.8''
  }
  stages {
    /**
     * Initialization check for Java and Maven
     */
    stage(''Initialization'') {
      steps {
        sh ''''''
          java -version
          mvn -version
        ''''''
      }
    }
    /**
     * Checkout source code from Github on any of the GIT nodes
     */
    stage(''Checkout'') {
      steps {
        checkout scm
      }
    }
    /**
     * Compile the Maven project
     */
    stage(''Build'') {
      steps {
        sh ''mvn clean install''
      }
    }
    /**
     * Trigger this in PRs, don''t run on master or release branches
     */
    stage(''Package'') {
      when {
        changeRequest()
      }
      steps {
        sh ''mvn clean package -DskipTests''
      }
    }
    /**
     * Only run this on master and release branches
     */
    stage(''Deploy'') {
      when {
        branch ''master''
      }
      environment {
        DEPLOYER = credentials(''deployer'')
      }
      steps {
        sh ''mvn clean deploy''
      }
    }
    /**
     * Clean workspace
     */
    stage(''Clean'') {
      steps {
        cleanWs()
      }
    }
  }
    post { 
        always { 
            echo ''I will always say Hello again!''
        }
    }
}

常见的 options

我们来解释一下上面常用的 option 的用途:

  • disableConcurrentBuilds ():一时间最多只允许一个 pipeline 运行,如果前面的仍在运行, 后面的将会等待状态。
  • retry (1): 失败了,重试一次。
  • skipStagesAfterUnstable ():如果某个 stage 为 unstable 状态,则忽略后面的任务,直接退出。
  • timeout (time: 10, unit: ''MINUTES''):10 分钟的超时设置。
  • skipDefaultCheckout (): 忽略默认的 checkout。
  • buildDiscarder (logRotator (numToKeepStr: ''10'', artifactNumToKeepStr: ''1'')): 保留最新的 10 个 build log 和 1 个 artifact。

参考:

https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97

jenkins Pipeline 脚本 jenkinsfile 实操指南

jenkins Pipeline 脚本 jenkinsfile 实操指南

前言碎语

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 root@120.xx.95.105''
        sh ''echo hello''
       sh ''scp producer/target/salesApp-1.0-RELEASES.jar  root@120.xx.95.105:/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 页面多看看说明。国内的那些博客很多都是一笔带过,看不出在生产上面应用的痕迹,不建议去参考。最后,有任何问题欢迎在下面留言,一起讨论。



本文同步分享在 博客 “kailing”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于使用 Jenkinsfile-Runner 对流水线 / 共享库测试jenkins流水线配置的介绍到此结束,谢谢您的阅读,有关1 个 Jenkins 作业和 2 个 Jenkinsfiles(声明性管道)、Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式、Jenkins pipeline 之声明式的 jenkinsfile、jenkins Pipeline 脚本 jenkinsfile 实操指南等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇如何使用 Java 泛型来避免 ClassCastException(java泛型解决什么问题)

下一篇04-MirrorGate 安装脚本备注(mirror插件)