基于K8s的动态Jenkins Slave构建实践
前言
源于这篇文章分享的经验 基于 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构建实践相关推荐
- 动态jenkins slave
1.Jenkins CI/CD 背景介绍 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Sl ...
- 【TOTP】基于时间的动态密码及其工程实践
探究了常见的动态密码的实现方式及其底层原理,并基于java做出了工程实践. 文章目录 A.来源于一个现象的好奇 B.2FA C.TOTP 1.什么是TOTP 2.原理详解(基于java-totp项目分 ...
- 使用gradle-android搭建jenkins slave构建机器常见构建问题(一)
1.android根目录下local.properties 中配置的android sdk ## This file is automatically generated by Android Stu ...
- 使用gradle-android搭建jenkins slave构建机器常见构建问题(二)
Glib 库问题: AAPT err(Facade for 1580782395): /opt/CI/android-sdk-linux/build-tools/26.0.0/aapt: /lib64 ...
- 基于K8S构建企业级Jenkins CI/CD平台实战(二) 之 kubernetes-plugin 插件使用
1. 传统架构与K8S 架构的区别 (1). 传统Master/Slave架构,Master收到Job后,将请求转发到Slave节点处理.Slave节点数固定,Slave节点未能自动申缩容. (2). ...
- 基于K8S构建企业级Jenkins CI/CD平台实战(三) 之 带你实战Spring boot/Cloud 项目 CI/CD jenkins自动化构建、部署过程
需要环境 Git(GitLab) Harbor 私服 kubernetes-plugin 使用 Kubernetes jenkins 通过前面三篇我们已经了解了jenkins和 kubernetes- ...
- 基于K8S构建企业级Jenkins CI/CD平台实战(一) 之 环境搭建
一. 持续集成/部署/交付概述 持续集成(Continuous Integration,CI): 代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous ...
- 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)
写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...
- Jenkins+k8s部署Jenkins slave
一.构建镜像 下载基础镜像,这里使用openvz的包,下载centos7的镜像 1.1 下载镜像后导入到本地 JENKINS VERSION为: 2.222.4 ------------------- ...
最新文章
- PAT(甲级)2020年春季考试 7-4 Replacement Selection
- python大数据分析实例-如何用Python分析大数据(以Twitter数据挖掘为例)
- linux+geth+不能同步公链数据,以太坊(ETH)同步公链数据
- Android开发之activity跳转页面失败的问题
- jzoj1282-资源勘探【统计】
- 【Java学习笔记七】常用数据对象之数组
- Javaweb经典三层架构的演变
- c语言中的运算符及其含义_按位运算符及其在C语言中与Example一起使用
- 余额宝收益冻结是什么意思?
- 如何给单词快速加双引号
- 转 OUI and OPatch Do Not Recognize JDK/JRE on Windows
- Android中应用锁的实现之账号盗取
- BFS+模拟 ZOJ 3865 Superbot
- 全面接触PDF:最好用的PDF软件汇总
- Ubuntu下全命令行部署Android模拟器
- 税收学考试可以带计算机吗,税务师考试能带计算器和草纸吗?简答题需要用笔吗?...
- vue获取当前时间、时间戳方法
- linux为用户指定资源大小,Linux_Linux系统下生成一个指定大小的文件,在装系统,因此在这里随便记 - phpStudy...
- torch.meshgrid()函数解析
- Python 错题本