以下内容针对的是jenkins pipeline中的agent
Jenkins 工作模式是master/slave模式,slave端可以是多平台多环境的
windows,linux,k8s集群pod都可以
Jenkins 工作的时候一定要指定agent
本地node 作为agent
本地node节点常见的是windows,linux/开发板之类的
调用的时候需要知道本地node 的名字或者label
以下范例(仅供参考,node请自行配置可以参考Jenkins 配置本地slave 节点 )
name:demo_linux
label: demo_node
程序在运行的时候就会调度到这个demo_node这个标签对应的node节点上面
如果这个label下面有多个node,那么job会根据node的繁忙程度来自由调度
pipeline {
agent {label 'demo_node'}
stages {
stage('prepare') {
steps {
echo 'Preparing..'
}
}
}
}
如果不用label,直接用node name 也可以调度,写法一摸一样的,就是将label对应的值配置成node name
pipeline {
agent {label 'demo_linux'}
stages {
stage('prepare') {
steps {
echo 'Preparing..'
}
}
}
}
k8s集群的pod作为agent
Jenkins 通过插件和k8s集群关联,可以通过声明pod的模板,在k8s集群中创建pod
以此pod作为jenkins 的slave
当前的CI集群配置的策略是 job运行的时候会启动一个pod,等job运行结束会销毁这个pod
同一个pod中 共享网络和WORKSPACE
WORKSPACE是jenkins slave的工作空间
配置参考
/*
以下内容是给这个job配置一个pod作为slave
*/
pipeline {
agent {
kubernetes {
/*
label 是给这个pod设置一个名字标签,这里配置的是随机数
防止和已有的pod标签冲突
*/
label "${UUID.randomUUID().toString()}"
/*
以下内容是pod 模板
metadata 里面是这个pod的基础配置数据
labels 就是pod的标签
class 就是这个pod是一个声明试的客户端
namespace 是这个pod在k8s集群中哪个命名空间下运行的,非常重要
nodeSelector node选择器,k8s在调度pod的时候会根据这个节点选择器
来选择物理机器调度,这个是k8s集群配置的标签,用来区分CI节点和非CI节点
name 是设置docker 名字,设个名字是有规则的,不是随便命名的
建议小写不带特殊字符:prepare,build,build-ubuntu,test-123
image 是docker 对应的镜像,需要自行提供,或者使用已有的镜像
volumes 是给这个pod创建外部的挂在资源,
常用在缓存目录挂载,文件挂载,认证挂载等
volumeMounts 是将pod的挂载资源挂载到对应的docker内部,
docker才可以访问这个资源
其他参数都是常规配置
*/
yaml """
metadata:
labels:
some-label: some-label-value
class: KubernetesDeclarativeAgentTest
namespace: scm
spec:
nodeSelector:
jenkins-ci: "true"
containers:
- name: prepare
image: hub.hobot.cc/builder/cicd-common-tool:v10
command:
- cat
tty: true
- name: gallery
image: hub.hobot.cc/ci/gallery-cli:0.1.9
command:
- cat
tty: true
volumeMounts:
- name: gallery-upload-secret
mountPath: /var/run/gallery
volumes:
- name: gallery-upload-secret
secret:
defaultMode: 420
secretName: gallery-upload-secret
"""
}
}
stages{
stage('prepare') {
steps {
/*
container 关键字,用来指定在对应的docker内执行对应的命令
*/
container('prepare') {
echo 'Preparing..'
sh 'touch file'
}
}
}
stage('gallery') {
steps {
/*
上面prepare container 创建了一个文件
在这个gallery 的container 中可以读取到这个文件
jenkins WORKSPACE这个变量目录 在pod内部是都能访问的
*/
container('gallery') {
echo 'uploading..'
sh 'cat file'
}
}
}
}
}