前言

源于这篇文章分享的经验 基于 Kubernetes 的 Jenkins 构建集群实践,这里记录一下实践落地过程。

环境

这里Jenkins Master的安装没有采用容器镜像的方式,直接就是rpm包安装。
版本信息:
Jenkins 2.107.1
Kubernetes plugin 1.4
kubernetes集群 1.5.2

这里就不详细说明安装过程了。

配置

环境都安装好后,配置Jenkins,进入系统管理—>系统设置—>云
新增一个云Kubernetes,配置如下:

配置比较简单,这里也没有采用自定义的slave模板,默认Jenkins使用的是jenkins/jnlp-slave:alpine镜像作为动态的运行的slave。
其中Kubernetes URL也可以通过命令查看:
# kubectl cluster-info
Kubernetes master 所在的地址即可,比如:

Kubernetes master is running at https://10.1.241.82:8080/r/projects/1a7/kubernetes:6443

这里的URL就填 https://10.1.241.82:8080/r/projects/1a7/kubernetes:6443

测试

这里测试全部使用pipeline进行构建。
新建一个Pipeline流水线项目,配置Pipeline运行脚本:

脚本内容:

podTemplate(label: 'mypod', cloud: 'kubernetes')
{node ('mypod') {stage('test') {echo "hello, world"sleep 60}}
}

label:Jenkins执行的节点标签,可以随意起;
cloud:就是我们上面配置云的名字标识;
node:执行构建任务的slave节点,需要跟上面的label一致

非常简单的一个测试用例,让我们来跑一下看看。
首先看一下构建执行状态:

可以看到Jenkins自动创建了一个Slave节点在执行我们的构建任务,
我们再通过k8s看下执行的pod情况:

# kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
jenkins-slave-5d8m2-jzxk7   1/1       Running   0          38s# kubectl describe pod jenkins-slave-5d8m2-jzxk7
。。。
Events:FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason          Message---------     --------        -----   ----                    -------------           --------        ------          -------46s           46s             1       {default-scheduler }                            Normal          Scheduled       Successfully assigned jenkins-slave-5d8m2-jzxk7 to master44s           44s             1       {kubelet master}        spec.containers{jnlp}   Normal          Pulled          Container image "jenkins/jnlp-slave:alpine" already present on machine44s           44s             1       {kubelet master}        spec.containers{jnlp}   Normal          Created         Created container with docker id 7cbdbd4ea859; Security:[seccomp=unconfined]44s           44s             1       {kubelet master}        spec.containers{jnlp}   Normal          Started         Started container with docker id 7cbdbd4ea859

通过上面的k8s的pod信息我们可以看到,pod名字就是Jenkins slave节点的名字。通过READY字段,我们也能发现pod中只有一个容器在跑,最后看下详细信息,发现k8s确实是去拉取jenkins/jnlp-slave:alpine 镜像了。

这里再贴一下Jenkins的控制台打印信息:

项目实践

真正的项目中实践肯定不是这么简单的,我们这里就以一个简单maven构建项目为例。
步骤如下:

  • 制作maven镜像,设置maven仓库私服mirror,添加ssh-key方便无密码拉取仓库代码
  • 编写Jenkinsfile,配置构建流程
  • 执行构建

制作maven镜像

FROM maven:latestADD settings.xml /root/.m2/RUN mkdir /root/.ssh/ADD .ssh /root/.ssh/RUN chmod 600 /root/.ssh/id_rsa

其中settings.xml包含了maven仓库私服mirror、sonarqube等等一些maven相关的配置,
这里需要注意的是ssh的私钥权限必须是600的,这个是配置无密码从gitlab仓库拉取源码的。
通过Dockerfile来制作我们自己的maven镜像:
docker build . -t e5:8889/maven:1.0

上传到我们私服仓库:
docker push e5:8889/maven:1.0

编写Jenkinsfile

Jenkinsfile是jenkins pipeline构建的一种脚本,其中定义了构建流程。

podTemplate(label: 'mypod', cloud: 'kubernetes', containers: [containerTemplate(name: 'maven',image: 'e5:8889/maven:1.0',ttyEnabled: true,command: 'cat')
])
{node ('mypod') {container('maven') {git url: 'git@192.168.1.2:maven/springboot-archetype.git', credentialsId: '6033483b-5125-4ce1-941d-83b23ae64ba6'stage('create-archetype') {sh 'mvn archetype:create-from-project'}stage('update-local-catalog') {sh 'cd target/generated-sources/archetype'sh 'mvn clean install'sh 'mvn archetype:update-local-catalog'}stage('deploy') {sh 'mvn deploy'}stage('build-tag') {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()echo build_tag}}}
}

我们通过containers.containerTemplate指定了我们代码是在哪个容器内进行构建的,其他的就都是一些简单的构建流程,这里就不细说了。

执行构建

我们最后再执行一次构建,看下Jenkins和k8s一些运行情况。
Jenkins Console控制台打印:

K8s的pod信息:

# kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
jenkins-slave-wm980-2v01l   2/2       Running   0          5s

通过READY字段,发现这时pod运行的就有2个容器了,我们可以猜测一个是slave容器,一个是我们自定义的maven容器。
再来看下pod创建的详细信息:

# kubectl describe pod jenkins-slave-wm980-2v01l
Events:FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason          Message---------     --------        -----   ----                    -------------           --------        ------          -------17s           17s             1       {default-scheduler }                            Normal          Scheduled       Successfully assigned jenkins-slave-wm980-2v01l to master15s           15s             1       {kubelet master}        spec.containers{maven}  Normal          Pulled          Container image "e5:8889/maven:1.0" already present on machine15s           15s             1       {kubelet master}        spec.containers{maven}  Normal          Created         Created container with docker id 85c8547aa047; Security:[seccomp=unconfined]15s           15s             1       {kubelet master}        spec.containers{maven}  Normal          Started         Started container with docker id 85c8547aa04715s           15s             1       {kubelet master}        spec.containers{jnlp}   Normal          Pulled          Container image "jenkins/jnlp-slave:alpine" already present on machine15s           15s             1       {kubelet master}        spec.containers{jnlp}   Normal          Created         Created container with docker id c10cc2694b05; Security:[seccomp=unconfined]14s           14s             1       {kubelet master}        spec.containers{jnlp}   Normal          Started         Started container with docker id c10cc2694b05

通过这行信息:"e5:8889/maven:1.0" already present on machine
我们发现果然有使用到自己的maven镜像了。

结语

其实真正实践起来还是会发现很多坑的,之前网上搜到很多教程都还需要自定义slave镜像亦或者将Jenkins Master节点也作为容器放入k8s中,但是感觉一来麻烦,二来也没太大必要就没弄了。其实后面更关键是在应用的部署上面,这里只是将构建工具链都准备好,提供一个应用干净的构建环境。

写完之后还发现有许多可以优化的地方,比如maven本地缓存仓库的挂载等等。。

Kubernetes plugin的文档:https://jenkins.io/doc/pipeline/steps/kubernetes/
https://github.com/jenkinsci/kubernetes-plugin/blob/master/README.md

基于K8s的动态Jenkins Slave构建实践相关推荐

  1. 动态jenkins slave

    1.Jenkins CI/CD 背景介绍 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Sl ...

  2. 【TOTP】基于时间的动态密码及其工程实践

    探究了常见的动态密码的实现方式及其底层原理,并基于java做出了工程实践. 文章目录 A.来源于一个现象的好奇 B.2FA C.TOTP 1.什么是TOTP 2.原理详解(基于java-totp项目分 ...

  3. 使用gradle-android搭建jenkins slave构建机器常见构建问题(一)

    1.android根目录下local.properties 中配置的android sdk ## This file is automatically generated by Android Stu ...

  4. 使用gradle-android搭建jenkins slave构建机器常见构建问题(二)

    Glib 库问题: AAPT err(Facade for 1580782395): /opt/CI/android-sdk-linux/build-tools/26.0.0/aapt: /lib64 ...

  5. 基于K8S构建企业级Jenkins CI/CD平台实战(二) 之 kubernetes-plugin 插件使用

    1. 传统架构与K8S 架构的区别 (1). 传统Master/Slave架构,Master收到Job后,将请求转发到Slave节点处理.Slave节点数固定,Slave节点未能自动申缩容. (2). ...

  6. 基于K8S构建企业级Jenkins CI/CD平台实战(三) 之 带你实战Spring boot/Cloud 项目 CI/CD jenkins自动化构建、部署过程

    需要环境 Git(GitLab) Harbor 私服 kubernetes-plugin 使用 Kubernetes jenkins 通过前面三篇我们已经了解了jenkins和 kubernetes- ...

  7. 基于K8S构建企业级Jenkins CI/CD平台实战(一) 之 环境搭建

    一. 持续集成/部署/交付概述 持续集成(Continuous Integration,CI): 代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous ...

  8. 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...

  9. Jenkins+k8s部署Jenkins slave

    一.构建镜像 下载基础镜像,这里使用openvz的包,下载centos7的镜像 1.1 下载镜像后导入到本地 JENKINS VERSION为: 2.222.4 ------------------- ...

最新文章

  1. PAT(甲级)2020年春季考试 7-4 Replacement Selection
  2. python大数据分析实例-如何用Python分析大数据(以Twitter数据挖掘为例)
  3. linux+geth+不能同步公链数据,以太坊(ETH)同步公链数据
  4. Android开发之activity跳转页面失败的问题
  5. jzoj1282-资源勘探【统计】
  6. 【Java学习笔记七】常用数据对象之数组
  7. Javaweb经典三层架构的演变
  8. c语言中的运算符及其含义_按位运算符及其在C语言中与Example一起使用
  9. 余额宝收益冻结是什么意思?
  10. 如何给单词快速加双引号
  11. 转 OUI and OPatch Do Not Recognize JDK/JRE on Windows
  12. Android中应用锁的实现之账号盗取
  13. BFS+模拟 ZOJ 3865 Superbot
  14. 全面接触PDF:最好用的PDF软件汇总
  15. Ubuntu下全命令行部署Android模拟器
  16. 税收学考试可以带计算机吗,税务师考试能带计算器和草纸吗?简答题需要用笔吗?...
  17. vue获取当前时间、时间戳方法
  18. linux为用户指定资源大小,Linux_Linux系统下生成一个指定大小的文件,在装系统,因此在这里随便记 - phpStudy...
  19. torch.meshgrid()函数解析
  20. Python 错题本

热门文章

  1. 【2022年终总结】总结自己的2022,展望2023
  2. 夜已微凉----爱、未央
  3. 【山景BP1048使用记录】
  4. vlookup中lookup_value是公式可以吗?
  5. android实现猜扑克牌小游戏(改进:每次只可以选择一张)
  6. SimCSE详解,Simple Contrastive Learning of Sentence Embeddings
  7. 得此触控板,一览众山小!
  8. 不积跬步,无以致千里
  9. 丈夫志四海,万里犹比邻
  10. php云系统清除版权,PHP云人才系统 PHPYun任意文件删除