一、什么是流水线
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
1.1 声明式流水线
在声明式流水线语法中,流水线过程定义在 Pipeline{}中,Pipeline 块定义了整个流水线中完成的所有工作,比如
参数说明:
Agent 表示整个流水线或特定阶段中的步骤和命令执行的位置,该部分必须在 pipeline 块的顶层被定义,也可以在 stage 中再次定义,但是 stage 级别是可选的。
any
在任何可用的代理上执行流水线,配置语法
2.1 Sections
声明式流水线中的 Sections 不是一个关键字或指令,而是包含一个或多个 Agent、Stages、 post、Directives 和 Steps 的代码区域块。
1.Agent
-
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' } } } }1.2 脚本化流水线
在脚本化流水线语法中,会有一个或多个 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()。
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 相关的插件,官方文档:
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/wo

本文详细介绍了Jenkins的声明式和脚本化流水线,包括它们的定义、特点和用法。声明式流水线注重结构,推荐使用,而脚本化流水线更加灵活。文中提到了agent的多种配置,如any、none、label、docker、kubernetes等,并展示了如何在不同场景下使用。此外,文章还讨论了post构建处理、steps、directives、parameters、triggers、when等概念,以及如何在Jenkinsfile中定义和使用这些元素。
最低0.47元/天 解锁文章
887

被折叠的 条评论
为什么被折叠?



