Jenkins job 运行挂载外部存储/缓存

以下内容针对把k8s pod作为agent的jenkins job场景
挂载cache
挂载ccache,gradle

  1. k8s集群挂载目录
    cache和gradle缓存目录需要在k8s环境的CI集群的node节点中先创建
    这个目录可以是gpfs存储也可以是k8s 集群的node的本地目录
    当前jenkins 环境已经挂载了一个测试的gpfs目录作为各种缓存目录使用
    /gpfs-test/cicd/build_cache

  2. 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

  1. k8s集群挂载bucket
    已经拥有bucket后,需要在k8s环境的CI集群的node节点中先用自己的用户挂载
    将bucket挂载到自己的目录下之后,就可以在pod中访问
  2. 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"
                        '''
                    }
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值