jenkins脚本式流水线

发布时间 : 2020/11/17 02:47

superhero

近来公布了的一些变动给了流水线编辑者新的工具!以改进在 Blue Ocean 中的流水线可视化,有一个备受瞩目关注的工单 JENKINS-39203 ,这会导致当流水线的构建结果为不稳定时全部的阶段都被设置为不稳定的。这个缺陷导致无法快速地辨认为什么构建是不稳定的,使得用户必须察看完备的日记和 Jenkinsfile 才能弄明白毕竟发生了什么。

为了修复这个问题,我们引入了一个新的流水线 API 用于为单个流水线步骤添加分外的结果信息。像 Blue Ocean 这样的可视化工具在决定阶段怎样表现时会使用到这新的 API。像 junit 这样的步骤只能设置整个构建结果,如今可以通过新的 API 设置步骤级别的结果信息。我们创建了新的步骤 unstable warnError ,这样流水线编辑者在更庞杂的场景下仍旧可以使用这个新的 API。

该问题涉及到的重要的修复包含在如下的插件中,它们都需要 Jenkins 2.138.4 以及更新的版本:

  • Pipeline: API 2.34
  • Pipeline: Basic Steps 2.18 (需要同步更新到 Pipeline: Groovy 2.70)
  • Pipeline: Graph Analysis 1.10
  • Pipeline: Declarative 1.3.9
  • Blue Ocean 1.17.0

这里是一条使用了 unstable 步骤的流水线在 Blue Ocean 中的截图,只会把失败的阶段标识为不稳定的:

只有一个阶段为不稳定的状态的流水线在 Blue Ocean 中的展示

例子

这里给出一些怎样在你的流水线中使用该特性的示例:

  • 使用新的步骤 warnError 用于捕捉错误,并把构建和阶段标志为不稳定的。 warnError 只需要一个 字符串 的参数,用于当捕捉到错误时以日记的情势输出。当 warnError 捕捉到一个错误时,它会记载该消息以及错误,并设置构建和阶段的结果为不稳定的。效果如下:
  • warnError('Script failed!') { sh('false') }
  • 使用新的步骤 unstable 设置构建和阶段结果为不稳定的 。可以使用该步骤直接更换 currentBuild.result = 'UNSTABLE' ,在 warnError 不够机动时这会比较有效。步骤 unstable 只需要一个 字符串 参数,当该步骤运行时会作为消息。使用的方法如下:
  • try { sh('false') } catch (ex) { unstable('Script failed!') }
    • JUnit Plugin : 更新到 1.28 要么更高的版本,使得步骤 junit 可以直接把该阶段设置为不稳定的。
    • Warnings Next Generation Plugin : 更新到 5.2.0 要么更高的版本,使得步骤 publishIssues recordIssues 可以直接把该阶段设置为不稳定的。
    • 其他插件 : 假如你的流水线被其他插件中的步骤标志为不稳定的,请(在检察没有重复项后)给该组件 提交一个新的 issue ,清楚地描述哪个步骤是有问题的,以及发生问题的环境,并添加链接到该文章的开发者地区,以便维护者理解怎样才能解决该问题。

    范围

    • 假如你不迁徙到 unstable warnError 步骤,或不升级插件到集成来新 API 的环境下设置构建状态,那么纵然构建是不稳定的,Blue Ocean 也不会把任何阶段表现为不稳定的。
    • 纵然在这些变革后, currentBuild.result 继续只会覆盖构建状态。不幸的是,由于 currentBuild 是作为全局变量而实现的,因此,无法让它设置步骤要么阶段级别的结果,这意味这它没有任何步骤级别的上下文可以使用到新的 API。
    • Pipeline Stage View Plugin 尚未升级到使用这个新的 API,因此,这些变动不会在它提供的可视化中得到表现。

    历史

    Jenkins 流水线步骤可以以两种方法完成:成功并返回一个结果(大概为 null),要么是失败的,并抛出一个不同寻常。当步骤失败并抛出不同寻常时,该不同寻常会贯串整个流水线,直到有其他的步骤要么 Groovy 代码捕捉,要么它到达流水线的顶层并导致流水线失败。基于抛出的不同寻常的差别种类,流水线最终的结果大概不是失败(比方:某些环境下是被停止的)。基于不同寻常流传的方法,像 Blue Ocean 这样的工具可以轻松地辨认哪些步骤(以及阶段)是失败的。

    为了可以或许让流水线可以或许与相应的 Jenkins API 交互,对于流水线构建来说,可以在构建期间修改构建结果也是有须要的。对于其他的,这使得流水线可以使用构建步骤以及原先出自于自由气势派头的使命中的项目。

    在一些环境下,一个流水线步骤需要可以或许成功地完成,以便流水线可以继续正常实行,但对此而言可以或许标志有某种错误发生,因此,在可视化时可以或许辨认到发生错误的步骤,纵然没有彻底失败。比较好的一个例子就是 junit 步骤。该步骤关注特定的测试结果,假如有任何错误,会把整个构建结果标志为不稳定的。这种行为对类似 BlueOcean 的可视化工具而言是有问题的,由于该步骤是成功的,并且无法通过编程的方法覆盖于该步骤相关的最终结果。

    再次察看下 JENKINS-39203 ,我们看到关于可视化有两项基本的选项。由于有的步骤导致构建变成不稳定的,设置总体的构建结果是不稳定的,要么全部的步骤都成功完成来也展示为不稳定的;要么由于我们没有措施把特定步骤相关的构建结果作设置,它们大概表现为成功的。最后,选择了第一个选项。

    为理解决该问题,部分用户实验通过抛出不同寻常并在阶段中增长 try/catch 这样的代码块用于处置不同寻常,这样 Blue Ocean 可以或许借助这些不同寻常来标志步骤和阶段的结果为盼望的状态,并且,捕捉不同寻常后,流水线可以继续正常实行。这种方法不轻易明白,脆弱,并且无法在说明式的流水线中使用。

    开发者

    假如你是一个插件的开发者,并在集成流水线时使用了步骤,想要使用这个新的 API 的话,你的步骤就可以给出一个非成功的结果,而不是抛出不同寻常。请察看 Jenkins 开发者邮件列表中的这个 帖子 ,假如你碰到任何问题了,可以在那边提问。

    jenkins流水线异常处理

    触发器

    codes/jenkinsfile/script-trigger.groovy node('local') { echo 'hello' } properties([ buildDiscarder( logRotator( artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '5', numToKeepStr: '10' ) ), pipelineTriggers([ cron('H 3,12,17 * * *'), scm('H 3,12,17 * * *') ]) ]) 原文件

    参数化实行

    properties([[$class: 'JobRestrictionProperty'], parameters([run(description: '', filter: 'ALL', name: 'Name', projectName: 'Project')]), pipelineTriggers([])] )

    不同寻常

    你可以使用处置不同寻常的方法来实现类似于 说明式流水线中 的 post

    codes/jenkinsfile/try-catch.groovy node { stage("one"){ try { echo "hello" }catch(error){ echo error.getMessage() }finally{ echo "finally" } } } 原文件

    循环

    codes/jenkinsfile/loop.groovy node('suren') { def dev_path = '/opt/suren/bin' def services = [ [ 'name': 'admin', 'project': 'admin', 'port': '7002', 'jarName': 'admin' ] ]; stage('Copy Artifact') { for(service in services){ step([$class: 'CopyArtifact', fingerprintArtifacts: true, flatten: true, projectName: service.project, selector: [$class: 'StatusBuildSelector', stable: false], target: dev_path + '/' + service.name ]) } } stage('Stop Service') { for(service in services){ sh 'fuser -n tcp -k ' + service.port + ' > redirection &' } } stage('Start Service') { for(service in services){ sh 'cd ' + pass_bin + '/' + service.name + ' && nohup nice java -server -Xms128m -Xmx384m \ -jar ' + service.jarName + '.jar \ --server.port=' + service.port + ' $> initServer.log 2>&1 &' } } } 原文件

    HTTP

    我们偶然候需要在流水线中发送 HTTP 请求,下面给出一个例子:

    codes/jenkinsfile/http.groovy // dependecy plugin is https://plugins.jenkins.io/phoenix-autotest pipeline { agent { label "master" } stages { stage('test') { steps{ script { http url: "http://baidu.com" http url: "http://baidu.com", responseBody: "body.txt" archiveArtifacts "body.txt" def quy = 'https://www.baidu.com/s?wd=' + URLEncoder.encode('a b', 'UTF-8') echo quy http url: quy } } } } } 原文件
    pipeline { agent any stages { stage( ' Example ' ) { input { message " Should we continue? " ok " Yes, we should. " submitter " alice,bob " parameters { string( name : ' PERSON ' , defaultValue : ' Mr Jenkins ' , description : ' Who should I say hello to? ' ) } } steps { echo " Hello, ${ PERSON } , nice to meet you. " } } } }

    本文网址: http://www.directapkdownloader.com/d/202010173466_8150_364905491/home