Jenkins Pipeline语法(上)

如“ 入门指南 ”所述,Pipeline最基本的部分是“步骤”。基本上,步骤告诉Jenkins 要做什么,并且作为Declarative和Scripted Pipeline语法的基本构建块。

声明性Pipeline

声明性Pipeline是Jenkins Pipeline 的一个相对较新的补充, 它在Pipeline子系统之上提出了一种更为简化和有意义的语法。

所有有效的声明性Pipeline必须包含在一个pipeline块内,例如:

pipeline {
    /* insert Declarative Pipeline here */
}

声明性Pipeline中有效的基本语句和表达式遵循与Groovy语法相同的规则 ,但有以下例外:

  • Pipeline的顶层必须是块,具体来说是:pipeline { }
  • 没有分号作为语句分隔符。每个声明必须在自己的一行
  • 块只能包含章节, 指令,步骤或赋值语句。
  • 属性引用语句被视为无参数方法调用。所以例如,输入被视为input()

您可以使用 声明性指令生成器 来帮助您配置声明性Pipeline中的指令和部分。

Sections

声明性Pipeline中的Sections通常包含一个或多个指令或步骤。

代理 agent

agent指定整个Pipeline或特定stage将在Jenkins环境中执行的位置,具体取决于该agent 部分的位置。该部分必须在pipeline块内的顶层定义,stage块内的agent是可选的 。

是否必填
参数如下面所描述的
允许出现在在顶级pipeline块和每个stage块中。
参数

为了支持Pipeline作者可能拥有的各种使用场景,agent部分支持几种不同类型的参数。这些参数可以应用于pipeline块的顶层,也可以应用在每个stage指令内。

  • any

在任何可用的代理上执行Pipeline或stage。例如:agent any

  • none

当在pipeline块的顶层应用时,将不会为整个Pipeline运行分配全局代理,并且每个stage部分将需要包含其自己的agent部分。例如:agent none

  • label

使用提供的标签在Jenkins环境中可用的代理上执行Pipeline或stage性执行。例如:agent { label 'my-defined-label' }

  • node

agent { node { label 'labelName' } }行为和 agent { label 'labelName' }相同,但node允许其他选项(如customWorkspace)。

  • docker

用给定的容器执行Pipeline,或stage,将被动态地提供一个预先配置成基于Docker-based Pipelines的节点,或和label参数匹配的任选节点。 docker还可以接受一个args参数,可以直接将参数传递给docker run命令。例如:agent { docker 'maven:3-alpine' }

agent {
    docker {
        image 'maven:3-alpine'
        label 'my-defined-label'
        args  '-v /tmp:/tmp'
    }
}
  • dockerfile

    使用从Dockerfile源存储库中包含的容器构建容器来执行Pipeline或stage 。为了使用此选项,Jenkinsfile必须从Multibranch PipelinePipeline from SCM加载。通常Dockerfile在源码库的根路径:agent { dockerfile true }。如果Dockerfile在其他目录中建立,请使用以下dir选项:agent { dockerfile { dir 'someSubDir' } }。您可以使用additionalBuildArgs选项将其他参数传递给docker build ...命令,如agent { dockerfile { additionalBuildArgs '--build-arg foo=bar' } }

常用选项

下面是可以用于两个或多个agent的常用选项。在没有明确说明的情况下选项是可选的。

  • label

    一个字符串。在这些标签上运行Pipeline或每个stage。此选项可用于nodedockerdockerfile,并且 对于node是必需的。

  • customWorkspace

    一个字符串。运行Pipeline或每个stage, 在这个agent的自定义的工作空间内,而不是默认的。它可以是相对路径,在这种情况下,自定义工作区将位于节点上的工作空间根目录下,也可以是绝对路径。例如:

agent {
    node {
        label 'my-defined-label'
        customWorkspace '/some/other/path'
    }
}
  • reuseNode

    一个布尔值,默认为false。如果为true,则在同一工作空间中,而不是完全在新节点上运行Pipeline顶层指定的节点上的容器。此选项适用于dockerdockerfile,并且仅在agent的每个stage内才有效果。

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent { docker 'maven:3-alpine' } 
    stages {
        stage('Example Build') {
            steps {
                sh 'mvn -B clean verify'
            }
        }
    }
}

在给定名称和tag(maven:3-alpine)的新创建的容器中执行此Pipeline中定义的所有步骤。

Stage-level agent 部分

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent none 
    stages {
        stage('Example Build') {
            agent { docker 'maven:3-alpine' } 
            steps {
                echo 'Hello, Maven'
                sh 'mvn --version'
            }
        }
        stage('Example Test') {
            agent { docker 'openjdk:8-jre' } 
            steps {
                echo 'Hello, JDK'
                sh 'java -version'
            }
        }
    }
}
  1. agent none在Pipeline顶层定义确保执行者不会被不必要地分配。使用agent none也强制每个stage部分包含自己的agent部分

  2. 使用此镜像在新创建的容器中执行此stage中的步骤

  3. 在新创建的容器中使用与前一个stage的不同镜像执行此stage中的步骤

发布 post

post定义将在Pipeline运行或stage结束时运行的操作。一些条件后 的块的内支持post: always,changed,failure,success,unstable,aborted。这些块允许在Pipeline运行或stage结束时执行步骤,具体取决于Pipeline的状态。

是否必填
参数没有
允许出现在在顶级pipeline块和每个stage块中。
条件
  • always

    无论Pipeline运行的完成状态如何都会运行。

  • changed

    只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。

  • failure

    仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。

  • success

    仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。

  • unstable

    只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。

  • aborted

    只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。

  • cleanup

    无论管道或stage的状态如何,在跑完所有其他的post条件后运行此条件下 的post步骤。

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            echo 'I will always say Hello again!'
        }
    }
}
  1. 通常,该post部分应放在Pipeline末端

  2. post条件块包含的步骤和steps中的步骤用法相同

stage stages

包含一个或多个stage指令的序列,该stages部分是Pipeline 描述的大部分“工作”所在的位置。建议stages至少为持续交付流程的每个独立部分包含至少一个stage指令,例如构建,测试和部署。

是否必填
参数没有
允许出现在pipeline内只有一次。
例如
pipeline {
    agent any
    stages { 
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

stages部分一般跟在agentoptions等后面。

步骤 steps

steps部分定义了在给定stage指令中执行的一系列一个或多个步骤。

是否必填
参数没有
允许出现在每个stage块内
例如
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example') {
            steps { 
                echo 'Hello World'
            }
        }
    }
}

steps部分必须包含一个或多个步骤

    原文作者:程序员文集
    原文地址: https://www.jianshu.com/p/18327865a38a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞