二、声明式 Pipeline 语法

声明式 Pipeline 语法

声明式流水线必须包含在一个 Pipeline 块中,比如以下是一个 Pipeline 块的格式:

pipeline {
   
   
   /* insert Declarative Pipeline here */
}

在声明式流水线中有效的基本语句和表达式遵循与 Groovy 的语法同样的规则,但有以下例外:

  • ➢ 流水线顶层必须是一个 block,即 pipeline{};
  • ➢ 分隔符可以不需要分号,但是每条语句都必须在自己的行上;
  • ➢ 块只能由 Sections、Directives、Steps 或 assignment statements 组成;
  • ➢ 属性引用语句被当做是无参数的方法调用,比如 input 会被当做 input()。

一、Sections

声明式流水线中的 Sections 不是一个关键字或指令,而是包含一个或多个 Agent、Stages、post、Directives 和 Steps 的代码区域块。

1. Agent

有很多种Agent 表示整个流水线或特定阶段中的步骤和命令执行的位置,该部分必须在 pipeline 块的顶层被定义,也可以在 stage 中再次定义,但是 stage 级别是可选的。

  • any:在任何可用的代理上执行流水线,配置语法:
pipeline {
   
   
   agent any
}
  • none:表示该 Pipeline 脚本没有全局的 agent 配置。当顶层的 agent 配置为 none 时,每个 stage 部分都需要包含它自己的 agent。配置语法:
pipeline {
   
   
   agent none
   stages {
   
   
      stage('Stage For Build'){
   
   
          agent any
      }
   }
}
  • label:选择某个具体的节点执行 Pipeline 命令,例如:agent { label ‘my-defined-label’ }。配置语法:
pipeline {
   
   
   agent none
   stages {
   
   
      stage('Stage For Build'){
   
   
         agent {
   
    label 'my-slave-label' }
      }
   }
}
  • node:和 label 配置类似,只不过是可以添加一些额外的配置,比如 customWorkspace;

  • dockerfile:使用从源码中包含的 Dockerfile 所构建的容器执行流水线或 stage。此时对应的 agent 写法如下:

agent {
   
   
    dockerfile {
   
   
       filename 'Dockerfile.build'
       dir 'build'
       label 'my-defined-label'
       additionalBuildArgs '--build-arg version=1.0.2'
    }
}

dockerfile需要编译的过程,很慢

一般不去使用dockerfile ,docker常用

  • docker:相当于 dockerfile,可以直接使用 docker 字段指定外部镜像即可,可以省去构建的时间。比如使用 maven 镜像进行打包,同时可以指定 args,一般静态的时候使用:
agent{
   
   
    docker{
   
   
       image 'maven:3-alpine'
       label 'my-defined-label'
       args '-v /tmp:/tmp'
    }
}
  • kubernetes:Jenkins 也支持使用 Kubernetes 创建 Slave,也就是常说的动态 Slave。配置示例如下:
agent {
   
   
   kubernetes {
   
   
      label podlabel
      yaml """
kind: Pod
metadata:
  name: jenkins-agent
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:debug
    imagePullPolicy: Always
    command:
    - /busybox/cat
    tty: true
    volumeMounts:
      - name: aws-secret
        mountPath: /root/.aws/
      - name: docker-registry-config
        mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
    - name: aws-secret
      secret:
        secretName: aws-secret
    - name: docker-registry-config
      configMap:
        name: docker-registry-config
"""
  }

2. 配置示例

示例 1:假设有一个 Java 项目,需要用 mvn 命令进行编译,此时以使用 maven 的镜像作为 agent。配置如下:

Jenkinsfile (Declarative Pipeline) // 可以不要此行
pipeline {
   
   
   agent {
   
    docker 'maven:3-alpine' } 
   stages {
   
   
      stage('Example Build') {
   
   
         steps {
   
   
            sh 'mvn -B clean verify'
         }
      }
   }
}

示例 2:本示例在流水线顶层将 agent 定义为 none,那么此时 stage 部分就需要必须包含它自己的 agent 部分。在stage(‘Example Build’)部分使用 maven:3-alpine 执行该阶段步骤,在stage(‘Example Test’)部分使用 openjdk:8-jre 执行该阶段步骤。

此时 Pipeline 如下:

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'
         }
      }
   }
}

示例 3:上述的示例也可以用基于 Kubernetes 的 agent 实现。比如定义具有三个容器的 Pod,分别为 jnlp(基于http)(负责和 Jenkins Master 通信)、build(负责执行构建命令)、kubectl(负责执行 Kubernetes相关命令),在 steps 中可以通过 containers 字段,选择在某个容器执行命令:

pipeline {
   
   
  agent {
   
   
    kubernetes {
   
   
      cloud 'kubernetes-default'
      slaveConnectTimeout 1200
      yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
   
<think>好的,我需要解释Jenkins中声明式Pipeline语法。首先得回忆一下自己之前学过的Jenkins知识,尤其是声明式Pipeline的部分。可能用户是想了解如何编写Declarative Pipeline的脚本结构,以及各个部分的作用。 首先,声明式Pipeline和脚本式Pipeline的区别可能需要简要提一下,但用户明确问的是声明式,所以重点在后者。然后,得介绍基本的结构,比如pipeline块,agent,stages,stage,steps这些基本指令。 接下来,要分部分详细讲解每个关键部分。比如agent部分是用来指定在哪里执行,可能包括any,label,docker等参数。然后stages包含多个stage,每个stage里又有steps。需要举例子说明,比如拉取代码、构建、测试、部署等阶段。 然后,可能还需要讲到其他常用的指令,比如environment定义环境变量,post处理后续操作,比如成功或失败时的通知。parameters用于定义参数化构建,triggers设置触发器,比如定时构建或者SCM触发。tools可以指定工具如Maven或JDK的版本。 同时,要提到一些控制流程的指令,比如when根据条件执行某个stage,parallel并行执行步骤,input等待用户输入等。这些都属于比较高级的用法,但用户可能需要了解。 还需要注意语法结构,比如块结构、缩进,以及每个指令的具体参数。例如,agent any,或者agent { docker 'image' }。举例说明各个部分如何组合成一个完整的Jenkinsfile。 可能用户会遇到的问题,比如语法错误,或者步骤顺序的问题,所以需要强调语法的正确性,比如必须的pipeline块,以及每个stage必须有steps等。 最后,可以给出一个完整的示例,把各个部分结合起来,让用户有个整体的认识。同时提醒他们参考官方文档获取更详细的信息。 要确保按照用户的要求,使用中文,结构清晰,分步骤说明。避免使用Markdown格式,但思考过程不需要考虑格式。需要检查是否有遗漏的重要指令,比如post部分的各种条件,比如always、success、failure等。 可能还需要提到environment可以在全局或stage级别定义,以及如何使用变量。参数化构建中定义参数类型,比如字符串、布尔值等。 总之,要组织成一个从基础到高级,逐步展开的结构,覆盖声明式Pipeline的主要语法元素,并辅以示例,帮助用户理解如何编写自己的Jenkinsfile。</think>Jenkins的声明式Pipeline采用结构化的语法来定义持续集成/交付流程,以下是关键语法元素的逐步说明: 1. **基础结构** ```groovy pipeline { agent any // 指定执行节点 stages { stage('拉取代码') { steps { // 具体操作步骤 git 'https://github.com/your-repo.git' } } stage('构建') { steps { sh 'mvn clean package' } } } } ``` 2. **核心指令详解** - **agent**:定义执行环境 - `any`:任意可用节点 - `label 'linux'`:指定标签节点 - `docker { image 'maven:3.8.4' }`:使用Docker容器 - **stages/stage**:流程阶段划分 - 必须包含至少一个stage - 每个stage代表一个独立任务阶段 - **steps**:操作命令集合 - 支持shell命令:`sh 'ls -la'` - 调用插件:`bat 'echo %PATH%'` - 文件操作:`archiveArtifacts 'target/*.jar'` 3. **高级配置** - **环境变量** ```groovy environment { CI = 'true' VERSION = '1.0.${BUILD_NUMBER}' } ``` - **参数化构建** ```groovy parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '部署环境') booleanParam(name: 'DRY_RUN', defaultValue: true) } ``` - **触发器配置** ```groovy triggers { cron('H */4 * * 1-5') // 工作日每4小时构建 pollSCM('H */2 * * *') // 每2分钟检查代码变更 } ``` 4. **流程控制** - **条件执行** ```groovy stage('生产部署') { when { branch 'main' expression { params.DEPLOY_ENV == 'production' } } steps { sh './deploy-prod.sh' } } ``` - **错误处理** ```groovy post { always { echo "构建日志: ${currentBuild.absoluteUrl}" } success { slackSend channel: '#ci', message: '构建成功 ✅' } failure { mail to: 'team@example.com', subject: '构建失败' } } ``` 5. **并行执行** ```groovy stage('多环境测试') { parallel { stage('Chrome测试') { steps { sh './test-chrome.sh' } } stage('Firefox测试') { steps { sh './test-firefox.sh' } } } } ``` 6. **工具集成** ```groovy tools { maven 'Maven_3.8.4' // 预配置的Maven版本 jdk 'OpenJDK_11' // 指定JDK版本 } ``` **最佳实践建议:** 1. 使用`Jenkinsfile`文件进行版本控制 2. 复杂逻辑封装到共享库(Shared Libraries) 3. 阶段性添加超时控制 ```groovy stage('长时任务') { options { timeout(time: 1, unit: 'HOURS') } steps { sh './long-running-task.sh' } } ``` 完整示例: ```groovy pipeline { agent { docker 'maven:3.8.4' } options { buildDiscarder(logRotator(numToKeepStr: '10')) disableConcurrentBuilds() } parameters { choice(name: 'ENVIRONMENT', choices: ['dev', 'staging', 'prod']) } stages { stage('Build') { steps { sh 'mvn -B -DskipTests clean package' } post { success { archiveArtifacts 'target/*.jar' } } } stage('Test') { steps { sh 'mvn test' junit 'target/surefire-reports/**/*.xml' } } stage('Deploy') { when { expression { params.ENVIRONMENT != 'dev' } } steps { sh "./deploy.sh ${params.ENVIRONMENT}" } } } } ``` 建议结合Jenkins官方文档和Pipeline Syntax工具(Jenkins界面中的"Snippet Generator")进行更深入的语法探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyan_Jiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值