ToB企服应用市场:ToB评测及商务社交产业平台

标题: Jenkins-pipeline语法阐明 [打印本页]

作者: 勿忘初心做自己    时间: 2025-1-21 09:40
标题: Jenkins-pipeline语法阐明
一. 简述:
   Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它答应用户通过代码定义构建、测试和部署流程。
二. 关于jenkinsfile:
 1. Sections部分:
   Pipeline里的Sections通常包含一个或多个Directives或 Steps:
a). agent:
      指定整个Pipeline或特定阶段将在Jenkins环境中执行的节点位置,具体取决于该agent 部分的设置。该部分必须在pipeline块内的顶层定义 ,但在stage中是可以使用的。
  1. #agent可选项:
  2. 1). any:任何可用agent上执行。
  3. 2). none:不会为整个Pipeline运行分配全局agent ,每个stage部分将需要包含其自己的agent部分
  4.   3).  label: 使用提供的label标签,在Jenkins环境中可用的代理上执行Pipeline或stage(agent { label 'my-defined-label' })
  5.   4).  node: agent { node { label 'labelName' } },等同于 agent { label 'labelName' },但node允许其他选项
  6.   5). docker:执行Pipeline或stage时会动态供应一个docker节点去接受Docker-based的Pipelines。
  7.   6). dockerfile: 使用从Dockerfile源存储库中包含的容器来构建执行Pipeline或stage
  8. eg:
  9. pipeline {
  10.     agent none
  11.     stages {
  12.         stage('Example Build') {
  13.             agent { docker 'maven:3-alpine' }
  14.             steps {
  15.                 echo 'Hello, Maven'
  16.                 sh 'mvn --version'
  17.             }
  18.         }
  19.         stage('Example Test') {
  20.             agent { docker 'openjdk:8-jre' }
  21.             steps {
  22.                 echo 'Hello, JDK'
  23.                 sh 'java -version'
  24.             }
  25.         }
  26.     }
  27. }
  28. 常用选项:
  29. #label : 标签,适用于node,dockr anddockerfile时,并且node是必须的
  30. #customWorkspace: 自定workspace路径
  31. #reuseNode:一个布尔值,默认为false。如果为true,则在同一工作空间中,。只适用于docker和dockerfile,并且仅在 individual stage中使用agent才有效
  32.  
  33. eg:
  34. agent {
  35.     node {
  36.         label 'my-defined-label'
  37.         customWorkspace '/some/other/path'
  38.     }
  39. }
复制代码
b).  POST:
     定义将在Pipeline运行或阶段竣事时运行的操纵。部分 always,changed,failure,success,unstable,和aborted。这些块答应在Pipeline运行或stage竣事时执行,具体取决于Pipeline的状态。
  1. #post 可选项:
  2. #always:无论Pipeline运行的完成状态如何。
  3. #changed:当前Pipeline运行的状态与先前完成的Pipeline的状态不同时。
  4. #failure:当前Pipeline处于“失败”状态时。
  5. #success:当前Pipeline具有“成功”状态时
  6. #unstable:当前Pipeline具有“不稳定”状态,如由测试失败,代码违例等引起。
  7. #aborted:当前Pipeline处于“中止”状态时,通常是由于Pipeline被手动中止。
  8. eg:
  9. pipeline {
  10.     agent any
  11.     stages {
  12.         stage('Example') {
  13.             steps {
  14.                 echo 'Hello World'
  15.             }
  16.         }
  17.     }
  18.     post {
  19.         always {
  20.             echo 'I will always say Hello again!'
  21.         }
  22.     }
  23. }
  24. 通常情况下,post定义在pipeline的末端。
复制代码
c). stages :包含一个或多个stage的序列,Pipeline的大部分工作在此执行。发起stages至少包含至少一个stage指令,用于毗连各个交付过程,如构建,测试和部署等。
d). steps :
   包含一个或多个在stage块中执行的step序列。
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('Example') {
  5.             steps {
  6.                 echo 'Hello World'
  7.             }
  8.         }
  9.     }
  10. }
复制代码
2.  Directives(指令) 部分:
a).  environment:
     指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。该指令支持一种特别的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
  1. pipeline {
  2.     agent any
  3.     environment {
  4.         CC = 'clang'   # 顶级pipeline中定义的env适用于所有steps
  5.     }
  6.     stages {
  7.         stage('Example') {
  8.             environment {    #只能适用于该过程的steps
  9.                 AN_ACCESS_KEY = credentials('my-prefined-secret-text')  #可在jenkins环境中通过其标示访问定义的凭据。
  10.             }
  11.             steps {
  12.                 sh 'printenv'
  13.             }
  14.         }
  15.     }
  16. }
复制代码
b). options :
      options指令答应在Pipeline本身内设置Pipeline专用选项。Pipeline本身提供了很多选项,例如buildDiscarder,但它们也大概由插件提供,例如 timestamps。
  1. #可用选项:
  2. buildDiscarder:  pipeline保持构建的最大个数。
  3. disableConcurrentBuilds: 不允许并行执行Pipeline,可用于防止同时访问共享资源等。
  4. skipDefaultCheckout: 默认跳过来自源代码控制的代码。
  5. skipStagesAfterUnstable: 一旦构建状态进入了“Unstable”状态,就跳过此stage。
  6. timeout: 设置Pipeline运行的超时时间。
  7. retry: 失败后,重试整个Pipeline的次数。
  8. timestamps: 预定义由Pipeline生成的所有控制台输出时间。
  9. eg:
  10. pipeline {
  11.     agent any
  12.     options {
  13.         timeout(time: 1, unit: 'HOURS')  #指定一个小时的全局执行超时,超出后中止运行
  14.     }
  15.     stages {
  16.         stage('Example') {
  17.             steps {
  18.                 echo 'Hello World'
  19.             }
  20.         }
  21.     }
  22. }
复制代码
c). parameters :
     提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步调。
  1. #string:  字符串类型
  2. #booleanparam: 布尔参数
  3. eg:
  4. pipeline {
  5.     agent any
  6.     parameters {
  7.         string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
  8.     }
  9.     stages {
  10.         stage('Example') {
  11.             steps {
  12.                 echo "Hello ${params.PERSON}"
  13.             }
  14.         }
  15.     }
  16. }
复制代码
d). triggers(触发器):
     定义了Pipeline自动化触发的方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers大概不需要基于webhook的集成也已经存在。目前只有三个个可用的触发器:cron,pollSCM,upstream。
  1. cron:接受一个cron风格的字符串来定义Pipeline触发的常规间隔,例如: triggers { cron('H 4/* 0 0 1-5') }
  2. pollSCM:接受一个cron风格的字符串来定义Jenkins检查SCM源更改的常规间隔。如果存在新的更改,则Pipeline将被重新触发。例如:triggers { pollSCM('H 4/* 0 0 1-5') }
  3. upstream: 接受逗号分隔的一系列作业和一个阈值。当字符串中的任何作业以定义的阈值结束时,管道将被重新触发,跨job。
  4. eg:
  5. pipeline {
  6.     agent any
  7.     triggers {
  8.         cron('H */4 * * 1-5')
  9.     }
  10.     stages {
  11.         stage('Example') {
  12.             steps {
  13.                 echo 'Hello World'
  14.             }
  15.         }
  16.     }
  17. }
复制代码
e). tools:
   通过tools可自动安装工具,并放置环境变量到PATH。如果agent none,这将被忽略。
  1. pipeline {
  2.     agent any
  3.     tools {
  4.         //工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。
  5.         maven 'apache-maven-3.0.1'
  6.     }
  7.     stages {
  8.         stage('Example') {
  9.             steps {
  10.                 sh 'mvn --version'
  11.             }
  12.         }
  13.     }
  14. }
复制代码
f). when:
  答应Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。
更复杂的条件布局可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度。
  1. #内置参数:
  2. branch: 当正在构建的分支与给出的分支模式匹配时执行
  3. environment:当指定的环境变量设置为给定值时执行
  4. expression:当指定的Groovy表达式求值为true时执行
  5. not:当嵌套条件为false时执行。必须包含一个条件
  6. allOf:当所有嵌套条件都为真时执行。必须至少包含一个条件
  7. anyOf:当至少一个嵌套条件为真时执行。必须至少包含一个条件
  8. eg:
  9. pipeline {
  10.     agent any
  11.     stages {
  12.         stage('Example Build') {
  13.             steps {
  14.                 echo 'Hello World'
  15.             }
  16.         }
  17.         stage('Example Deploy') {
  18.             when {
  19.                 branch 'production'
  20.             }
  21.             steps {
  22.                 echo 'Deploying'
  23.             }
  24.         }
  25.     }
  26. }
复制代码
3. Parallel(并行):
 对耗时长,相互不存在依赖的stage可以使用此方式提拔运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('Non-Parallel Stage') {
  5.             steps {
  6.                 echo 'This stage will be executed first.'
  7.             }
  8.         }
  9.         stage('Parallel Stage') {
  10.             when {
  11.                 branch 'master'
  12.             }
  13.             failFast true
  14.             parallel {
  15.                 stage('Branch A') {
  16.                     agent {
  17.                         label "for-branch-a"
  18.                     }
  19.                     steps {
  20.                         echo "On Branch A"
  21.                     }
  22.                 }
  23.                 stage('Branch B') {
  24.                     agent {
  25.                         label "for-branch-b"
  26.                     }
  27.                     steps {
  28.                         echo "On Branch B"
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.     }
  34. }
复制代码
      script:
      需要一个script Pipeline,并在Declarative Pipeline中执行。对于大多数用例,script在Declarative Pipeline中的步调不是必须的,但它可以提供一个有效的加强(groovy  ?)。
  1. pipeline {
  2.     agent any
  3.     stages {
  4.         stage('Example') {
  5.             steps {
  6.                 echo 'Hello World'
  7.                 script {
  8.                     def browsers = ['chrome', 'firefox']
  9.                     for (int i = 0; i < browsers.size(); ++i) {
  10.                         echo "Testing the ${browsers[i]} browser"
  11.                     }
  12.                 }
  13.             }
  14.         }
  15.     }
  16. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4