以下内容针对把k8s pod作为agent的jenkins job场景
挂载cache
挂载ccache,gradle
-
k8s集群挂载目录
cache和gradle缓存目录需要在k8s环境的CI集群的node节点中先创建
这个目录可以是gpfs存储也可以是k8s 集群的node的本地目录
当前jenkins 环境已经挂载了一个测试的gpfs目录作为各种缓存目录使用
/gpfs-test/cicd/build_cache -
Jenkins job运行时挂载
在确认k8s环境的CI集群已经有对应的存储目录之后,需要该目录映射到jenkins job的pod中
Job 的pod是每次运行的时候会自动挂载
参考配置
需要设置ccache缓存目录
需要设置gradle缓存目录
/*
下面的配置 是将ci集群中的缓存目录/gpfs-test/cicd 挂载到运行中的prepare容器中使用
volumes 关键字是pod的模板配置的关键字,表示把本地的目录/gpfs-test/cicd 隐射到pod中
作为一个存储资源使用,并且设置了一个名字叫build-cache 这个名字,任何pod中容器都能
使用
volumeMounts 是pod模板中定义docker资源的关键字,表示docker从pod中挂在资源,
下面的例子就是preare这个docker将pod定义的build-cache这个资源挂载到docker内部
并且挂载的目录叫/home/ci-cache,这个目录在docker中读取到的数据就是外面/gpfs-test/cicd
的数据
我们在docker中使用目录的时候,就和在外部是一样的,这里是设置了2个缓存的家目录
ccache /home/ci-cache/build_cache/test/${STAGE_NAME}/.ccache
gradle /home/ci-cache/build_cache/test/${STAGE_NAME}/.gradle
这样在编译的时候就会自动的将依赖数据加载到对应的目录中,下次再次使用的时候就不用下载了
/home/ci-cache/build_cache/ 这个路径是必须要写的路径,后面接的目录可以用项目来区分
例如 /home/ci-cache/build_cache/auto/matrix 这样的
${STAGE_NAME} 这个是pipeline的环境变量表示当前这个stage的名字
一般用在多平台编译的时候区分缓存目录
例如/home/ci-cache/build_cache/auto/matrix/ubuntun
/home/ci-cache/build_cache/auto/matrix/j5
/home/ci-cache/build_cache/auto/matrix/j3
等等
*/
pipeline {
agent {
kubernetes {
label "${UUID.randomUUID().toString()}"
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
env:
- name: CONTAINER_ENV_VAR
value: prepare
volumeMounts:
- name: build-cache
mountPath: /home/ci-cache
volumes:
- name: build-cache
hostPath:
path: /gpfs-test/cicd/build_cache
"""
}
}
stages{
stage('lanuch') {
environment {
GRADLE_USER_HOME = "/home/ci-cache/test/${STAGE_NAME}/.gradle"
CCACHE_DIR = "/home/ci-cache/test/${STAGE_NAME}/.ccache"
CACHE_UMASK = "002"
}
steps {
container('prepare') {
script {
sh 'env'
}
}
}
}
}
}
挂载测试bucket
- k8s集群挂载bucket
已经拥有bucket后,需要在k8s环境的CI集群的node节点中先用自己的用户挂载
将bucket挂载到自己的目录下之后,就可以在pod中访问 - Jenkins job运行时挂载
参考
确认bucket挂载好之后,需要确定自己的uid,只有uid相同的用户才能读取这个bucket
/*
下面的配置 是将ci集群中的bucket目录/home/users/test/data 挂载到
运行中的prepare容器中使用
volumes 关键字是pod的模板配置的关键字表示把本地的目录/home/users/test/data
映射到pod中,作为一个存储资源使用,并且设置了一个名字叫cidata这个名字,这个pod中的任何容器都能使用
volumeMounts 是pod模板中定义docker资源的关键字,表示docker从pod中挂载资源,
下面的例子就是preare这个docker将pod定义的cidata这个资源挂载到docker内部
并且挂载的目录叫/home/cidata,这个目录在docker中读取到的数据就是外面/home/cidata的数据
在使用的时候由于bucket有认证机制,只有uid相同的用户在挂载之后才能使用
所以在prepare容器中先创建cicd这个用户,cicd这个用户的uid就是外面bucket的用户的uid
然后所有的读取数据之类的命令都是以这个用户运行
同时需要创建jenkins 这个用户
然后将cicd这个用户追加到root和jenkins的group中
*/
pipeline {
agent {
kubernetes {
label "${UUID.randomUUID().toString()}"
yaml """
metadata:
labels:
some-label: some-label-value
class: KubernetesDeclarativeAgentTest
namespace: scm
spec:
nodeSelector:
jenkins-ci: "true"
hobot.workas: gpu
tolerations:
- effect: NoSchedule
key: gpu
operator: Equal
value: "true"
- effect: NoSchedule
key: ci
operator: Equal
value: "true"
containers:
- name: jnlp
image: hub.hobot.cc/ci/jnlp-slave:3.29-1-alpine
resources:
requests:
cpu: 1000m
memory: 2048Mi
limits:
cpu: 2000m
memory: 4096Mi
- name: prepare
image: hub.hobot.cc/builder/cicd-common-tool:v8
command:
- cat
tty: true
env:
- name: CONTAINER_ENV_VAR
value: prepare
volumeMounts:
- name: cidata
mountPath: /home/cidata
volumes:
- name: cidata
hostPath:
path: /home/users/test/data
"""
}
}
stages{
stage('prepare') {
steps {
container('prepare') {
script {
sh '''
useradd cicd -u xxxx
useradd jenkins -u 1000
usermod -a -G root,jenkins cicd
chmod g+w -R ${WORKSPACE}
'''
sh '''#!/bin/bash
su cicd -c "ls /home/cidata"
'''
}
}
}
}
}
}