环境:centos7.6 、Docker version 19.03.5、Jenkins 2.249.3(jackson = 2.11.2、docker plugin = 1.2.1)
主要思想: 使用 docker plugin 配置一个动态的docker jenkins jnlp slave,该镜像中包含 mvn、git、docker、kubectl 等命令。创建多分支流水线,Jenkinsfile 使用前面配置好的 jenkins slave。在该 jenkins slave 中执行 maven 构建、docker build、jave 、kubectl apply 等操作。

1、配置动态 docker jenkins jnlp slave,参考 https://blog.csdn.net/Man_In_The_Night/article/details/111614431

2、创建 k8s 和 docker hub credential。参考 https://blog.csdn.net/Man_In_The_Night/article/details/111614431

3、创建一个 springboot java web 项目,见 github 项目 https://github.com/pretendhigh/javawebdemo
Jenkinsfile 如下:

node("mapleaves") {def APP_NAME = "javaWebDemo"def APP_PORT = "8081"def NODE_PORT_DEV = "30040"def NODE_PORT_PRO = "32040"def REPLICAS = "1"def cicd_admin = "mapleaves"def myRepo = checkout scmdef gitCommit = myRepo.GIT_COMMITdef gitBranch = myRepo.GIT_BRANCHdef imageTag = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()def imageEndpoint = "mapleaves/javawebdemo-${gitBranch}"def IMAGE = "${imageEndpoint}:${imageTag}"  if (gitBranch != 'dev' && gitBranch != 'master'){echo "${gitBranch} 分支不参与执行,开始退出,如有疑问,请联系运维人员 ${cicd_admin}"return     }    stage('SonarQube 代码检测') {echo "============================== 1.代码检测阶段 =============================="echo "branch name is ${gitBranch}"if (gitBranch == 'dev' ){echo "branch name is ${gitBranch}"// 此处可以调用 sonarqube,这里不展开,可以参考 jenkinsfile-demo} else {echo "${gitBranch} 分支不做代码检测,如有疑问,请联系运维人员 ${cicd_admin}"}}stage('代码编译打包') {echo "============================== 2.代码编译打包阶段 =============================="try {sh "ls"sh "ls target"sh "mvn clean package -s settings.xml -Dmaven.test.skip=true"sh "ls"sh "ls target"      } catch (exc) {println "构建失败 - ${currentBuild.fullDisplayName}"throw(exc)}}stage('构建 Docker 镜像') {echo "============================== 3.构建 Docker 镜像阶段  =============================="withCredentials([[$class: 'UsernamePasswordMultiBinding',credentialsId: 'mydockerhub',usernameVariable: 'dockerHubUser',passwordVariable: 'dockerHubPassword']]) {         // 此处可以使用 harbor,这里不展开,可以参考 jenkinsfile-demosh """sed -i 's/<APP_PORT>/${APP_PORT}/g' Dockerfiledocker login -u ${dockerHubUser} -p ${dockerHubPassword}docker build -t ${IMAGE} .docker push ${IMAGE}"""        }}stage('部署 recommend-system 到 infra-k8s') {echo "============================== 4.部署 recommend-system ${gitBranch} 分支到 infra-k8s =============================="if (gitBranch == 'master') {      input "确认要部署到生产环境吗?"NAMESPACE = "pro"NODE_PORT = "${NODE_PORT_PRO}"}if (gitBranch == 'dev') {NAMESPACE = "dev"NODE_PORT = "${NODE_PORT_DEV}"}    withKubeConfig([credentialsId: 'infra-k8s',contextName: 'kubernetes',]) {    sh """sed -i 's/<APP_NAME>/${APP_NAME}/g' k8s.yamlsed -i 's/<APP_PORT>/${APP_PORT}/g' k8s.yamlsed -i 's/<NODE_PORT>/${NODE_PORT}/g' k8s.yamlsed -i 's/<REPLICAS>/${REPLICAS}/g' k8s.yamlsed -i 's?<IMAGE>?${IMAGE}?g' k8s.yamlsed -i 's/<NAMESPACE>/${NAMESPACE}/g' k8s.yaml"""       sh "kubectl apply -f k8s.yaml --record"          }   }
}

Dockerfile 如下:

FROM openjdk:8-jdk-alpineENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV TZ=Asia/ShanghaiRUN mkdir /appWORKDIR /appCOPY target/javawebdemo-1.0-SNAPSHOT.jar  /app/javawebdemo.jarEXPOSE <APP_PORT>ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "--server.port=<APP_PORT>", "javawebdemo.jar"]

k8s.yaml 如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: <APP_NAME>namespace: <NAMESPACE>labels:app: <APP_NAME>
spec:replicas: <REPLICAS>strategy:rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdatetemplate:metadata:labels:app: <APP_NAME>spec:restartPolicy: AlwayshostAliases:- ip: "10.2.7.1"hostnames:- "kafka01"- ip: "10.2.7.9"hostnames:- "kafka02"containers:- image: <IMAGE>name: <APP_NAME>imagePullPolicy: IfNotPresentports:- containerPort: <APP_PORT>name: apiresources:limits:cpu: 800mmemory: 1200Mirequests:cpu: 50mmemory: 600Mi          ---kind: Service
apiVersion: v1
metadata:name: <APP_NAME>namespace: <NAMESPACE>
spec:selector:app: <APP_NAME>type:  NodePortports:- name: api-portport: 8080targetPort:  apinodePort: <NODE_PORT>

4、创建一个多分支流水线
设置 github 代码仓库 https://github.com/pretendhigh/javawebdemo (gitlab 仓库同理),如果是私有仓库,需要设置 github crendential,可以参考
https://docs.github.com/cn/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token
https://stackoverflow.com/questions/61105368/how-to-use-github-personal-access-token-in-jenkins
选择每 5 分钟扫描一次代码仓库
5、当有 github 仓库有代码更新或者点击“立即构建” 就可以执行流水线了。
推荐使用私有 gitlab 和 harbor 代替 github 和 docker hub,不然由于网络原因,容易 timeout。

jenkins cicd k8s 多分支流水线构建相关推荐

  1. helm部署jenkins到k8s并创建pipeline构建项目

    安装部署nfs 1. nfs服务器创建目录 [yeqiang@harbor ~]$ sudo mkdir /home/nfs/jenkins -p 2. 设置其他用户可以写入该目录 [yeqiang@ ...

  2. git如何切换分支_如何让 Jenkins 支持选择 git 分支进行构建

    Prerequisite 必须先在 Jenkins 上安装: Git Plugin Git Parameter Plugin 配置 如果没使用 Jenkins Pipeline 可以直接看 插件文档 ...

  3. Jenkins教程(6)构建多分支流水线项目

    本教程向你展示如何使用Jenkins协调一个用 Node Package Manager (npm) 管理的简单 Node.js 和 React 项目, 并同时 为开发和产品环境交付不同的结果. 在开 ...

  4. K8S搭建自动化部署环境(四)Jenkins多分支流水线Blue Ocean的安装和使用

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 K8S搭建自动化部署环境(三)Jenkins下载.安 ...

  5. 【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人

    目录 视频教程 需求说明 最终效果 实现过程 安装插件 编写shell 编写jenkinsfile 测试一下 视频教程 视频教程:https://edu.csdn.net/learn/38191/60 ...

  6. Jenkins 流水线 获取git 分支列表_使用Jenkins Git参数实现分支标签动态选择

    1.1 为什么要使用GIT参数? 我们为什么要使用 git参数呢? 每个项目代码库都会有不同的分支,(如果你没有用多分支流水线的情况下)对于普通的流水线项目我们可以 让一条流水线来支持多个分支的发布, ...

  7. 基于Jenkins和k8s构建企业级DevOps容器云平台

    1.1 什么是DevOps? DevOps中的Dev是Devlopment(开发),Ops是Operation(运维),用一句话来说 DevOps 就是打通开发运维的壁垒,实现开发运维一体化.DevO ...

  8. k8s上使用流水线部署应用

    k8s上使用流水线部署应用 1. 部署流程 为每一个项目准备一个Dockerfile:Docker按照这个Dockerfile将项目制作成镜像 为每一个项目生成k8s的部署描述文件 Jenkins编写 ...

  9. ios jenkins_如何使用Jenkins和Fastlane制作iOS点播构建系统

    ios jenkins by Agam Mahajan 通过Agam Mahajan 如何使用Jenkins和Fastlane制作iOS点播构建系统 (How to make an iOS on-de ...

最新文章

  1. 一个 SpringBoot 项目该包含哪些?
  2. 国内NLP竞赛平台一览(附平台连接)
  3. 24 个你应该了解的 PHP 库
  4. zoj(2110)Tempter of the Bone(DFS+奇偶剪枝)
  5. 【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )
  6. php获取用户的上5级用户
  7. 考试用计算机反思800字,考试反思作文800字
  8. 分析不同类型页面渲染过程
  9. php file_exists无效解决办法
  10. wordpress rest api 漏洞又来了CVE-2017-5487 上次是修改文章内容这次可是泄露用户数据...
  11. IIS 7 启用 gzip 静态压缩 压缩js和css文件
  12. C#_delegate EndInvoke
  13. 阿里云张献涛:公共云不断向外延伸,一云多态是未来趋势
  14. 如何设计一个网页版音乐播放器
  15. 计算机农林科学类sci期刊,农林科学类sci期刊有哪些
  16. WEX5导出excel
  17. Android 端发送邮件
  18. 创建列表、删除列表、查看列表长度、列表增加一个元素的几种方法
  19. js 数字转为罗马数字(互转换),I 、II 、 III 、IV、V
  20. [RK3588-Android12] Uboot-Logo引起的 HDMI第一次开机无声音问题

热门文章

  1. 帝国cms tag生成html,帝国CMS tags标签多种调用方法
  2. 解密Google Deepmind AlphaGo围棋算法:真人工智能来自于哪里?
  3. scotland yard
  4. 转:你不快乐是因为年少时得不到忘不了
  5. JS 去除Object中指定的key
  6. 第二章:Djgo后台管理
  7. 音视频开发-视频基础
  8. Qt添加.qrc文件和设置exe图标和控件图标
  9. python变量、类型及转换
  10. opencv cvRound函数cvClone