一、说明

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

工作负载 -> PVC

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

2.2 配置映射

资源 -> 配置映射

名称:jenkins-master

键:JAVA_OPTS

值:
-Dhudson.slaves.NodeProvisioner.initialDelay=
-Dhudson.slaves.NodeProvisioner.MARGIN=
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
-Duser.timezone=Asia/Shanghai

作为环境变量传进jenkins,前三个值定义的是slaves生成等待时间(https://github.com/jenkinsci/kubernetes-plugin/blob/master/README_zh.md),最后一个值是jenkins的时区。

2.3 工作负载

工作负载 -> 部署服务

名称:jenkins-master
Docker镜像:jenkinsci/blueocean:latest
命名空间:jenkinsci
环境变量:类型:Config Map,源:jenkins-master,值:All
数据卷挂载:pvc(pvc-jenkins-home) -> 容器路径 /var/jenkins_home -> 子路径 aliyun-jenkins(pvc中的目录)

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

2.4 负载均衡

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

2.5 域名解析

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

三、配置jenkins

3.1 安装插件

系统管理 -> 插件管理

Kubernetes
Kubernetes Cli

3.2 系统设置

3.2.1 系统设置

执行者数量:
新增一个云: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:
默认提供的模板名称: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
代理的空闲存活时间(分): //一周
连接 Jenkins 的超时时间(秒):
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 中。

1)需要更换默认的镜像仓库,换成私有仓库,构建会把镜像缓存到私有仓库,要不然每次构建都从新下载镜像会很慢;

2)添加 crond 命令到启动项,并每天定时任务清理镜像垃圾。

Dockerfile 内容如下:

FROM docker:dind
USER root
RUN mkdir /etc/docker
ADD daemon.json /etc/docker/daemon.json
RUN sed -i "2a crond" /usr/local/bin/dockerd-entrypoint.sh
RUN crontab -l > crontab_list
RUN echo '0 3 * * * docker image prune -a -f --filter "until=24h" > /var/log/crontab.log 2>&1' >> crontab_list
RUN crontab crontab_list

挂载的daemon.json内容如下:

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

上传镜像到仓库:

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
options {
skipDefaultCheckout(true)
}
steps {
script {
env.NAMESPACE = "jenkins-test"
env.PROJECT_NAME = "jenkins-test"
env.IMAGE_NAME = "reg.nexus.wmqhealth.com/$NAMESPACE/$PROJECT_NAME/$BRANCH_NAME:build-$BUILD_NUMBER"
}
}
}
stage('package') {
agent {
docker {
alwaysPull false
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("$IMAGE_NAME", ".")
withDockerRegistry([credentialsId:'docker-registry', url:"https://reg.wmq.com"]){
image.push()
}
}
}
}
stage('deploy') {
parallel {
stage('prod') {
agent any
options {
skipDefaultCheckout(true)
}
when {
branch 'master'
}
steps {
withKubeConfig(clusterName: 'production', contextName: 'production', credentialsId: 'kube-prod', namespace: '$NAMESPACE', serverUrl: 'https://rancher.wmq.com/k8s/clusters/c-x497w') {
sh 'kubectl set image deployment/$PROJECT_NAME $PROJECT_NAME=$IMAGE_NAME --namespace $NAMESPACE'
}
}
}
stage('dev') {
agent any
options {
skipDefaultCheckout(true)
}
when {
not {
branch 'master'
}
}
steps {
withKubeConfig(clusterName: 'develop', contextName: 'develop', credentialsId: 'kube-dev', namespace: '$NAMESPACE', serverUrl: 'https://rancher.wmq.com/k8s/clusters/c-xg99q') {
sh 'kubectl set image deployment/$PROJECT_NAME $PROJECT_NAME=$IMAGE_NAME --namespace $NAMESPACE'
}
}
}
}
}
}
options {
buildDiscarder(logRotator(numToKeepStr: '', artifactNumToKeepStr: ''))
}
}

说明:

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

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

buildDiscarder:构建历史保留次数

Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)的更多相关文章

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

    一.说明 1)需求: Rancher 上部署 Jenkins-master,服务采用 Jenkins-slave 发布,发布完成后 Jenkins-slave 自动销毁. 2)环境: Rancher ...

  2. CI/CD自动化发版系统设计简介

    转载自:https://www.cnblogs.com/wellful/archive/2004/01/13/10604151.html 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不 ...

  3. Jenkins CI&CD 自动化发布项目实战(下篇)

    Jenkins CI&CD 自动化发布项目实战(下篇) 作者 刘畅 时间 2020-12-04 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

  4. Jenkins CI&CD 自动化发布项目实战(上篇)

    Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

  5. Jenkins+GitLab+SonnarQube搭建CI/CD全流程

    1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...

  6. GitLab CI/CD 自动化部署入门

    前言:因为找了B站内推,测试开发,正好知道内部使用GitLab做自动化测试,所以简单学了一下,有错误的地方请指正. 入门 初始化 cp: 无法获取'/root/node-v12.9.0-linux-x ...

  7. 一种使用gitlab的CI/CD功能实现Nginx配置更新的方法

    至于nginx的docker制作,前面已介绍过. 现在使用gitlab在线编辑的方式,可实现Nginx的自定义配置并更新. .gitlab-ci.yml内容如下: variables: project ...

  8. 【Devops】【docker】【CI/CD】2.docker启动jenkins环境+安装必要的插件

    [注意:]jenkins的docker镜像,需要从官网进入直接获取,其他地方获取到的docker镜像,可能因为Jenkins版本过低,导致后续插件安装失败等问题!!! ================ ...

  9. 基于Django+celery二次开发动态配置定时任务 ( 二)

    一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...

随机推荐

  1. python跳出多循环

    参考https://www.php.cn/python-tutorials-88895.html 备注 Python的循环体自己就有else分支! 如果for循环没有执行break,则执行else,f ...

  2. 2019 蓝鲸人java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.蓝鲸人等公司offer,岗位是Java后端开发,因为发展原因最终选择去了蓝鲸人,入职一年时间了,也成为了面试官 ...

  3. win10安装MySQL5.6.

    我分了两种下载安装的方式给大家看,注意数据库这个东西不在乎版本是不是最新,在乎的是够稳定,现在公司中常用的是mysql5.5和mysql5.6的版本,我现在就用mysql5.6的版本给大家来演示一下: ...

  4. leetcode5086:smallest-subsequence-of-distinct-characters

    leetcode5086 问题描述 给定一个字符串s,其中只包含小写字母.求s的一个子序列t.要求t包含s中的全部字符.如果答案有多个,输出字典序最小的那个子序列. 解法描述 首先,为s中每个字符打标 ...

  5. Gin-Go学习笔记六:Gin-Web框架 Api的编写

    Api编写 1>     Gin框架的Api返回的数据格式有json,xml,yaml这三种格式.其中yaml这种格式是一种特殊的数据格式.(本人暂时没有实现获取节点值得操作) 2>    ...

  6. Quality Center安装步骤

     测试管理工具 u 安装条件: Quality Center:QC9中文版 数据库:Oracle10 g 操作系统:Windows XP u 安装步骤: 1. 点击setup.exe,出现如下界面,点 ...

  7. pytorch报错:ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1,512,1,1])

    1.pytorch报错:ValueError: Expected more than 1 value per channel when training, got input size torch.S ...

  8. istio部署-helm

    参考 istio/istio istio/Kubernetes Customizable Install with Helm Istio安装参数介绍 1. Istio Chart 目录结构 PATH: ...

  9. IDEA中如何导入一个maven项目并配置相关设置

    导入一个maven项目参照如下链接 https://jingyan.baidu.com/article/b0b63dbf0c0ac04a49307078.html 要想启动这个导入的项目目前我所接触到 ...

  10. django model content_type 使用

    一.关于content_type 使用 1.引入模块在models from django.db import models from django.contrib.contenttypes.mode ...