码迷,mamicode.com
首页 > 其他好文 > 详细

Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)

时间:2019-08-23 15:02:13      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:空间   include   ldd   running   tag   kubectl   定制   roo   lis   

一、说明

1.1 说明

前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(一)),maven、kubectl 等容器工具需要在 KubernetesPod.yaml 中定义,存放在代码中,比较繁琐。

这里采用 Jenkinsfile + docker in docker 方式进行部署,把 maven 等工具都运行在 docker 容器中,这样减少了 yaml 文件,相对更加简洁方便。

1.2 环境

Rancher 2.2.7 (部署Rancher参考之前文章:离线安装 Rancher2.2.4 HA 集群

Jenkins 2.176.2 

 

二、部署 jenkins

在 rancher 中部署 jenkins 服务

2.1 创建 PVC

jenkins程序家目录PVC:pvc-jenkins-home
maven缓存PVC:pvc-jenkins-maven

2.2 工作负载

名称:jenkins-master
Docker镜像:jenkinsci/blueocean:latest
命名空间:jenkinsci
数据卷挂载:pvc(pvc-jenkins-home) -> 容器路径 /var/jenkins_home  -> 子路径 aliyun-jenkins(pvc中的目录)

说明:因为我是把原来 jenkins 迁移到了pvc中,所以有子路径,新部署的话不用子路径。

2.3 负载均衡

名称:jenkins-master
主机名:jenkins.wmq.com
服务:jenkins-master
容器端口:8080

2.4 域名解析

jenkins.wmq.com 解析到 ingress lb 的 ip 地址

 

三、配置jenkins

3.1 安装插件

系统管理 -> 插件管理

Kubernetes    
Kubernetes Cli

3.2 系统设置

3.2.1 系统设置

执行者数量:0
新增一个云:Kubernetes

3.2.2 配置kubernetes云

名称:kubernetes
Kubernetes 地址:https://kubernetes.default
Kubernetes 命名空间:jenkinsci
凭据:cicd集群账号 
Jenkins 地址:http://jenkins-master:8080
Pod Labels:键:jenkins,值:slave
Pod Retention:Never
Seconds to wait for pod to be running:600
默认提供的模板名称:jenkins-slave

凭据说明:类型:Secret text,Secret:rancher的cicd集群中的配置文件中的token,ID:cicd,描述:cicd集群账号

3.2.3 配置Kubernetes Pod Template

名称:jenkins-slave
标签列表:jenkins-slave
用法:尽可能的使用这个节点

3.2.4 配置Container Template

1)jnlp

名称:jnlp       //不能改名
Docker 镜像:reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5
工作目录:/home/jenkins/agent
运行的命令:空
命令参数:${computer.jnlpmac} ${computer.name}
EnvVars:Environment Variable (键:JENKINS_URL,值:http://jenkins-master.jenkinsci.svc.cluster.local:8080)

2)docker

名称:docker
Docker 镜像:reg.nexus.wmq.com/tools/docker-dind-daemon
工作目录:/home/jenkins/agent
运行的命令:空
命令参数:空
高级选项:勾选以最高权限运行    //docker in docker 一定要最高权限

3.2.5  配置挂载卷

1)挂载空目录,让jnlp和docker两个容器共享/var/run目录,这样jnlp容器可以使用docker.sock文件操作docker容器

类型:Empty Dir Volume
挂载路径:/var/run

2)挂载pvc,提供maven容器的缓存(maven容器在Jenkinsfile中指定)

类型:Persistent Volume Claim
申明值:pvc-jenkins-maven
挂载路径:/opt/data/aliyun-jenkins-maven

3.2.6 其他配置

Pod Retention:Never
代理的空闲存活时间(分):10080  //一周
连接 Jenkins 的超时时间(秒):100
Show raw yaml in console:不勾选

说明:代理存活时间为一周,因为每次agent启动需要花费一定时间等待,为了减少等待时间,增加agent存活时间,不会立马自动销毁。

 

四、docker镜像制作

上面配置Container Template用到了jnlp、docker镜像都是含有定制的工具。

4.1 jnlp镜像

给jnlp镜像添加docker、kubectl两个命令,Dockerfile内容如下:

FROM jenkins/jnlp-slave
ENV KUBECTL_VERSION=v1.14.5
USER root
RUN echo "deb http://mirrors.163.com/debian/ stretch main" > /etc/apt/sources.list &&     echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list &&     echo "deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list
RUN apt-get update &&     apt-get -y install apt-transport-https ca-certificates curl software-properties-common &&     curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" &&     apt-get -y update &&     apt-get -y install docker-ce
RUN curl -L https://www.cnrancher.com/download/kubernetes/linux-amd64-${KUBECTL_VERSION}-kubectl -o /usr/local/bin/kubectl \
    && chmod +x /usr/local/bin/kubectl

说明:jnlp-slave 是基于 debian 系统,先更换安装源,然后安装 docker。kubectl 是用 rancher 提供的下载链接。

上传镜像到私有仓库:

docker build -t jnlp-:v1.14.5 .
docker tag jnlp-:v1.14.5 reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5
docker push reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5

4.2 docker镜像

因采用 docker in docker 镜像,需要更换默认的镜像仓库,换成私有仓库,构建会把镜像缓存到私有仓库,要不然每次构建都从新下载镜像会很慢;后续 jenkinsfile 中定义的容器都运行该 docker 中,Dockerfile 内容如下:

FROM docker:dind
USER root
RUN mkdir /etc/docker
ADD daemon.json /etc/docker/daemon.json

挂载的daemon.json内容如下:

{
"registry-mirrors": ["https://mirror.nexus.wmq.com"],
"max-concurrent-downloads": 5,
"max-concurrent-uploads": 5,
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
    "max-size": "100m",
    "max-file": "3"
    }
}

上传镜像到仓库:

docker build -t docker:v1 .
docker tag docker:v1 reg.nexus.wmq.com/tools/docker-dind-daemon
docker push reg.nexus.wmq.com/tools/docker-dind-daemon

 

五、Jenkinsfile 文件

Jenkinsfile模板如下:

pipeline {
  agent none
  stages {
    stage(setting env) {
      agent any
      steps {
        script {
          env.IMAGE_TAG = "build-$env.BRANCH_NAME-$BUILD_NUMBER".replaceAll("/", "_")
        }
      }
    }
    stage(package) {
      agent {
        docker {
          image maven:3.6-alpine
          args -v /opt/data/aliyun-jenkins-maven:/root/.m2
        }
      }
      steps {
        sh mvn package
        stash(name: copy jar, includes: target/*.jar)
      }
    }
    stage(docker build) {
      agent any
      steps {
        unstash copy jar
        script {
          def image = docker.build("reg.nexus.wmqhealth.com/tools/cicd-test:" + "$IMAGE_TAG", ".")
          withDockerRegistry([credentialsId:docker-registry, url:"https://reg.nexus.wmqhealth.com"]){
            image.push()
          }
        }
      }
    }
    stage(deploy) {
      parallel {
        stage(prod) {
          agent any
          when {
            branch master
          }
          steps {
            withKubeConfig(clusterName: cicd, contextName: cicd, credentialsId: kube, namespace: jenkinsci, serverUrl: https://rancher.wmq.com/k8s/clusters/c-b5g7r) {
              sh kubectl set image deployment/cicd-test cicd-test=reg.nexus.wmq.com/tools/cicd-test:$IMAGE_TAG --namespace jenkinsci
            }
          }
        }
        stage(dev) {
          agent any
          when {
            not {
              branch master
            }

          }
          steps {
            sh echo "dev"
          }
        }
      }
    }
  }
  options {
    buildDiscarder(logRotator(numToKeepStr: 5, artifactNumToKeepStr: 5))
  }
}

说明:

env.IMAGE_TAG:定义的是环境变量,全局可调用,需放置在前面

withKubeConfig:需要安装 Kubernetes Cil 插件,可以操作kubernetes

buildDiscarder:构建历史保留次数

 

Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)

标签:空间   include   ldd   running   tag   kubectl   定制   roo   lis   

原文地址:https://www.cnblogs.com/weavepub/p/11399012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!