什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
声明式流水线 在声明式流水线语法中,流水线过程定义在 pipeline{}中,pipeline 块定义了整个流水线中完成的所有工作,比如
参数说明: agent any:在任何可用的代理上执行流水线或它的任何阶段,也就是执行流水线过程的位置,也可以指定到具体的节点 stage:定义流水线的执行过程(相当于一个阶段),比如下文所示的 build、test、deploy, 但是这个名字是根据实际情况进行定义的,并非固定的名字 steps:执行某阶段具体的步骤。 //jenkinsfile (declarative pipeline)pipeline { agent any stages { 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' }} 基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ 声明式流水线 声明式流水线必须包含在一个 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 'role-master' } steps { echo role-master } } }} node 和 label 配置类似,只不过是可以添加一些额外的配置,比如 customworkspace(设置默认工作目录)
pipeline { agent none stages { 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 1200 workspacevolume emptydirworkspacevolume() yaml '''kind: podmetadata: name: jenkins-agentspec: containers: - args: ['$(jenkins_secret)', '$(jenkins_name)'] image: '192.168.10.15/kubernetes/jnlp:alpine' name: jnlp imagepullpolicy: ifnotpresent - command: - cat image: 192.168.10.15/kubernetes/alpine:latest imagepullpolicy: ifnotpresent name: date tty: true restartpolicy: never''' }} 2.agent 的配置示例 kubernetes 示例
pipeline { agent { kubernetes { cloud 'kubernetes' slaveconnecttimeout 1200 workspacevolume emptydirworkspacevolume() yaml '''kind: podmetadata: name: jenkins-agentspec: containers: - args: ['$(jenkins_secret)', '$(jenkins_name)'] image: '192.168.10.15/kubernetes/jnlp:alpine' name: jnlp imagepullpolicy: 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: true restartpolicy: 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 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.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 any stages { 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 any stages { 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 any stages { stage('example') { steps { echo 'hello world' } } }} 或者是使用 sh 字段执行多条指令
//jenkinsfile (declarative pipeline)pipeline { agent any stages { 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 any environment { //全局变量,会在所有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 any environment { 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 any environment { 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 any options { 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 any stages { 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 any parameters { string(name: 'deploy_env', defaultvalue: 'staging', description: '1') //执行构建时需要手动配置字符串类型参数,之后赋值给变量 text(name: 'deploy_text', defaultvalue: 'onetwothree', 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') //获取镜像名称与tag gitparameter(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 any triggers { 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 any triggers { 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 any stages { 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 any stages { stage('example build') { steps { echo 'hello world' } } stage('example deploy') { when { branch 'main' //多分支流水线,分支为才会执行。 } steps { echo 'deploying' } } }} 也可以同时配置多个条件,比如分支是 production,而且 deploy_to 变量的值为 main 时,才执行 example deploy
pipeline { agent any environment { 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 any stages { 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 any stages { 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 none stages { stage('example build') { steps { echo 'hello world' } } stage('example deploy') { when { beforeagent true branch 'main' } steps { echo 'deploying' } } }} parallel 在声明式流水线中可以使用 parallel 字段,即可很方便的实现并发构建,比如对分支 a、b、 c 进行并行处理
pipeline { agent any stages { 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:2build_number:2build_tag:jenkins-print_env-2build_url:http://192.168.10.16:8080/job/print_env/2/job_name:print_envnode_name:built-injenkins_url:http://192.168.10.16:8080/workspace:/bitnami/jenkins/home/workspace/print_env 上述变量会保存在一个 map 中,可以使用 env.build_id 或 env.jenkins_url 引用某个内置变量
pipeline { agent any stages { 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 any environment { // 使用 returnstdout cc = ${sh( returnstdout: true, script: 'echo -n clang' //如果使用shell命令的echo赋值变量最好加-n取消换行 )} // 使用 returnstatus exit_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 any environment { 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 any environment { 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 1200 workspacevolume emptydirworkspacevolume() yaml '''kind: podmetadata: name: jenkins-agentspec: containers: - args: ['$(jenkins_secret)', '$(jenkins_name)'] image: '192.168.10.15/kubernetes/jnlp:alpine' name: jnlp imagepullpolicy: ifnotpresent - command: - cat image: 192.168.10.15/kubernetes/kubectl:apline imagepullpolicy: ifnotpresent name: kubectl tty: true restartpolicy: never''' } } environment { my_kubeconfig = credentials('kubernetes-cluster') } stages { stage('kubectl') { steps { container(name: 'kubectl') { sh kubectl get pod -a --kubeconfig $my_kubeconfig } } } }}
“完全自主可控,安全可信”:Intewell工业互联网操作系统/云平台
开关电源如何分类? 开关电源有哪些基本类型
彩电市场持续不振 OLED技术成为破局关键点
为什么要使用土壤水分测试仪来检测土壤水分含量
程序员能力有哪些境界
新版本Jenkins推荐使用声明式流水线
智能金融市场从细分到垄断的过程
计算机视觉逼近赛点,高估值AI公司的焦虑与未来
【今晚开播】社区说 | 与谷歌开发者专家一起畅想跨平台开发
ios11正式版发布倒计时:ios11正式版9月20日推送,不想等就先尝鲜ios11 GM版吧
化合物半导体应用前景及最新应用
STM32F745 USART1 Bootloader失败原因分析与解决
中兴天机Axon10Pro的性能怎么样
iphone8什么时候上市?iphone8有这十大黑科技够了吗?
iphone8什么时候上市?最新消息:iphone 8即将发布设计基本成型,外观性能大升级,这样的苹果8值得期待!
iPhone12值得买吗 看完这个你就知道了
你造吗!vivo手机这几个功能就可惜了
嵌入式设备发力!小米推米家桌面空气净化器:主打个人私域空间,众筹价 349 元
一体成型电感厂家揭秘大电流一体成型电感尺寸大小对选型的影响
小米降噪耳机3pro上市,搭载声加科技SAE方案实现动态降噪