Docker中部署Jenkins+Pipline流水线基础语法入门

场景

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射):

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)-CSDN博客

DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门:

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门-CSDN博客

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门:

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门-CSDN博客

上面在对前后端项目进行打包时分别用到了Jenkinsfile流水线项目,下面对jenkins的Pipeline流水线的

语法进行简单入门介绍。

注:

博客:
霸道流氓气质-CSDN博客

实现

1、简介

流水线语法官方文档教程

Pipeline Syntax

流水线语法

Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。

持续交付 Pipeline 自动化的表达了这样一种流程:

将基于版本控制管理的软件持续的交付到您的用户和消费者手中。

Jenkins Pipeline 提供了一套可扩展的工具,用于将"简单到复杂"的交付流程实现为"持续交付即代码"。

Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被放入项目的源代码控制库中。

2、环境搭建

参考上面博客搭建jenkins,然后安装pipeline插件

如果需要看到流水线Pipeline执行的可视化界面,可以安装Pipeline:StageView插件。

2、新建流水线项目

安装完插件就可新建任务时选择流水线项目

上面博客中定义流水线时使用的是Pipeline script from SCM的方式,即使用git管理Jenkinsfile文件。

下面直接在jenkins页面上定义流水线的配置文件

定义选择Pipeline script ,然后会提供有Hello World的模板。

根据Hello World模板,修改其内容为

复制代码
pipeline {
    agent any

    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
            }
        }
  stage('编译构建') {
            steps {
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
    }
}

然后点击立即构建

注意脚本保存或修改后保存执行时需要申请执行同意

系统管理-In-process Script Approval

点击进去,点击Approve同意方可执行。

3、Pipeline常用脚本语法

node/agent(节点)

节点是一个机器,可以是Jenkins的master节点也可以是slave节点。

通过node指定当前job运行的机器(这个是脚本式语法)

stage(阶段)

stage定义了在整个流水线的执行任务的概念性的不同的阶段。

step(步骤)

step是每个阶段中要执行的每个步骤。

比如上面

复制代码
pipeline {
    agent any

    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
            }
        }
  stage('编译构建') {
            steps {
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
    }
}

post

post 部分定义一个或多个steps ,这些阶段根据流水线或阶段的完成情况而 运行(取决于流水线中 post 部分的位置).

post 支持以下 post-condition 块中的其中之一:

always, changed, failure, success, unstable, 和 aborted。

这些条件块允许在 post 部分的步骤的执行取决于流水线或阶段的完成状态。

always

无论构建结果如何都会去执行

changed

流水线或阶段的完成状态与它之前的运行不同时执行

failure

流水线失败后执行

success

流水线成功后执行

unstable

流水线构建不稳定时执行, 通常由于测试失败,代码违规等造成。

aborted

流水线取消后执行

示例:

复制代码
pipeline {
    agent any

    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
            }
        }
  stage('编译构建') {
            steps {
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

环境变量environment

定义流水线环境变量,可以定义在全局变量或者步骤中的局部变量。

这取决于 environment 指令在流水线内的位置。

该指令支持一个特殊的助手方法 credentials() ,该方法可用于在Jenkins环境中通过标识符访问预定义的凭证。

对于类型为 "Secret Text"的凭证, credentials() 将确保指定的环境变量包含秘密文本内容。

对于类型为 "SStandard username and password"的凭证, 指定的环境变量指定为 username:password ,

并且两个额外的环境变量将被自动定义 :分别为 MYVARNAME_USR 和 MYVARNAME_PSW

系统管理-凭证-系统-全局凭证,新建Username wirh password环境变量,变量名为badao

则可以这样使用

复制代码
pipeline {
    agent any
 environment {
  SERVICE_CREDS = credentials('badao')
 }
    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
    sh 'echo "Service user is ${SERVICE_CREDS_USR}"'
    sh 'echo "Service password  is ${SERVICE_CREDS_PSW}"'
            }
        }
  stage('编译构建') {
            environment {             
              VERSION = "1.1.20"
            }
            steps {
    sh 'echo "版本号:${VERSION}"'
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

options运行选项

options 指令允许从流水线内部配置特定于流水线的选项。

流水线提供了许多这样的选项, 比如 buildDiscarder,但也可以由插件提供, 比如 timestamps

可用选项

buildDiscarder

为最近的流水线运行的特定数量保存组件和控制台输出。例如: options { buildDiscarder(logRotator(numToKeepStr: '1')) }

disableConcurrentBuilds

不允许同时执行流水线。 可被用来防止同时访问共享资源等。 例如: options { disableConcurrentBuilds() }

overrideIndexTriggers

允许覆盖分支索引触发器的默认处理。 如果分支索引触发器在多分支或组织标签中禁用,

options { overrideIndexTriggers(true) } 将只允许它们用于促工作。

否则, options { overrideIndexTriggers(false) } 只会禁用改作业的分支索引触发器。

skipDefaultCheckout

在`agent` 指令中,跳过从源代码控制中检出代码的默认情况。例如: options { skipDefaultCheckout() }

skipStagesAfterUnstable

一旦构建状态变得UNSTABLE,跳过该阶段。例如: options { skipStagesAfterUnstable() }

checkoutToSubdirectory

在工作空间的子目录中自动地执行源代码控制检出。例如: options { checkoutToSubdirectory('foo') }

timeout

设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。例如: options { timeout(time: 1, unit: 'HOURS') }

retry

在失败时, 重新尝试整个流水线的指定次数。 For example: options { retry(3) }

timestamps

预谋所有由流水线生成的控制台输出,与该流水线发出的时间一致。 例如: options { timestamps() }

示例:

复制代码
pipeline {
    agent any
 environment {
  SERVICE_CREDS = credentials('badao')
 }
 options {
        buildDiscarder(logRotator(numToKeepStr: '1'))
        disableConcurrentBuilds()
        skipDefaultCheckout()
        timeout(time: 1, unit: 'HOURS')
        retry(3)
        timestamps()
    }
    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
    sh 'echo "Service user is ${SERVICE_CREDS_USR}"'
    sh 'echo "Service password  is ${SERVICE_CREDS_PSW}"'
            }
        }
  stage('编译构建') {
            environment {             
              VERSION = "1.1.20"
            }
            steps {
    sh 'echo "版本号:${VERSION}"'
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

parameters参数

parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。

这些用户指定参数的值可通过 params 对象提供给流水线步骤。

可用options

string

字符串类型的参数,例如:parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }

text

一个文本参数,可以包含多行,例如:parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }

booleanParam

布尔参数,例如:parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }

choice

一个选择参数,例如:parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }

password

密码参数,例如:parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }

示例:

复制代码
pipeline {
    agent any
 environment {
  SERVICE_CREDS = credentials('badao')
 }
 options {
        buildDiscarder(logRotator(numToKeepStr: '1'))
        disableConcurrentBuilds()
        skipDefaultCheckout()
        timeout(time: 1, unit: 'HOURS')
        retry(3)
        timestamps()
    }
 parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
    sh 'echo "Service user is ${SERVICE_CREDS_USR}"'
    sh 'echo "Service password  is ${SERVICE_CREDS_PSW}"'
            }
        }
  stage('编译构建') {
            environment {             
              VERSION = "1.1.20"
            }
            steps {
    sh 'echo "版本号:${VERSION}"'
                echo '编译构建'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
    echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

triggers触发器

triggers 指令定义了流水线被重新触发的自动化方法。

对于集成了源( 比如 GitHub 或 BitBucket)的流水线, 可能不需要 triggers ,因为基于 web 的集成很肯能已经存在。

当前可用的触发器是 cron, pollSCM 和 upstream。

cron

接收 cron 样式的字符串来定义要重新触发流水线的常规间隔 ,比如: triggers { cron('H */4 * * 1-5') }

pollSCM

接收 cron 样式的字符串来定义一个固定的间隔,在这个间隔中,Jenkins 会检查新的源代码更新。

如果存在更改, 流水线就会被重新触发。例如: triggers { pollSCM('H */4 * * 1-5') }

upstream

接受逗号分隔的工作字符串和阈值。 当字符串中的任何作业以最小阈值结束时,流水线被重新触发。

例如: triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }

示例:

复制代码
pipeline {
    agent any
    triggers {
        cron('H */4 * * 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

tools构建工具

构建工具maven、ant、gradle,获取通过自动安装或手动放置工具的环境变量。

工具的名称必须在系统设置->全局工具配置中定义。

示例:

复制代码
pipeline {
    agent any
 
 tools {
        maven 'maven'
        jdk   'jdk'
    }
 
 environment {
  SERVICE_CREDS = credentials('badao')
 }
 options {
        buildDiscarder(logRotator(numToKeepStr: '1'))
        disableConcurrentBuilds()
        skipDefaultCheckout()
        timeout(time: 1, unit: 'HOURS')
        retry(3)
        timestamps()
    }
 parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
    sh 'echo "Service user is ${SERVICE_CREDS_USR}"'
    sh 'echo "Service password  is ${SERVICE_CREDS_PSW}"'
            }
        }
  stage('编译构建') {
            environment {             
              VERSION = "1.1.20"
            }
            steps {
    sh 'echo "版本号:${VERSION}"'
                echo '编译构建'
    echo 'mvnversion:'
    sh 'mvn --version'
    echo 'javaversion:'
    sh 'java --version'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
    echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

input交互输入

input用户在执行各个阶段的时候,由人工确认是否继续进行。

message呈现给用户的提示信息。

id可选,默认为stage名称。

ok默认表单上的ok文本。

submitter可选的,以逗号分隔的用户列表或允许提交的外部组名。默认允许任何用户submitterParameter环境变量的可选名称。

如果存在,用submitter名称设置。

parameters提示提交者提供的一个可选的参数列表。

示例:

复制代码
pipeline {
    agent any
 
 tools {
        maven 'maven'
        jdk   'jdk'
    }
 
 environment {
  SERVICE_CREDS = credentials('badao')
 }
 options {
        buildDiscarder(logRotator(numToKeepStr: '1'))
        disableConcurrentBuilds()
        skipDefaultCheckout()
        timeout(time: 1, unit: 'HOURS')
        retry(3)
        timestamps()
    }
 parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
    sh 'echo "Service user is ${SERVICE_CREDS_USR}"'
    sh 'echo "Service password  is ${SERVICE_CREDS_PSW}"'
            }
        }
  stage('Example') {
   input {
    message "请选择"
    ok "确定"
    submitter "badao"
    parameters {
     choice(choices: ['1', '2', '3'], name: 'diff')
    }
   }
   steps {
    echo "Hello, ${PERSON}, nice to meet you."
   }
  }
  stage('编译构建') {
            environment {             
              VERSION = "1.1.20"
            }
            steps {
    sh 'echo "版本号:${VERSION}"'
                echo '编译构建'
    echo 'mvnversion:'
    sh 'mvn --version'
    echo 'javaversion:'
    sh 'java --version'
            }
        }
  stage('项目部署') {
            steps {
                echo '项目部署'
    echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
        }
  failure {
            echo '构建失败'
        } 
    }
}

运行测试

如果安装了Stage View 可视化插件

其它常见语法以及命令参考官方文档说明

创建您的第一个Pipeline

4、Pipeline脚本语法生成器

点击新建的流水线项目-流水线语法

Declarative Directive Generator中会有语法生成器,比如上面的生成options选项

比如上面的input脚本的生成

相关推荐
_板栗_9 分钟前
livenessProbe 和 readinessProbe 最佳实践
云原生·容器·kubernetes
我喜欢山,也喜欢海1 小时前
Jenkins Maven 带权限 搭建方案2025
java·jenkins·maven
kaikaile19951 小时前
Jenkins集成Maven
servlet·jenkins·maven
.生产的驴2 小时前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
知行022 小时前
MySQL的Docker版本,部署在ubantu系统
数据库·mysql·docker
搬砖的工人2 小时前
Docker环境下的Apache NiFi安装实践踩坑记录
docker·容器·apache
luck_me53 小时前
K8s 图形界面管理kubesphere
云原生·容器·kubernetes
QX_hao6 小时前
【docker】--镜像管理
运维·docker·容器
Auc246 小时前
OJ判题系统第6期之判题逻辑开发——设计思路、实现步骤、代码实现(策略模式)
java·开发语言·docker·容器·策略模式
快乐肚皮6 小时前
深入解析Docker:核心架构与最佳实践
java·运维·docker·容器