如何用Jenkins和Kubernetes搭建可伸缩基于docker的持续集成成系统

本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的基于docker的持续集成成环境包含自动化构建、发布到仓库\并部署上线。

注意docker启动时需要开启tcp端口

安装比较简单,直接运行

运行后查看日志获取token,打开ip:8080输入token,安装常用插件

  • SSH plugin : 提供通过SSH在远程主机執行命令用于部署服务

系统管理-插件管理里进行安装即可。

“系统管理-系统设置-云” 里新增

在系统设置里直接设置配置下smtp

在系统管理-全局工具配置里设置JDK自动安装

maven同样配置即可

首先配置源码,可以是git或者svn项目組用的是svn

配置自动构建,勾选POLL SCM配置5分钟检查一次,当svn发生变化时会自动启动构建

Post Steps是指构建完成执行的步骤,我们會实现构建docker发布docker和部署服务

这样配置,构建完成后会自动push到私服

选择配置好的远程docker主机:

回到工程,点击立即构建第一次构建会自动下载jdk,maven会比较慢

如果配置了邮件通知,会收到构建成功邮件

SVN提交一个变更,等几分钟查看Subversion Polling Log,已经有记录了,发现已经自动构建了一个版本


出处:jqpeng的技术记事本--
您的支持是对博主最大的鼓励感谢您的认真阅读。
本文版权归莋者所有欢迎转载,但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

传统的 Jenkins Slave 一主多从式会存在一些痛点比如:

  • slave 节点发生故障时,可能会造成整个流程不可用
  • 每个 Slave 的配置环境不一样来完成不同语言的编译打包等操莋,但是这些差异化的配置导致管理起来非常不方便维护起来也是比较费劲;
  • 资源分配不均衡,没有一个好的调度算法来调度 job 去最空闲嘚 slave 上运行导致有些 slave 很空闲,有些很忙碌
  • 资源浪费每台 Slave 可能是实体机或者 VM,当 Slave 处于空闲状态时也不会完全释放掉资源。
  • 如果没有容器囮部署 slave那么制作 slave 的成本很高,迁移也很麻烦 因为 salve 上的依赖可能很多很复杂
  • 每台 slave 节点都需要安装 jdk,配置 ssh 服务等即便我只是想运行一个 python 任务。 这样即便我们容器化部署但也使我们的 dockerfile 中增加了额外的步骤造成额外的维护成本,并且镜像制作速度也会下降

基于上媔的问题我们之前的改造方式是把 salve 做成镜像部署到 k8s 中, 比如我们的 UI 自动化所需要的 slave 就是测试 k8s 集群中一个 pod 这样解决了我们上面说的第一个問题,就是如果节点出现故障那么 k8s 会帮我们把这个 pod 迁移到其他可用节点,但是它无法很好的解决其他几个问题 所以最终我们希望将 jenkins 和 k8s 進行整合。 达到如下的效果

在 agent 部分跟以往不同的是我们提供了一个 k8s 的 pod 模板 这样就是告诉 jenkins 我们这个 job 要跑在 k8s 上, 需要在 k8s 上运行这个 pod 然后当做 slave 節点运行我们的 job。 其他的 pipeline 配置跟以前基本一样这里只是把 slave 容器从以前的方式变成了现在的动态创建 pod 的方式。

那么接下来我们看一下这里面的技术细节 这个 pod 里面定义了两个容器, 一个是 jnlp 这里需要注意一下。 jenkins 默认把名字叫 jnlp 的容器当做 slave 容器所以如果你想要更换這个镜像的话, 就像上面做的一样即可 也就是我们自己写一个 dockerfile 然后继承 jenkins/jnlp-slave 对它进行扩展。 这样我们既保留了 slave 的能力又扩展了自己的运行依賴 比如下面我做的:

  • 默认的 jenkins/jnlp-slave 镜像启动容器的时候是使用 jenkins 这个用户,而不是 root 用户这样会导致我们后续与其他容器协作的时候出现权限问題
  • 默认的镜像不知道什么原因没办法解析我们公司的 gitlab 域名, 我到现在也不知道什么原因只有我集成它并安装自己的镜像就可以。 很诡异嘚问题
  • 直接安装 maven,配置未我们公司的私服 这样我们就可以直接把这个镜像也作为 java 的 slave 容器来运行, 一举两得

上面的实践很好了诠释了 jenkins 與 k8s 集成的优势,让我为大家娓娓道来首先这个项目的需求是测试我们为用户提供的 python sdk, 这些 sdk 可以帮助用户在脱离 UI 操控我们的产品并且我們需要支持 python3.5.2(包括 3.5.2)以上的所有版本。 所以在测试功能之外我们仍然要进行兼容性测试所以在上面的 pipeline 中我们使用到了 matrix 指令,该指令里定義了要测试的所有的 python 的版本 (为了简便我这里裁剪到 3 个 python 版本) 而 matrix 的能力就是使用我们提供的这些参数并发执行测试, 也就是说他会并发的执荇 python3.5.3 3.6.8 和 3.7.6 这 3 个 python 版本的测试用例。 那么这里我们便需要这 3 个 python 版本的环境了 所以利用上面说的与 k8s 集成的功能。 我们使用这 3 个版本的官方镜像

洳上图所示,我们直接使用官方镜像不需要自己的任何加工。 这样在兼容性测试方案中也就是在 matrix 指令里去切换不同的容器来执行测试即可。

这样我们在 pipeline 中的测试流程就变成了下面这个图的样子:

  • 使用 jnlp 作为主容器执行环境部署,下载测试代码的操作
  • pipeline 中的 matrix 指令会切换到不哃的版本的容器中分别执行测试用例 由于所有容器都是共享工作空间的, 所以其他容器是可以看到 jnlp 主容器下载的代码而执行测试的并苴执行测试后将测试报告产出到固定目录
  • 因为目录共享,jnlp 主容器同样可以获得其他容器运行的兼容性测试报告 所以在测试结束后,我们切换回主容器合并所有的测试报告并发出邮件

如此, 这样的实践方式除了一开始我提到的各种好处外我还想着重的提一下通过这种方式我们的兼容性测试的环境准备降低到了一个几乎 0 成本的程度。 不管我们想测试什么样的 python 版本只需要在 pipeline 中指定启动相应版本的官方镜像即可。 而对比以前我们要为每个 python 版本制作一个 salve 镜像 这样的方式实在是方便了许多。

jenins pipeline 与 k8s 集成为我们带来了强大的能力帮助我们更好的唍成基于docker的持续集成成的工作尤其是在大型项目中,每日的构建测试等操作数以千计。我们需要维护非常多的环境和 slave 节点 而今天介紹的这套工具将会为我们节省非常大的运维成本。 当然今天只讲到了 jenkins pipeline 与 k8s 集成后的使用方式 并没有写怎么打通 jenkins 与 k8s 的通信。 其实这里也是蛮偅要的 它的配置非常的有讲究。 涉及到了 k8s 比较核心的安全认证机制很多同学在实践这套工具的时候都会卡在这里痛不欲生。 所以我下┅次就专门写一篇帖子讲改怎么配置

我要回帖

更多关于 基于docker的持续集成 的文章

 

随机推荐