本篇文章给大家谈谈古代散文网站源码分享,以及古代 散文对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
什么是流水线
jenkins有2种流水线分为声明式流水线与脚本化流水线,脚本化流水线是jenkins旧版本使用的流水线脚本,新版本Jenkins推荐使用声明式流水线。文档只介绍声明流水线。
声明式流水线
在声明式流水线语法中,流水线过程定义在Pipeline{}中,Pipeline块定义了整个流水线中完成的所有工作,比如
参数说明:
?agentany:在任何可用的代理上执行流水线或它的任何阶段,也就是执行流水线过程的位置,也可以指定到具体的节点?stage:定义流水线的执行过程(相当于一个阶段),比如下文所示的Build、Test、Deploy,但是这个名字是根据实际情况进行定义的,并非固定的名字?steps:执行某阶段具体的步骤。
//Jenkinsfile(DeclarativePipeline)\npipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nsteps{\necho&39;\n}\n}\n}\n}
脚本化流水线
在脚本化流水线语法中,会有一个或多个Node(节点)块在整个流水线中执行核心工作
参数说明:
?node:在任何可用的代理上执行流水线或它的任何阶段,也可以指定到具体的节点?stage:和声明式的含义一致,定义流水线的阶段。Stage块在脚本化流水线语法中是可选的,然而在脚本化流水线中实现stage块,可以清楚地在JenkinsUI界面中显示每个stage的任务子集。
//Jenkinsfile(ScriptedPipeline)\nnode{\nstage(&39;){\necho&39;\n}\nstage(&39;){\necho&39;\n}\nstage(&39;){\necho&39;\n}\n}
声明式流水线
声明式流水线必须包含在一个Pipeline块中,比如是一个Pipeline块的格式
pipeline{\n/*insertDeclarativePipelinehere*/\n}
在声明式流水线中有效的基本语句和表达式遵循与Groovy的语法同样的规则,但有以下例外
?流水线顶层必须是一个block,即pipeline{}?分隔符可以不需要分号,但是每条语句都必须在自己的行上?块只能由Sections、Directives、Steps或assignmentstatements组成?属性引用语句被当做是无参数的方法调用,比如input会被当做input()。
Sections
声明式流水线中的Sections不是一个关键字或指令,而是包含一个或多个Agent、Stages、post、Directives和Steps的代码区域块。
1.Agent
Agent表示整个流水线或特定阶段中的步骤和命令执行的位置,该部分必须在pipeline块的顶层被定义,也可以在stage中再次定义,但是stage级别是可选的。
any
在任何可用的代理上执行流水线,配置语法
pipeline{\nagentany\n}
none
表示该Pipeline脚本没有全局的agent配置。当顶层的agent配置为none时,每个stage部分都需要包含它自己的agent。配置语法
pipeline{\nagentnone\nstages{\nstage(&39;){\nagentany\n}\n}\n}
label
以节点标签形式选择某个具体的节点执行Pipeline命令,例如:agent{label&39;}。节点需要提前配置标签。
pipeline{\nagentnone\nstages{\nstage(&39;){\nagent{label&39;}\nsteps{\necho&34;\n}\n}\n}\n}
node
和label配置类似,只不过是可以添加一些额外的配置,比如customWorkspace(设置默认工作目录)
pipeline{\nagentnone\nstages{\nstage(&39;){\nagent{\nnode{\nlabel&39;\ncustomWorkspace&34;\n}\n}\nsteps{\nsh&34;\n}\n}\n}\n}
dockerfile
使用从源码中包含的Dockerfile所构建的容器执行流水线或stage。此时对应的agent写法如下
agent{\ndockerfile{\nfilename&39;//dockerfile文件名称\ndir&39;//执行构建镜像的工作目录\nlabel&39;//执行的node节点,标签选择\nadditionalBuildArgs&39;//构建参数\n}\n}
docker
相当于dockerfile,可以直接使用docker字段指定外部镜像即可,可以省去构建的时间。比如使用maven镜像进行打包,同时可以指定args
agent{\ndocker{\nimage&39;//镜像地址\nlabel&39;//执行的节点,标签选择\nargs&39;//启动镜像的参数\n}\n}
kubernetes
需要部署kubernetes相关的插件,官方文档:
https://github.com/jenkinsci/kubernetes-plugin/
Jenkins也支持使用Kubernetes创建Slave,也就是常说的动态Slave。配置示例如下
?cloud:ConfigureClouds的名称,指定到其中一个k8s?slaveConnectTimeout:连接超时时间?yaml:pod定义文件,jnlp容器的配置必须有配置无需改变,其余containerd根据自己情况指定?workspaceVolume:持久化jenkins的工作目录。?persistentVolumeClaimWorkspaceVolume:挂载已有pvc。
workspaceVolumepersistentVolumeClaimWorkspaceVolume(claimName:&34;,mountPath:&34;,readOnly:&34;)
?nfsWorkspaceVolume:挂载nfs服务器目录
workspaceVolumenfsWorkspaceVolume(serverAddress:&34;,serverPath:&34;,readOnly:&34;)
?dynamicPVC:动态申请pvc,任务执行结束后删除
workspaceVolumedynamicPVC(storageClassName:&34;,requestsSize:&34;,accessModes:&34;)
?emptyDirWorkspaceVolume:临时目录,任务执行结束后会随着pod删除被删除,主要功能多个任务container共享jenkins工作目录。
workspaceVolumeemptyDirWorkspaceVolume()
?hostPathWorkspaceVolume:挂载node节点本机目录,注意挂载本机目录注意权限问题,可以先创建设置777权限,否则默认kubelet创建的目录权限为755默认其他用户没有写权限,执行流水线会报错。
workspaceVolumehostPathWorkspaceVolume(hostPath:&34;,readOnly:false)
示例
agent{\nkubernetes{\ncloud&39;\nslaveConnectTimeout1200\nworkspaceVolumeemptyDirWorkspaceVolume()\nyaml&39;&39;$(JENKINS_SECRET)\\&39;$(JENKINS_NAME)\\&39;192.168.10.15/kubernetes/jnlp:alpine&34;cat&34;192.168.10.15/kubernetes/alpine:latest&34;IfNotPresent&34;date&39;&39;\n}\n}
2.agent的配置示例
kubernetes示例
pipeline{\nagent{\nkubernetes{\ncloud&39;\nslaveConnectTimeout1200\nworkspaceVolumeemptyDirWorkspaceVolume()\nyaml&39;&39;$(JENKINS_SECRET)\\&39;$(JENKINS_NAME)\\&39;192.168.10.15/kubernetes/jnlp:alpine&34;cat&34;192.168.10.15/kubernetes/alpine:latest&34;IfNotPresent&34;date&34;cat&34;192.168.10.15/kubernetes/kubectl:apline&34;IfNotPresent&34;kubectl&39;&39;\n}\n}\nenvironment{\nMY_KUBECONFIG=credentials(&39;)\n}\nstages{\nstage(&39;){\nsteps{\ncontainer(name:&39;){\nsh&34;&34;&34;\n}\n}\n}\nstage(&39;){\nsteps{\ncontainer(name:&39;){\nsh&34;&39;k8sispod&34;&34;\n}\n}\n}\nstage(&39;){\nsteps{\ncontainer(name:&39;){\nsh&34;&34;&34;\n}\n}\n}\n}\n}
docker的示例
pipeline{\nagentnone\nstages{\nstage(&39;){\nagent{docker&39;}\nsteps{\necho&39;\nsh&39;\n}\n}\nstage(&39;){\nagent{docker&39;}\nsteps{\necho&39;\nsh&39;\n}\n}\n}\n}
3.Post
Post一般用于流水线结束后的进一步处理,比如错误通知等。Post可以针对流水线不同的结果做出不同的处理,就像开发程序的错误处理,比如Python语言的trycatch。
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的完成状态如何,都会输出一条IwillalwayssayHelloagain!信息
//Jenkinsfile(DeclarativePipeline)\npipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nsteps{\necho&39;\n}\n}\n}\npost{\nalways{\necho&39;\n}\n}\n}
也可以将post写在stage,下面示例表示Example1执行失败执行post。
//Jenkinsfile(DeclarativePipeline)\npipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\nsh&39;\n}\npost{\nfailure{\necho&39;\n}\n}\n}\n}\n}
4.sepes
Steps部分在给定的stage指令中执行的一个或多个步骤,比如在steps定义执行一条shell命令
//Jenkinsfile(DeclarativePipeline)\npipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\n}\n}
或者是使用sh字段执行多条指令
//Jenkinsfile(DeclarativePipeline)\npipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\nsh&34;&39;HelloWorld1&39;HelloWorld2&34;&34;\n}\n}\n}\n}
Directives
Directives可用于一些执行stage时的条件判断或预处理一些数据,和Sections一致,Directives不是一个关键字或指令,而是包含了environment、options、parameters、triggers、stage、tools、input、when等配置。
1.Environment
Environment主要用于在流水线中配置的一些环境变量,根据配置的位置决定环境变量的作用域。可以定义在pipeline中作为全局变量,也可以配置在stage中作为该stage的环境变量。该指令支持一个特殊的方法credentials(),该方法可用于在Jenkins环境中通过标识符访问预定义的凭证。对于类型为SecretText的凭证,credentials()可以将该Secret中的文本内容赋值给环境变量。对于类型为标准的账号密码型的凭证,指定的环境变量为username和password,并且也会定义两个额外的环境变量,分别为MYVARNAME_USR和MYVARNAME_PSW。
基本变量使用
//示例\npipeline{\nagentany\nenvironment{//全局变量,会在所有stage中生效\nNAME=&39;\n}\nstages{\nstage(&39;){\nenvironment{//定义在stage中的变量只会在当前stage生效,其他的stage不会生效\nHARBOR=&39;\n}\nsteps{\nsh&34;\n}\n}\nstage(&39;){\nsteps{\nsh&34;\n}\n}\n}\n}
使用变量引用secret的凭证
//这里使用k8s的kubeconfig文件示例\npipeline{\nagentany\nenvironment{\nKUBECONFIG=credentials(&39;)\n}\nstages{\nstage(&39;){\nsteps{\nsh&34;//默认情况下输出的变量内容会被加密\n}\n}\n}\n}
使用变量引用类型为标准的账号密码型的凭证
这里使用HARBOR变量进行演示,默认情况下账号密码型的凭证会自动创建3个变量
?HARBOR_USR:会把凭证中username值赋值给这个变量?HARBOR_PSW:会把凭证中password值赋值给这个变量?HARBOR:默认情况下赋值的值为usernamme:password
//这里使用k8s的kubeconfig文件示例\npipeline{\nagentany\nenvironment{\nHARBOR=credentials(&39;)\n}\nstages{\nstage(&39;){\nsteps{\nsh&34;\n}\n}\n}\n}
2.Options
Jenkins流水线支持很多内置指令,比如retry可以对失败的步骤进行重复执行n次,可以根据不同的指令实现不同的效果。比较常用的指令如下:
?buildDiscarder:保留多少个流水线的构建记录?disableConcurrentBuilds:禁止流水线并行执行,防止并行流水线同时访问共享资源导致流水线失败。?disableResume:如果控制器重启,禁止流水线自动恢复。?newContainerPerStage:agent为docker或dockerfile时,每个阶段将在同一个节点的新容器中运行,而不是所有的阶段都在同一个容器中运行。?quietPeriod:流水线静默期,也就是触发流水线后等待一会在执行。?retry:流水线失败后重试次数。?timeout:设置流水线的超时时间,超过流水线时间,job会自动终止。如果不加unit参数默认为1分。?timestamps:为控制台输出时间戳。
定义在pipeline中
pipeline{\nagentany\noptions{\ntimeout(time:1,unit:&39;)//超时时间1小时,如果不加unit参数默认为1分\ntimestamps()//所有输出每行都会打印时间戳\nbuildDiscarder(logRotator(numToKeepStr:&39;))//保留三个历史构建版本\nquietPeriod(10)//注意手动触发的构建不生效\nretry(3)//流水线失败后重试次数\n}\nstages{\nstage(&39;){\nsteps{\nsh&34;\nsleep2\n}\n}\nstage(&39;){\nsteps{\nsh&34;\n}\n}\n}\n}
定义在stage中
Option除了写在Pipeline顶层,还可以写在stage中,但是写在stage中的option仅支持retry、timeout、timestamps,或者是和stage相关的声明式选项,比如skipDefaultCheckout。处于stage级别的options写法如下
pipeline{\nagentany\nstages{\nstage(&39;){\noptions{//定义在这里这对这个stage生效\ntimeout(time:2,unit:&39;)//超时时间2秒\ntimestamps()//所有输出每行都会打印时间戳\nretry(3)//流水线失败后重试次数\n}\nsteps{\nsh&34;\n}\n}\nstage(&39;){\nsteps{\nsh&34;\n}\n}\n}\n}
3.Parameters
Parameters提供了一个用户在触发流水线时应该提供的参数列表,这些用户指定参数的值可以通过params对象提供给流水线的step(步骤)。只能定义在pipeline顶层。
目前支持的参数类型如下
?string:字符串类型的参数。?text:文本型参数,一般用于定义多行文本内容的变量。?booleanParam:布尔型参数。?choice:选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值。?password:密码型变量,一般用于定义敏感型变量,在Jenkins控制台会输出为*。
插件Parameters
?imageTag:镜像tag,需要安装ImageTagParameter插件后使用?gitParameter:获取git仓库分支,需要GitParameter插件后使用
示例
pipeline{\nagentany\nparameters{\nstring(name:&39;,defaultValue:&39;,description:&39;)//执行构建时需要手动配置字符串类型参数,之后赋值给变量\ntext(name:&39;,defaultValue:&39;,description:&39;)//执行构建时需要提供文本参数,之后赋值给变量\nbooleanParam(name:&39;,defaultValue:true,description:&39;)//布尔型参数\nchoice(name:&39;,choices:[&39;,&39;,&39;],description:&39;)//选择形式列表参数\npassword(name:&39;,defaultValue:&39;,description:&39;)//密码类型参数,会进行加密\nimageTag(name:&39;,description:&39;,image:&39;,filter:&39;,defaultTag:&39;,registry:&39;,credentialId:&39;,tagOrder:&39;)//获取镜像名称与tag\ngitParameter(branch:&39;,branchFilter:&39;,defaultValue:&39;,description:&39;,name:&39;,quickFilterEnabled:false,selectedValue:&39;,sortMode:&39;,tagFilter:&39;,type:&39;)\n}//获取git仓库分支列表,必须有git引用\nstages{\nstage(&39;){\nsteps{\nsh&34;\n}\n}\nstage(&39;){\nsteps{\ngitbranch:&34;,credentialsId:&39;,url:&39;//使用gitParameter,必须有这个\n}\n}\n}\n}
4.Triggers
在Pipeline中可以用triggers实现自动触发流水线执行任务,可以通过Webhook、Cron、pollSCM和upstream等方式触发流水线。
Cron
定时构建假如某个流水线构建的时间比较长,或者某个流水线需要定期在某个时间段执行构建,可以使用cron配置触发器,比如周一到周五每隔四个小时执行一次
注意:H的意思不是HOURS的意思,而是Hash的缩写。主要为了解决多个流水线在同一时间同时运行带来的系统负载压力。
pipeline{\nagentany\ntriggers{\ncron(&39;)//周一到周五每隔四个小时执行一次\ncron(&39;)//每隔12分钟执行一次\ncron(&39;)//每隔1小时执行一次\n}\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\n}\n}
Upstream
Upstream可以根据上游job的执行结果决定是否触发该流水线。比如当job1或job2执行成功时触发该流水线
目前支持的状态有SUCCESS、UNSTABLE、FAILURE、NOT_BUILT、ABORTED等。
pipeline{\nagentany\ntriggers{\nupstream(upstreamProjects:&39;,threshold:hudson.model.Result.SUCCESS)//当env构建成功时构建这个流水线\n}\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\n}\n}
5.Input
Input字段可以实现在流水线中进行交互式操作,比如选择要部署的环境、是否继续执行某个阶段等。
配置Input支持以下选项
?message:必选,需要用户进行input的提示信息,比如:“是否发布到生产环境?”;?id:可选,input的标识符,默认为stage的名称;?ok:可选,确认按钮的显示信息,比如:“确定”、“允许”;?submitter:可选,允许提交input操作的用户或组的名称,如果为空,任何登录用户均可提交input;?parameters:提供一个参数列表供input使用。
假如需要配置一个提示消息为“还继续么”、确认按钮为“继续”、提供一个PERSON的变量的参数,并且只能由登录用户为alice和bob提交的input流水线
pipeline{\nagentany\nstages{\nstage(&39;){\ninput{\nmessage&34;\nok&34;\nsubmitter&34;\nparameters{\nstring(name:&39;,defaultValue:&39;,description:&39;)\n}\n}\nsteps{\necho&34;\n}\n}\n}\n}
6.when
When指令允许流水线根据给定的条件决定是否应该执行该stage,when指令必须包含至少一个条件。如果when包含多个条件,所有的子条件必须都返回True,stage才能执行。
When也可以结合not、allOf、anyOf语法达到更灵活的条件匹配。
目前比较常用的内置条件如下
?branch:当正在构建的分支与给定的分支匹配时,执行这个stage。注意,branch只适用于多分支流水线?changelog:匹配提交的changeLog决定是否构建,例如:when{changelog&39;}?environment:当指定的环境变量和给定的变量匹配时,执行这个stage,例如:when{environmentname:&39;,value:&39;}?equals:当期望值和实际值相同时,执行这个stage,例如:when{equalsexpected:2,actual:currentBuild.number};?expression:当指定的Groovy表达式评估为True,执行这个stage,例如:when{expression{returnparams.DEBUG_BUILD}};?tag:如果TAG_NAME的值和给定的条件匹配,执行这个stage,例如:when{tag&34;};?not:当嵌套条件出现错误时,执行这个stage,必须包含一个条件,例如:when{not{branch&39;}};?allOf:当所有的嵌套条件都正确时,执行这个stage,必须包含至少一个条件,例如:when{allOf{branch&39;;environmentname:&39;,value:&39;}};?anyOf:当至少有一个嵌套条件为True时,执行这个stage,例如:when{anyOf{branch&39;;branch&39;}}。
示例:当分支为main时执行ExampleDeploy步骤
pipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nwhen{\nbranch&39;//多分支流水线,分支为才会执行。\n}\nsteps{\necho&39;\n}\n}\n}\n}
也可以同时配置多个条件,比如分支是production,而且DEPLOY_TO变量的值为main时,才执行ExampleDeploy
pipeline{\nagentany\nenvironment{\nDEPLOY_TO=&34;\n}\nstages{\nstage(&39;){\nwhen{\nbranch&39;\nenvironmentname:&39;,value:&39;\n}\nsteps{\necho&39;\n}\n}\n}\n}
也可以使用anyOf进行匹配其中一个条件即可,比如分支为main或DEPLOY_TO为main或master时执行Deploy
pipeline{\nagentany\nstages{\nstage(&39;){\nwhen{\nanyOf{\nbranch&39;\nenvironmentname:&39;,value:&39;\nenvironmentname:&39;,value:&39;\n}\n}\nsteps{\necho&39;\n}\n}\n}\n}
也可以使用expression进行正则匹配,比如当BRANCH_NAME为main或master,并且DEPLOY_TO为master或main时才会执行ExampleDeploy
pipeline{\nagentany\nstages{\nstage(&39;){\nwhen{\nexpression{BRANCH_NAME==~/(main|master)/}\nanyOf{\nenvironmentname:&39;,value:&39;\nenvironmentname:&39;,value:&39;\n}\n}\nsteps{\necho&39;\n}\n}\n}\n}
默认情况下,如果定义了某个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{\nagentnone\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nwhen{\nbeforeAgenttrue\nbranch&39;\n}\nsteps{\necho&39;\n}\n}\n}\n}
Parallel
在声明式流水线中可以使用Parallel字段,即可很方便的实现并发构建,比如对分支A、B、C进行并行处理
pipeline{\nagentany\nstages{\nstage(&39;){\nsteps{\necho&39;\n}\n}\nstage(&39;){\nfailFasttrue//表示其中只要有一个分支构建执行失败,就直接推出不等待其他分支构建\nparallel{\nstage(&39;){\nsteps{\necho&34;\n}\n}\nstage(&39;){\nsteps{\necho&34;\n}\n}\nstage(&39;){\nstages{\nstage(&39;){\nsteps{\necho&34;\n}\n}\nstage(&39;){\nsteps{\necho&34;\n}\n}\n}\n}\n}\n}\n}\n}
Jenkinsfile的使用
上面讲过流水线支持两种语法,即声明式和脚本式,这两种语法都支持构建持续交付流水线。并且都可以用来在WebUI或Jenkinsfile中定义流水线,不过通常将Jenkinsfile放置于代码仓库中(当然也可以放在单独的代码仓库中进行管理)。
创建一个Jenkinsfile并将其放置于代码仓库中,有以下好处
?方便对流水线上的代码进行复查/迭代?对管道进行审计跟踪?流水线真正的源代码能够被项目的多个成员查看和编辑
环境变量
1.静态变量
Jenkins有许多内置变量可以直接在Jenkinsfile中使用,可以通过JENKINS_URL/pipeline/syntax/globals39;printenv&39;BUILD_ID&34;$env.BUILD_ID&39;BUILD_NUMBER&34;$env.BUILD_NUMBER&39;BUILD_TAG&34;$env.BUILD_TAG&34;&34;${sh(\nreturnStdout:true,\nscript:&34;clang&39;//如果使用shell命令的echo赋值变量最好加-n取消换行\n)}&34;&34;&34;${sh(\nreturnStatus:true,\nscript:&39;\n)}&34;&39;Example&39;-g&39;printenv&39;txt1&39;txt2&39;Examplestage1&34;$AWS_ACCESS_KEY_ID&39;Examplestage2&34;$AWS_SECRET_ACCESS_KEY&39;harbor-account&39;printenv&34;env&39;kubernetes&39;&39;\nkind:Pod\nmetadata:\nname:jenkins-agent\nspec:\ncontainers:\n-args:[\\&39;,\\&39;]\nimage:&39;\nname:jnlp\nimagePullPolicy:IfNotPresent\n-command:\n-&34;\nimage:&34;\nimagePullPolicy:&34;\nname:&34;\ntty:true\nrestartPolicy:Never\n&39;&39;kubernetes-cluster&39;kubectl&39;kubectl&34;&34;\nkubectlgetpod-A–kubeconfig$MY_KUBECONFIG\n&34;”\n}\n}\n}\n}\n}
古代散文网站源码分享和古代 散文的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
