Jenkins的流水线详解
来源:u.kubeinfo.cn/ozoxBB
-
什么是流水线
-
声明式流水线
-
Jenkinsfile 的使用
什么是流水线
jenkins 有 2 种流水线分为声明式流水线
与脚本化流水线
,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
声明式流水线
在声明式流水线语法中,流水线过程定义在 Pipeline{}
中,Pipeline 块
定义了整个流水线中完成的所有工作,比如
参数说明:
-
agent any:在任何可用的代理上执行流水线或它的任何阶段,也就是执行流水线过程的位置,也可以指定到具体的节点
-
stage:定义流水线的执行过程(相当于一个阶段),比如下文所示的 Build、Test、Deploy, 但是这个名字是根据实际情况进行定义的,并非固定的名字
-
steps:执行某阶段具体的步骤。
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Build') {steps {echo 'Build'}}stage('Test') {steps {echo 'Test'}}stage('Deploy') {steps {echo 'Deploy'}}}
}
脚本化流水线
在脚本化流水线语法中,会有一个或多个 Node(节点)块在整个流水线中执行核心工作
参数说明:
-
node:在任何可用的代理上执行流水线或它的任何阶段,也可以指定到具体的节点
-
stage:和声明式的含义一致,定义流水线的阶段。Stage 块在脚本化流水线语法中是可选的,然而在脚本化流水线中实现 stage 块,可以清楚地在 Jenkins UI 界面中显示每个 stage 的任务子集。
//Jenkinsfile (Scripted Pipeline)
node {stage('Build') {echo 'Build'}stage('Test') {echo 'Test'}stage('Deploy') {echo 'Deploy'}
}
声明式流水线
声明式流水线必须包含在一个 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 nonestages {stage('Stage For Build'){agent any}}
}
label
以节点标签形式选择某个具体的节点执行 Pipeline 命令,例如:agent { label 'my-defined-label' }
。节点需要提前配置标签。
pipeline {agent nonestages {stage('Stage For Build'){agent { label 'role-master' }steps {echo "role-master"}}}
}
node
和 label 配置类似,只不过是可以添加一些额外的配置,比如 customWorkspace(设置默认工作目录)
pipeline {agent nonestages {stage('Stage For Build'){agent {node {label 'role-master'customWorkspace "/tmp/zhangzhuo/data"}}steps {sh "echo role-master > 1.txt"}}}
}
dockerfile
使用从源码中包含的 Dockerfile 所构建的容器执行流水线或 stage。此时对应的 agent 写法如下
agent {dockerfile {filename 'Dockerfile.build' //dockerfile文件名称dir 'build' //执行构建镜像的工作目录label 'role-master' //执行的node节点,标签选择additionalBuildArgs '--build-arg version=1.0.2' //构建参数}
}
docker
相当于 dockerfile,可以直接使用 docker 字段指定外部镜像即可,可以省去构建的时间。比如使用 maven 镜像进行打包,同时可以指定 args
agent{docker{image '192.168.10.15/kubernetes/alpine:latest' //镜像地址label 'role-master' //执行的节点,标签选择args '-v /tmp:/tmp' //启动镜像的参数}
}
kubernetes
需要部署 kubernetes 相关的插件,官方文档:
https://github.com/jenkinsci/kubernetes-plugin/
Jenkins 也支持使用 Kubernetes 创建 Slave,也就是常说的动态 Slave。配置示例如下
-
cloud: Configure Clouds 的名称,指定到其中一个 k8s
-
slaveConnectTimeout: 连接超时时间
-
yaml: pod 定义文件,jnlp 容器的配置必须有配置无需改变,其余 containerd 根据自己情况指定
-
workspaceVolume:持久化 jenkins 的工作目录。
- persistentVolumeClaimWorkspaceVolume:挂载已有 pvc。
workspaceVolume persistentVolumeClaimWorkspaceVolume(claimName: "jenkins-agent", mountPath: "/", readOnly: "false")
- nfsWorkspaceVolume:挂载 nfs 服务器目录
workspaceVolume nfsWorkspaceVolume(serverAddress: "192.168.10.254", serverPath: "/nfs", readOnly: "false")
- dynamicPVC:动态申请 pvc,任务执行结束后删除
workspaceVolume dynamicPVC(storageClassName: "nfs-client", requestsSize: "1Gi", accessModes: "ReadWriteMany")
- emptyDirWorkspaceVolume:临时目录,任务执行结束后会随着 pod 删除被删除,主要功能多个任务 container 共享 jenkins 工作目录。
workspaceVolume emptyDirWorkspaceVolume()
- hostPathWorkspaceVolume:挂载 node 节点本机目录,注意挂载本机目录注意权限问题,可以先创建设置 777 权限,否则默认 kubelet 创建的目录权限为 755 默认其他用户没有写权限,执行流水线会报错。
workspaceVolume hostPathWorkspaceVolume(hostPath: "/opt/workspace", readOnly: false)
示例
agent {kubernetes {cloud 'kubernetes'slaveConnectTimeout 1200workspaceVolume emptyDirWorkspaceVolume()yaml '''
kind: Pod
metadata:name: jenkins-agent
spec:containers:- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']image: '192.168.10.15/kubernetes/jnlp:alpine'name: jnlpimagePullPolicy: IfNotPresent- command:- "cat"image: "192.168.10.15/kubernetes/alpine:latest"imagePullPolicy: "IfNotPresent"name: "date"tty: truerestartPolicy: Never
'''}
}
2.agent 的配置示例
kubernetes 示例
pipeline {agent {kubernetes {cloud 'kubernetes'slaveConnectTimeout 1200workspaceVolume emptyDirWorkspaceVolume()yaml '''
kind: Pod
metadata:name: jenkins-agent
spec:containers:- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']image: '192.168.10.15/kubernetes/jnlp:alpine'name: jnlpimagePullPolicy: IfNotPresent- command:- "cat"image: "192.168.10.15/kubernetes/alpine:latest"imagePullPolicy: "IfNotPresent"name: "date"tty: true- command:- "cat"image: "192.168.10.15/kubernetes/kubectl:apline"imagePullPolicy: "IfNotPresent"name: "kubectl"tty: truerestartPolicy: Never
'''}}environment {MY_KUBECONFIG = credentials('kubernetes-cluster')}stages {stage('Data') {steps {container(name: 'date') {sh """date"""}}}stage('echo') {steps {container(name: 'date') {sh """echo 'k8s is pod'"""}}}stage('kubectl') {steps {container(name: 'kubectl') {sh """kubectl get pod -A --kubeconfig $MY_KUBECONFIG"""}}}}
}
docker 的示例
pipeline {agent nonestages {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.Post
Post 一般用于流水线结束后的进一步处理,比如错误通知等。Post 可以针对流水线不同的结果做出不同的处理,就像开发程序的错误处理,比如 Python 语言的 try catch。
Post 可以定义在 Pipeline 或 stage 中,目前支持以下条件
-
always
:无论 Pipeline 或 stage 的完成状态如何,都允许运行该 post 中定义的指令; -
changed
:只有当前 Pipeline 或 stage 的完成状态与它之前的运行不同时,才允许在该 post 部分运行该步骤; -
fixed
:当本次 Pipeline 或 stage 成功,且上一次构建是失败或不稳定时,允许运行该 post 中定义的指令; -
regression
:当本次 Pipeline 或 stage 的状态为失败、不稳定或终止,且上一次构建的 状态为成功时,允许运行该 post 中定义的指令; -
failure
:只有当前 Pipeline 或 stage 的完成状态为失败(failure),才允许在 post 部分运行该步骤,通常这时在 Web 界面中显示为红色 -
success
:当前状态为成功(success),执行 post 步骤,通常在 Web 界面中显示为蓝色 或绿色 -
unstable
:当前状态为不稳定(unstable),执行 post 步骤,通常由于测试失败或代码 违规等造成,在 Web 界面中显示为黄色 -
aborted
:当前状态为终止(aborted),执行该 post 步骤,通常由于流水线被手动终止触发,这时在 Web 界面中显示为灰色; -
unsuccessful
:当前状态不是 success 时,执行该 post 步骤; -
cleanup
:无论 pipeline 或 stage 的完成状态如何,都允许运行该 post 中定义的指令。和 always 的区别在于,cleanup 会在其它执行之后执行。
示例
一般情况下 post 部分放在流水线的底部,比如本实例,无论 stage 的完成状态如何,都会输出一条 I will always say Hello again!信息
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Example1') {steps {echo 'Hello World1'}}stage('Example2') {steps {echo 'Hello World2'}}}post {always {echo 'I will always say Hello again!'}}
}
也可以将 post 写在 stage,下面示例表示 Example1 执行失败执行 post。
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Example1') {steps {sh 'ip a'}post {failure {echo 'I will always say Hello again!'}}}}
}
4.sepes
Steps 部分在给定的 stage 指令中执行的一个或多个步骤,比如在 steps 定义执行一条 shell 命令
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}
}
或者是使用 sh 字段执行多条指令
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Example') {steps {sh """echo 'Hello World1'echo 'Hello World2'"""}}}
}
Directives
Directives 可用于一些执行 stage 时的条件判断或预处理一些数据,和 Sections 一致,Directives 不是一个关键字或指令,而是包含了 environment、options、parameters、triggers、stage、tools、 input、when 等配置。
1.Environment
Environment 主要用于在流水线中配置的一些环境变量,根据配置的位置决定环境变量的作用域。可以定义在 pipeline 中作为全局变量,也可以配置在 stage 中作为该 stage 的环境变量。该指令支持一个特殊的方法 credentials(),该方法可用于在 Jenkins 环境中通过标识符访问预定义的凭证。对于类型为 Secret Text 的凭证,credentials()可以将该 Secret 中的文本内容赋值给环境变量。对于类型为标准的账号密码型的凭证,指定的环境变量为 username 和 password,并且也会定义两个额外的环境变量,分别为MYVARNAME_USR和MYVARNAME_PSW。
基本变量使用
//示例
pipeline {agent anyenvironment { //全局变量,会在所有stage中生效NAME= 'zhangzhuo'}stages {stage('env1') {environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效HARBOR = 'https://192.168.10.15'}steps {sh "env"}}stage('env2') {steps {sh "env"}}}
}
使用变量引用 secret 的凭证
//这里使用k8s的kubeconfig文件示例
pipeline {agent anyenvironment {KUBECONFIG = credentials('kubernetes-cluster')}stages {stage('env') {steps {sh "env" //默认情况下输出的变量内容会被加密}}}
}
使用变量引用类型为标准的账号密码型的凭证
这里使用 HARBOR 变量进行演示,默认情况下账号密码型的凭证会自动创建 3 个变量
-
HARBOR_USR:会把凭证中 username 值赋值给这个变量
-
HARBOR_PSW:会把凭证中 password 值赋值给这个变量
-
HARBOR:默认情况下赋值的值为usernamme:password
//这里使用k8s的kubeconfig文件示例
pipeline {agent anyenvironment {HARBOR = credentials('harbor-account')}stages {stage('env') {steps {sh "env"}}}
}
2.Options
Jenkins 流水线支持很多内置指令,比如 retry 可以对失败的步骤进行重复执行 n 次,可以根据不同的指令实现不同的效果。比较常用的指令如下:
-
buildDiscarder
:保留多少个流水线的构建记录 -
disableConcurrentBuilds
:禁止流水线并行执行,防止并行流水线同时访问共享资源导致流水线失败。 -
disableResume
:如果控制器重启,禁止流水线自动恢复。 -
newContainerPerStage
:agent 为 docker 或 dockerfile 时,每个阶段将在同一个节点的新容器中运行,而不是所有的阶段都在同一个容器中运行。 -
quietPeriod
:流水线静默期,也就是触发流水线后等待一会在执行。 -
retry
:流水线失败后重试次数。 -
timeout
:设置流水线的超时时间,超过流水线时间,job 会自动终止。如果不加 unit 参数默认为 1 分。 -
timestamps
:为控制台输出时间戳。
定义在 pipeline 中
pipeline {agent anyoptions {timeout(time: 1, unit: 'HOURS') //超时时间1小时,如果不加unit参数默认为1分timestamps() //所有输出每行都会打印时间戳buildDiscarder(logRotator(numToKeepStr: '3')) //保留三个历史构建版本quietPeriod(10) //注意手动触发的构建不生效retry(3) //流水线失败后重试次数}stages {stage('env1') {steps {sh "env"sleep 2}}stage('env2') {steps {sh "env"}}}
}
定义在 stage 中
Option 除了写在 Pipeline 顶层,还可以写在 stage 中,但是写在 stage 中的 option 仅支持 retry、 timeout、timestamps,或者是和 stage 相关的声明式选项,比如 skipDefaultCheckout。处于 stage 级别的 options 写法如下
pipeline {agent anystages {stage('env1') {options { //定义在这里这对这个stage生效timeout(time: 2, unit: 'SECONDS') //超时时间2秒timestamps() //所有输出每行都会打印时间戳retry(3) //流水线失败后重试次数}steps {sh "env && sleep 2"}}stage('env2') {steps {sh "env"}}}
}
3.Parameters
Parameters 提供了一个用户在触发流水线时应该提供的参数列表,这些用户指定参数的值可以通过 params 对象提供给流水线的 step(步骤)。只能定义在 pipeline 顶层。
目前支持的参数类型如下
-
string
:字符串类型的参数。 -
text
:文本型参数,一般用于定义多行文本内容的变量。 -
booleanParam
:布尔型参数。 -
choice
:选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值。 -
password
:密码型变量,一般用于定义敏感型变量,在 Jenkins 控制台会输出为*。
插件 Parameters
-
imageTag
:镜像 tag,需要安装 Image Tag Parameter 插件后使用 -
gitParameter
:获取 git 仓库分支,需要 Git Parameter 插件后使用
示例
pipeline {agent anyparameters {string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '1') //执行构建时需要手动配置字符串类型参数,之后赋值给变量text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '2') //执行构建时需要提供文本参数,之后赋值给变量booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '3') //布尔型参数choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '4') //选择形式列表参数password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') //密码类型参数,会进行加密imageTag(name: 'DOCKER_IMAGE', description: '', image: 'kubernetes/kubectl', filter: '.*', defaultTag: '', registry: 'https://192.168.10.15', credentialId: 'harbor-account', tagOrder: 'NATURAL') //获取镜像名称与taggitParameter(branch: '', branchFilter: 'origin/(.*)', defaultValue: '', description: 'Branch for build and deploy', name: 'BRANCH', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH')} //获取git仓库分支列表,必须有git引用stages {stage('env1') {steps {sh "env"}}stage('git') {steps {git branch: "$BRANCH", credentialsId: 'gitlab-key', url: 'git@192.168.10.14:root/env.git' //使用gitParameter,必须有这个}}}
}
4.Triggers
在 Pipeline 中可以用 triggers 实现自动触发流水线执行任务,可以通过 Webhook、Cron、 pollSCM 和 upstream 等方式触发流水线。
Cron
定时构建假如某个流水线构建的时间比较长,或者某个流水线需要定期在某个时间段执行构建,可以 使用 cron 配置触发器,比如周一到周五每隔四个小时执行一次
注意:H 的意思不是 HOURS 的意思,而是 Hash 的缩写。主要为了解决多个流水线在同一时间同时运行带来的系统负载压力。
pipeline {agent anytriggers {cron('H */4 * * 1-5') //周一到周五每隔四个小时执行一次cron('H/12 * * * *') //每隔12分钟执行一次cron('H * * * *') //每隔1小时执行一次}stages {stage('Example') {steps {echo 'Hello World'}}}
}
Upstream
Upstream 可以根据上游 job 的执行结果决定是否触发该流水线。比如当 job1 或 job2 执行成功时触发该流水线
目前支持的状态有 SUCCESS
、UNSTABLE
、FAILURE
、NOT_BUILT
、ABORTED
等。
pipeline {agent anytriggers {upstream(upstreamProjects: 'env', threshold: hudson.model.Result.SUCCESS) //当env构建成功时构建这个流水线}stages {stage('Example') {steps {echo 'Hello World'}}}
}
5.Input
Input 字段可以实现在流水线中进行交互式操作,比如选择要部署的环境、是否继续执行某个阶段等。
配置 Input 支持以下选项
-
message:必选,需要用户进行 input 的提示信息,比如:“是否发布到生产环境?”;
-
id:可选,input 的标识符,默认为 stage 的名称;
-
ok:可选,确认按钮的显示信息,比如:“确定”、“允许”;
-
submitter:可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input;
-
parameters:提供一个参数列表供 input 使用。
假如需要配置一个提示消息为“还继续么”、确认按钮为“继续”、提供一个 PERSON 的变量的参数,并且只能由登录用户为 alice 和 bob 提交的 input 流水线
pipeline {agent anystages {stage('Example') {input {message "还继续么?"ok "继续"submitter "alice,bob"parameters {string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')}}steps {echo "Hello, ${PERSON}, nice to meet you."}}}
}
6.when
When 指令允许流水线根据给定的条件决定是否应该执行该 stage,when 指令必须包含至少 一个条件。如果 when 包含多个条件,所有的子条件必须都返回 True,stage 才能执行。
When 也可以结合 not、allOf、anyOf 语法达到更灵活的条件匹配。
目前比较常用的内置条件如下
-
branch
:当正在构建的分支与给定的分支匹配时,执行这个 stage。注意,branch 只适用于多分支流水线 -
changelog
:匹配提交的 changeLog 决定是否构建,例如:when { changelog '.*^\\[DEPENDENCY\\] .+$' }
-
environment
:当指定的环境变量和给定的变量匹配时,执行这个 stage,例如:when { environment name: 'DEPLOY_TO', value: 'production' }
-
equals
:当期望值和实际值相同时,执行这个 stage,例如:when { equals expected: 2, actual: currentBuild.number }
; -
expression
:当指定的 Groovy 表达式评估为 True,执行这个 stage,例如:when { expression { return params.DEBUG_BUILD } }
; -
tag
:如果 TAG_NAME 的值和给定的条件匹配,执行这个 stage,例如:when { tag "release-" }
; -
not
:当嵌套条件出现错误时,执行这个 stage,必须包含一个条件,例如:when { not { branch 'master' } }
; -
allOf
:当所有的嵌套条件都正确时,执行这个 stage,必须包含至少一个条件,例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
; -
anyOf
:当至少有一个嵌套条件为 True 时,执行这个 stage,例如:when { anyOf { branch 'master'; branch 'staging' } }
。
示例:当分支为 main 时执行 Example Deploy 步骤
pipeline {agent anystages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {branch 'main' //多分支流水线,分支为才会执行。}steps {echo 'Deploying'}}}
}
也可以同时配置多个条件,比如分支是 production,而且 DEPLOY_TO 变量的值为 main 时,才执行 Example Deploy
pipeline {agent anyenvironment {DEPLOY_TO = "main"}stages {stage('Example Deploy') {when {branch 'main'environment name: 'DEPLOY_TO', value: 'main'}steps {echo 'Deploying'}}}
}
也可以使用 anyOf 进行匹配其中一个条件即可,比如分支为 main 或 DEPLOY_TO 为 main 或 master 时执行 Deploy
pipeline {agent anystages {stage('Example Deploy') {when {anyOf {branch 'main'environment name: 'DEPLOY_TO', value: 'main'environment name: 'DEPLOY_TO', value: 'master'}}steps {echo 'Deploying'}}}
}
也可以使用 expression 进行正则匹配,比如当 BRANCH_NAME 为 main 或 master,并且 DEPLOY_TO 为 master 或 main 时才会执行 Example Deploy
pipeline {agent anystages {stage('Example Deploy') {when {expression { BRANCH_NAME ==~ /(main|master)/ }anyOf {environment name: 'DEPLOY_TO', value: 'main'environment name: 'DEPLOY_TO', value: 'master'}}steps {echo 'Deploying'}}}
}
默认情况下,如果定义了某个 stage 的 agent,在进入该 stage 的 agent 后,该 stage 的 when 条件才会被评估,但是可以通过一些选项更改此选项。比如在进入 stage 的 agent 前评估 when, 可以使用 beforeAgent,当 when 为 true 时才进行该 stage
目前支持的前置条件如下
-
beforeAgent
:如果 beforeAgent 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入该 stage -
beforeInput
:如果 beforeInput 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入到 input 阶段; -
beforeOptions
:如果 beforeInput 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入到 options 阶段; -
beforeOptions 优先级
大于
beforeInput大于
beforeAgent
示例
pipeline {agent nonestages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {beforeAgent truebranch 'main'}steps {echo 'Deploying'}}}
}
Parallel
在声明式流水线中可以使用 Parallel 字段,即可很方便的实现并发构建,比如对分支 A、B、 C 进行并行处理
pipeline {agent anystages {stage('Non-Parallel Stage') {steps {echo 'This stage will be executed first.'}}stage('Parallel Stage') {failFast true //表示其中只要有一个分支构建执行失败,就直接推出不等待其他分支构建parallel {stage('Branch A') {steps {echo "On Branch A"}}stage('Branch B') {steps {echo "On Branch B"}}stage('Branch C') {stages {stage('Nested 1') {steps {echo "In stage Nested 1 within Branch C"}}stage('Nested 2') {steps {echo "In stage Nested 2 within Branch C"}}}}}}}
}
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
Jenkinsfile 的使用
上面讲过流水线支持两种语法,即声明式和脚本式,这两种语法都支持构建持续交付流水线。并且都可以用来在 Web UI 或 Jenkinsfile 中定义流水线,不过通常将 Jenkinsfile 放置于代码仓库中(当然也可以放在单独的代码仓库中进行管理)。
创建一个 Jenkinsfile 并将其放置于代码仓库中,有以下好处
-
方便对流水线上的代码进行复查/迭代
-
对管道进行审计跟踪
-
流水线真正的源代码能够被项目的多个成员查看和编辑
环境变量
1.静态变量
Jenkins 有许多内置变量可以直接在 Jenkinsfile 中使用,可以通过 JENKINS_URL/pipeline/syntax/globals#env
获取完整列表。目前比较常用的环境变量如下
-
BUILD_ID
:当前构建的 ID,与 Jenkins 版本 1.597+中的 BUILD_NUMBER 完全相同 -
BUILD_NUMBER
:当前构建的 ID,和 BUILD_ID 一致 -
BUILD_TAG
:用来标识构建的版本号,格式为:jenkins-{BUILD_NUMBER}, 可以对产物进行命名,比如生产的 jar 包名字、镜像的 TAG 等; -
BUILD_URL
:本次构建的完整 URL,比如:http://buildserver/jenkins/job/MyJobName/17/%EF%BC%9B -
JOB_NAME
:本次构建的项目名称 -
NODE_NAME
:当前构建节点的名称; -
JENKINS_URL
:Jenkins 完整的 URL,需要在 SystemConfiguration 设置; -
WORKSPACE
:执行构建的工作目录。
示例如果一个流水线名称为print_env,第 2 次构建,各个变量的值。
BUILD_ID:2
BUILD_NUMBER:2
BUILD_TAG:jenkins-print_env-2
BUILD_URL:http://192.168.10.16:8080/job/print_env/2/
JOB_NAME:print_env
NODE_NAME:built-in
JENKINS_URL:http://192.168.10.16:8080/
WORKSPACE:/bitnami/jenkins/home/workspace/print_env
上述变量会保存在一个 Map 中,可以使用 env.BUILD_ID 或 env.JENKINS_URL 引用某个内置变量
pipeline {agent anystages {stage('print env') {parallel {stage('BUILD_ID') {steps {echo "$env.BUILD_ID"}}stage('BUILD_NUMBER') {steps {echo "$env.BUILD_NUMBER"}}stage('BUILD_TAG') {steps {echo "$env.BUILD_TAG"}}}}}
}
2.动态变量
动态变量是根据某个指令的结果进行动态赋值,变量的值根据指令的执行结果而不同。如下所示
-
returnStdout
:将命令的执行结果赋值给变量,比如下述的命令返回的是 clang,此时 CC 的值为“clang”。 -
returnStatus
:将命令的执行状态赋值给变量,比如下述命令的执行状态为 1,此时 EXIT_STATUS 的值为 1。
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anyenvironment {// 使用 returnStdoutCC = """${sh(returnStdout: true,script: 'echo -n "clang"' //如果使用shell命令的echo赋值变量最好加-n取消换行)}"""// 使用 returnStatusEXIT_STATUS = """${sh(returnStatus: true,script: 'exit 1')}"""}stages {stage('Example') {environment {DEBUG_FLAGS = '-g'}steps {sh 'printenv'}}}
}
凭证管理
Jenkins 的声明式流水线语法有一个 credentials()函数,它支持 secret text(加密文本)、username 和 password(用户名和密码)以及 secret file(加密文件)等。接下来看一下一些常用的凭证处理方法。
1.加密文本
本实例演示将两个 Secret 文本凭证分配给单独的环境变量来访问 Amazon Web 服务,需要 提前创建这两个文件的 credentials(实践的章节会有演示),Jenkinsfile 文件的内容如下
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anyenvironment {AWS_ACCESS_KEY_ID = credentials('txt1')AWS_SECRET_ACCESS_KEY = credentials('txt2')}stages {stage('Example stage 1') {steps {echo "$AWS_ACCESS_KEY_ID"}}stage('Example stage 2') {steps {echo "$AWS_SECRET_ACCESS_KEY"}}}
}
2.用户名密码
本示例用来演示 credentials 账号密码的使用,比如使用一个公用账户访问 Bitbucket、GitLab、 Harbor 等。假设已经配置完成了用户名密码形式的 credentials,凭证 ID 为 harbor-account
//Jenkinsfile (Declarative Pipeline)
pipeline {agent anyenvironment {BITBUCKET_COMMON_CREDS = credentials('harbor-account')}stages {stage('printenv') {steps {sh "env"}}
}
上述的配置会自动生成 3 个环境变量
-
BITBUCKET_COMMON_CREDS
:包含一个以冒号分隔的用户名和密码,格式为 username:password -
BITBUCKET_COMMON_CREDS_USR
:仅包含用户名的附加变量 -
BITBUCKET_COMMON_CREDS_PSW
:仅包含密码的附加变量。
3.加密文件
需要加密保存的文件,也可以使用 credential,比如链接到 Kubernetes 集群的 kubeconfig 文件等。
假如已经配置好了一个 kubeconfig 文件,此时可以在 Pipeline 中引用该文件
//Jenkinsfile (Declarative Pipeline)
pipeline {agent {kubernetes {cloud 'kubernetes'slaveConnectTimeout 1200workspaceVolume emptyDirWorkspaceVolume()yaml '''
kind: Pod
metadata:name: jenkins-agent
spec:containers:- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']image: '192.168.10.15/kubernetes/jnlp:alpine'name: jnlpimagePullPolicy: IfNotPresent- command:- "cat"image: "192.168.10.15/kubernetes/kubectl:apline"imagePullPolicy: "IfNotPresent"name: "kubectl"tty: truerestartPolicy: Never
'''}}environment {MY_KUBECONFIG = credentials('kubernetes-cluster')}stages {stage('kubectl') {steps {container(name: 'kubectl') {sh """kubectl get pod -A --kubeconfig $MY_KUBECONFIG"""}}}}
}
相关文章:

Jenkins的流水线详解
来源:u.kubeinfo.cn/ozoxBB 什么是流水线 声明式流水线 Jenkinsfile 的使用 什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。…...

DIFFEDIT-图像编辑论文解读
文章目录 摘要算法Step1:计算编辑maskStep2:编码Step3:使用mask引导进行解码理论分析: 实验数据集:扩散模型:ImageNet数据集上实验消融实验IMAGEN数据集上实验COCO数据集上实验 结论 论文: 《D…...

【优选算法】—— 字符串匹配算法
在本期的字符串匹配算法中,我将给大家带来常见的两种经典的示例: 1、暴力匹配(BF)算法 2、KMP算法 目录 (一)暴力匹配(BF)算法 1、思想 2、演示 3、代码展示 (二&…...

Docker容器:docker consul的注册与发现及consul-template守护进程
文章目录 一.docker consul的注册与发现介绍1.什么是服务注册与发现2.什么是consul3.docker consul的应用场景4.consul提供的一些关键特性5.数据流向 二.consul部署1.consul服务器(192.168.198.12)(1)建立 Consul 服务启动consul后…...

Blazor 依赖注入妙用:巧设回调
文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章,没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …...
Python 基础 -- Tutorial(三)
7、输入和输出 有几种方法可以表示程序的输出;数据可以以人类可读的形式打印出来,或者写入文件以备将来使用。本章将讨论其中的一些可能性。 7.1 更花哨的输出格式 到目前为止,我们已经遇到了两种写值的方法:表达式语句和print()函数。(第三种方法是使…...

基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
前言:本文为手把手教学飞控核心知识点之一的姿态解算——MPU6050 姿态解算(飞控专栏第2篇)。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与一阶低通滤波器…...

微信小程序开发教学系列(1)- 开发入门
第一章:微信小程序简介与入门 1.1 简介 微信小程序是一种基于微信平台的应用程序,可以在微信内直接使用,无需下载和安装。它具有小巧、高效、便捷的特点,可以满足用户在微信中获取信息、使用服务的需求。 微信小程序采用前端技…...

Nginx虚拟主机(server块)部署Vue项目
需求 配置虚拟主机,实现一个Nginx运行多个服务。 实现 使用Server块。不同的端口号,表示不同的服务;同时在配置中指定,Vue安装包所在的位置。 配置 Vue项目,放在 html/test 目录下。 config中的配置如下…...

JAVA开发环境接口swagger-ui使用总结
一、前言 swagger-ui是java开发中生产api说明文档的插件,这是后端工程师和前端工程师联调接口的桥梁。生成的文档就减少了很多没必要的沟通提高开发和测试效率。 二、 swagger-ui的使用 1、引入maven依赖 <dependency><groupId>io.springfox</grou…...

mongodb 数据库管理(数据库、集合、文档)
目录 一、数据库操作 1、创建数据库 2、删除数据库 二、集合操作 1、创建集合 2、删除集合 三、文档操作 1、创建文档 2、 插入文档 3、查看文档 4、更新文档 1)update() 方法 2)replace() 方法 一、数据库操作 1、创建数据库 创建数据库…...
分布式与集群的定义及异同
分布式与集群的定义及异同 分布式定义优点不足 集群优点不足 异同 分布式 定义 分布式是指将一个系统或应用程序分散到多个计算机或服务器上进行处理和管理的技术。它是指多个系统协同合作完成一个特定任务的系统。例如,可以将一个大业务拆分成多个子业务…...
电脑端teams一直在线小程序,简单好用易上手
居家办公的你,会不会想要摸鱼!!会不会想要下楼拿快递!!会不会想要出去下馆子!!!然而,teams的5分钟不操作电脑状态就变为离开大大的阻挡了你幸福生活的脚步!&a…...

YOLOv5算法改进(4)— 添加CA注意力机制
前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。在许多视觉任务中,输入数据通常由多个通道组成,例如图像中的RGB通道或…...

无涯教程-PHP - XML GET
XML Get已用于从xml文件获取节点值。以下示例显示了如何从xml获取数据。 Note.xml 是xml文件,可以通过php文件访问。 <SUBJECT><COURSE>Android</COURSE><COUNTRY>India</COUNTRY><COMPANY>LearnFk</COMPANY><PRICE…...

Spark Standalone环境搭建及测试
🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 篇一:Linux系统下配置java环境 篇二:hadoop伪分布式搭建(超详细) 篇三:hadoop完全分布式集群搭建(超详细…...
【PHP】流程控制-ifswitchforwhiledo-whilecontinuebreak
文章目录 流程控制顺序结构分支结构if分支switch分支 循环结构for循环while循环do-while循环continue和break 流程控制 顺序结构:代码从上往下,顺序执行。(代码执行的最基本结构) 分支结构:给定一个条件,…...
Pytorch-day04-模型构建-checkpoint
PyTorch 模型构建 1、GPU配置2、数据预处理3、划分训练集、验证集、测试集4、选择模型5、设定损失函数&优化方法6、模型效果评估 #导入常用包 import os import numpy as np import torch from torch.utils.data import Dataset, DataLoader from torchvision.transfor…...

使用Xshell7控制多台服务同时安装ZK最新版集群服务
一: 环境准备: 主机名称 主机IP 节点 (集群内通讯端口|选举leader|cline端提供服务)端口 docker0 192.168.1.100 node-0 2888 | 3888 | 2181 docker1 192.168.1.101 node-1 2888 | 388…...

python numpy array dtype和astype类型转换的区别
Python3 本身对整数的支持做了提升,可以支持无限长度的整数:比如: b 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffPython的模块numpy array定义的数组在windows和MACOS上默认长度是…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...

Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...

从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...