Jenkins语法

内容分享12小时前发布
0 0 0

Jenkins 流水线(Pipeline)是 Jenkins 中用于实现持续集成/持续部署(CI/CD) 的核心工具,通过代码化的方式定义构建、测试、部署的全流程,支持可扩展、可版本控制的流水线配置。Jenkins 流水线主要有两种语法风格:声明式流水线(Declarative Pipeline)脚本式流水线(Scripted Pipeline),其中声明式是官方推荐的主流方式,语法更简洁、结构化更强。

一、核心概念

Pipeline:整个流水线的定义,由一系列阶段(Stage)组成。Stage:流水线的逻辑阶段,如「拉取代码」「编译构建」「单元测试」「部署」等,每个 Stage 包含具体的步骤(Step)。Step:流水线的最小执行单元,是 Jenkins 提供的核心操作(如
sh
执行shell命令、
git
拉取代码、
docker
操作等)。Agent:指定流水线执行的节点(Jenkins 从节点/主节点),支持容器化执行(如 Docker)。Post:流水线执行完成后的后续操作(如成功通知、失败清理、生成报告)。Jenkinsfile:存储流水线代码的文件,通常提交到代码仓库(如 Git),实现「流水线即代码(PiC)」。

二、声明式流水线(Declarative Pipeline)

声明式流水线是 Jenkins 2.5 及以上版本推出的新语法,采用结构化的 DSL(领域特定语言),强制固定的代码结构,易于阅读和维护,是绝大多数场景的首选。

1. 基本结构

声明式流水线的核心是
pipeline
块,所有逻辑都包裹在其中,基本骨架如下:


pipeline {
    agent any  // 指定执行节点(any 表示任意可用节点)
    parameters {  // 可选:流水线参数(如分支、部署环境)
        string(name: 'BRANCH', defaultValue: 'main', description: '代码分支')
        choice(name: 'ENV', choices: ['test', 'prod'], description: '部署环境')
    }
    environment {  // 可选:全局环境变量
        JAVA_HOME = '/usr/lib/jvm/java-17-openjdk'
        PROJECT_NAME = 'my-springboot-app'
    }
    triggers {  // 可选:流水线触发方式(如定时、代码提交)
        cron('H 2 * * *')  // 每天凌晨2点执行
        pollSCM('H/15 * * * *')  // 每15分钟轮询代码仓库
    }
    stages {  // 流水线的核心阶段定义
        stage('拉取代码') {
            steps {  // 该阶段的具体执行步骤
                echo '开始拉取代码...'
                git url: 'https://github.com/your-name/your-project.git', branch: params.BRANCH
            }
        }
        stage('编译构建') {
            steps {
                echo '开始编译构建...'
                sh 'mvn clean package -DskipTests'  // 执行Maven构建(需节点安装Maven)
            }
            post {  // 该阶段执行后的操作(可选)
                success { echo '编译构建成功!' }
                failure { echo '编译构建失败!' }
            }
        }
        stage('单元测试') {
            steps {
                echo '执行单元测试...'
                sh 'mvn test'
            }
        }
        stage('部署到目标环境') {
            when {  // 条件判断:仅当选择prod环境时执行该阶段
                expression { params.ENV == 'prod' }
            }
            steps {
                echo "部署到${params.ENV}环境..."
                // 此处可添加部署脚本(如SSH发布、K8s部署、Docker启动等)
                sh './deploy.sh ${ENV}'
            }
        }
    }
    post {  // 全局后置操作(流水线结束后执行)
        always { echo '流水线执行完成,无论成功/失败' }
        success { emailext to: 'dev@example.com', subject: '流水线执行成功' }
        failure { emailext to: 'dev@example.com', subject: '流水线执行失败' }
        unstable { echo '流水线状态为不稳定(如测试用例部分失败)' }
    }
}
2. 关键语法详解
(1)Agent(执行节点)

用于指定流水线在哪个节点执行,支持多种配置方式:


agent any
:在任意可用节点执行。
agent none
:不指定全局节点,需为每个 Stage 单独指定
agent

agent label 'node-01'
:在标签为
node-01
的从节点执行。
agent docker 'maven:3.8.5-openjdk-17'
:使用指定的 Docker 镜像作为执行环境(需 Jenkins 配置 Docker 插件)。


agent {
    docker {
        image 'maven:3.8.5-openjdk-17'
        args '-v /root/.m2:/root/.m2'  // 挂载本地Maven仓库,避免重复下载依赖
    }
}
(2)Parameters(流水线参数)

支持动态传入参数,常用参数类型:


string
:字符串参数(如分支名)。
choice
:下拉选择框(如部署环境)。
booleanParam
:布尔值参数(如是否执行测试)。
file
:文件上传参数(如配置文件)。

(3)Environment(环境变量)

定义流水线的全局/阶段级环境变量,支持三种方式:

直接赋值:
KEY = 'VALUE'
。从 Jenkins 凭据中读取(推荐,避免硬编码敏感信息):


environment {
    DB_PASSWORD = credentials('jenkins-db-pwd-id')  // 引用Jenkins中配置的凭据ID
}

动态生成:
ENV_NAME = sh(script: 'echo $PATH', returnStdout: true).trim()

(4)When(条件判断)

用于控制 Stage 是否执行,支持多种条件:


expression
:基于 Groovy 表达式判断(如
params.ENV == 'prod'
)。
branch
:基于代码分支判断(如
branch 'main'
)。
buildingTag
:是否构建标签(如
buildingTag true
)。
changed
:上一次构建是否有代码变更。

(5)Post(后置操作)

定义流水线/Stage 执行后的操作,支持的条件:


always
:无论结果如何都执行。
success
:执行成功时执行。
failure
:执行失败时执行。
unstable
:流水线状态为不稳定时执行(如测试用例失败)。
aborted
:流水线被手动终止时执行。

(6)Triggers(触发方式)

配置流水线的自动触发规则:


cron
:基于 cron 表达式定时触发(如
H 2 * * *

H
表示随机分钟,避免并发)。
pollSCM
:轮询代码仓库,有变更时触发。
upstream
:上游流水线执行完成后触发(如
upstream(upstreamProjects: 'projectA', threshold: hudson.model.Result.SUCCESS)
)。

三、脚本式流水线(Scripted Pipeline)

脚本式流水线是 Jenkins 早期的流水线语法,基于Groovy 脚本的自由式编程风格,灵活性更高,但结构松散,维护成本较高,适合复杂的自定义逻辑场景。

1. 基本结构

脚本式流水线无需固定的
pipeline
块,直接通过
node
指定执行节点,然后定义 Stage 和 Step:


// 脚本式流水线示例
node('node-01') {  // 指定在标签为node-01的节点执行
    // 定义环境变量
    def BRANCH = params.BRANCH ?: 'main'
    def ENV = params.ENV ?: 'test'

    // 拉取代码阶段
    stage('拉取代码') {
        echo '开始拉取代码...'
        git url: 'https://github.com/your-name/your-project.git', branch: BRANCH
    }

    // 编译构建阶段
    stage('编译构建') {
        try {
            echo '开始编译构建...'
            sh 'mvn clean package -DskipTests'
            echo '编译构建成功!'
        } catch (e) {
            echo "编译构建失败:${e.getMessage()}"
            throw e  // 抛出异常,终止流水线
        }
    }

    // 部署阶段(条件判断)
    stage('部署到目标环境') {
        if (ENV == 'prod') {
            echo "部署到${ENV}环境..."
            sh './deploy.sh ${ENV}'
        } else {
            echo "跳过生产环境部署,当前环境:${ENV}"
        }
    }

    // 后置操作
    echo '流水线执行完成'
}
2. 核心特点

完全基于 Groovy 语法,支持循环、条件、异常捕获、函数定义等高级特性。无固定结构约束,灵活性强,但需要开发者具备 Groovy 编程能力。不支持声明式的
post

triggers
等简化语法,需通过 Groovy 代码实现对应逻辑。

四、Jenkinsfile 的使用方式

仓库托管:将
Jenkinsfile
提交到代码仓库的根目录,Jenkins 从仓库中拉取并执行(推荐,实现流水线版本控制)。直接配置:在 Jenkins 流水线项目中,直接在网页端输入流水线代码(适用于临时测试,不推荐生产环境)。

五、常用 Step 步骤

Jenkins 提供了丰富的内置 Step,以下是高频使用的操作:

代码拉取
git url: '仓库地址', branch: '分支名'
Shell 执行
sh '命令'
(Linux/Mac),
bat '命令'
(Windows)。凭据管理
credentials('凭据ID')
(读取 Jenkins 凭据)。工件归档
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
(保存构建产物)。测试报告
junit 'target/surefire-reports/*.xml'
(解析 JUnit 测试报告)。Docker 操作
docker.build('image-name:tag')

docker.image('image-name:tag').push()
(需 Docker 插件)。邮件通知
emailext
(需 Email Extension 插件)。延迟执行
sleep time: 30, unit: 'SECONDS'

六、插件依赖

使用流水线的高级功能需要安装对应的 Jenkins 插件,核心插件:

Pipeline:流水线核心插件(默认已安装)。Pipeline Nodes and Processes:节点和进程管理。Pipeline Utility Steps:提供额外的流水线步骤(如读取文件、解析JSON)。Docker Pipeline:支持 Docker 容器化执行。Email Extension:增强邮件通知功能。Git Plugin:Git 代码仓库集成。

七、最佳实践

流水线即代码:将
Jenkinsfile
提交到代码仓库,与项目代码一起版本控制。避免硬编码:使用 Jenkins 凭据存储敏感信息(如密码、密钥),通过
credentials
引用。容器化执行:使用 Docker 作为 Agent,保证构建环境的一致性(避免「在我电脑上能跑」问题)。分阶段拆分:将流水线拆分为细粒度的 Stage,便于定位问题(如拉取代码、编译、测试、部署分离)。添加通知:在 Post 中配置邮件、钉钉/企业微信通知,及时反馈流水线状态。复用逻辑:通过 Groovy 函数或 Jenkins 共享库(Shared Libraries)复用通用流水线逻辑(如多项目的构建、部署步骤)。

以上是 Jenkins 流水线的核心语法和使用方式,声明式流水线满足绝大多数 CI/CD 场景,脚本式流水线则适用于需要高度自定义的复杂逻辑。实际使用中可结合 Jenkins 插件生态,扩展流水线的功能(如 Kubernetes 部署、SonarQube 代码质量检测等)。

© 版权声明

相关文章

暂无评论

none
暂无评论...