目的
本文在k8s集群中把各种工具(jdk,git, maven等)集成到jenkins,用master/slave模式实现CI/CD。
环境
k8s集群 参考教程
Hubor镜像服务 参考教程
nfs/Ceph持久存储 参考教程
M/S模式实现
创建Master镜像文件
1 | #编写Dockerfile: |
构建Master镜像
1 | docker build -t jenkinsci/jenkins:v1 /home/jenkins-dockerfile/ |
启动YAML配置文件
1 | #jenkins命令空间创建 |
启动Jenkins Master容器
1 | kubectl create -f namespace-jenkins.yaml |
创建Jenkins slave镜像文件
1 | #需要使用官方镜像cnych-jenkins,其他的镜像里面都没有kubectl工具,都试过。 |
构建Slave镜像
1 | docker build -t cnych/jenkins:v1 /home/jenkins-dockerfile/ |
查看镜像列表
1 | docker images |
浏览器访问
1 | #访问jenkins |
页面配置master
升级和重置密码
1 | #然后会要求安装一些插件,这里选择默认安装即可,否则下一步打开是空白页 |
安装插件
1 | #Kubernetes Cli Plugin:该插件可直接在Jenkins中使用kubernetes命令行进行操作。 |
增加一个kubernetes云
1 | #系统管理->系统设置,往下拉可看到云,点击新增一个云来新增一个kubernetes云 |
配置K8s Pod Template
其实就是配置Jenkins的jnlp-slave
在该kubernetes云下,新增Kubernetes Pod Template,配置一个模板容器配置,如下图所示:
配置镜像,下面里面的镜像一定要写对,否则写成别的镜像,到最后编译时候就一直报错没有mvn
配置卷:就是deployment.yaml 里面的挂载路径
全局配置
点击 系统管理->全局工具配置,此处可配置配置一些常用的工具配置,比如java、ant、maven、docker
创建流水线任务项目
新建任务项目
点击新建Item –> 进入任务配置界面–>选择Pipeline(中文版为:流水线)–>确定。则可编写Pipeline,进行任务配置
1 | #Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。 |
构建
1 | #查看构建前的pod个数 |
页面点击立即构建
1 | #查看构建时的pod数量 |
使用宿主机的kubectl命令
镜像选择
slave镜像需要使用cnych/jenkins:jnlp,这个官方镜像里面有kubectl工具,其他的没有,都试过,上面就是用的这个镜像,所以直接下一步
挂载kubectl工具
/root/.kube 目录,我们将这个目录挂载到容器的 /home/jenkins/.kube 目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。添加一个挂在路径,如下图所示:
pipline脚本
先试试是否能使用宿主机的kubectl命令,只查看一个pod情况:
1 | def label = "jnlp-slave" |
构建,查看控制台输出
使用jenkins-salve创建nignx项目
pipline脚本
1 | def label = "jnlp-slave" |
开始构建
查看命名空间下的pod验证
1 | #多次执行下面命令,对比输出结果 |
测试访问nginx
浏览器访问http://x.x.x.x:31000
编写pipline脚本
1 | #注意下面pipline脚本里面的 maven build步骤,里面的JAVA_HOME和mvn工具 都是jenkins-slave里面的,而不是jenkins-master里面的工具, |
查看harbor仓库
补充
生成自定义Jenkins master镜像
Dockerfile:
1 | FROM 192.168.1.184:5000/jenkins/jenkins:2.89.3 |
该Dockerfile所做的工作为:
- 重新安装Java环境并配置环境变量;
- 安装Maven并配置环境变量;
- 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库;
- 设置启动用户为root。
生成自定义Jenkins slave镜像
Dockerfile:
1 | FROM jenkinsci/jnlp-slave:latest |
该Dockerfile操作与Jenkins master的Dockerfile基本一致。不过该镜像中缺少libltdl.so.7文件,需要从宿主机中拷贝进去,该文件在slave节点容器中使用docker时会用到,因此十分重要