前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程

1、从gitlab上拉取代码步骤

  • 在jenkins中,新建一个凭证;Manage Jenkins -> Manage Credentials

  • 点击jenkins -> 全局凭据 -> 添加凭据;选择用户名和密码类型,输入用户名和密码,点击创建

  • 编写pipeline script脚本,拉取代码

  • 选择git代码仓库还有凭证等信息,点击“生成流水线脚本”,即帮我们生成了拉取代码的脚本

  • 复制脚本,粘贴到流水线拷贝代码段中

  • 运行构建项目,发现拉取代码成功,且已返回代码最后提交的tag

    代码块:

      stage('Clone') {
    echo "1.Clone Stage"
    git url: "https://gitee.com/xujk-27400861/springboot-dubbo.git"
    script {
    build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
    }
    echo "${build_tag}"
    }

2、maven构建springboot代码项目

  • 编写脚本,因为我们要编译构建项目的子项目,所以需要跳转到子目录去构建
      stage('执行构建') {
    container('maven')
    {
    sh "mvn --version"
    sh 'pwd'
    sh '''cd provider/
    mvn clean package -DskipTests'''
    //sh 'mvn package'
    echo '构建完成'
    }
    }
  • provider/为项目子目录,我们要编译的项目;-DskipTests参数,表示跳过代码测试

3、构建docker镜像

  • 编写脚本,构建docker镜像;
      stage('Build') {
    echo "3.Build Stage"
    container('docker') {
    sh "docker -v"
    sh 'pwd'
    sh """cd /home/jenkins/agent/workspace/linetest/provider/
    ls
    docker -H tcp://192.168.231.132:2375 build -t xjk27400861/springbootapp:${build_tag} ."""
    }
    }
  • 我这里通过调用单机节点独立的docker进行镜像打包,jenkins内部新构建的docker无法打包,因权限问题

4、推送docker镜像到docker hub上,以备后续部署应用时使用

  • 编写脚本,推送docker镜像;
      stage('Push') {
    echo "4.Push Docker Image Stage"
    container('docker') {
    sh "docker -H tcp://192.168.231.132:2375 login --username=xjk27400861 -p xujingkun@123"
    sh "docker -H tcp://192.168.231.132:2375 push xjk27400861/springbootapp:${build_tag}"
    }
    }
  • docker login登录到docker hub上,然后使用docker push命令推送;- H 使用其他节点的docker
  • Ubuntu开启Docker远程访问

    输入命令:

       sudo gedit /lib/systemd/system/docker.service

    找到ExecStart段,修改为

      ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock

    保存并退出编辑后,重载守护进程以及重启Docker

      sudo systemctl daemon-reload
    sudo service docker restart

    可通过执行命令查看是否开放了远程访问端口

      sudo systemctl status docker.service

5、拉取docker镜像,部署到k8s环境中

  • 编写脚本,部署应用
      stage('Deploy') {
    echo "5. Deploy Stage"
    container('kubectl') {
    sh "kubectl version"
    def namespace="jenkinsdemo"//springboot2node
    sh """cd /home/jenkins/agent/workspace/linetest/provider/
    ls
    sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml
    sed -i 's/<BUILD_NAMESPACE>/${namespace}/' k8s.yaml
    kubectl delete -f .
    kubectl apply -f k8s.yaml --record
    """
    }
    }
  • 部署成功后,通过k8s主机节点+端口,访问应用

6、完整pipeline脚本

def label = "jnlp"
podTemplate (label: label,cloud: 'kubernetes',containers: [
//image: 'datorresf/jenkins-agent-mvn',
//image: 'maven:latest',
containerTemplate(
name: 'maven',
image: 'maven:3.8.1-ibmjava-8',
alwaysPullImage: false,
ttyEnabled: true,
command:'cat'
),//docker:19.03.8
containerTemplate(
name: 'docker',
image: "docker:stable",
ttyEnabled: true,
command: 'cat',
),
containerTemplate(name: 'kubectl', image: 'bibinwilson/docker-kubectl:latest', command: 'cat', ttyEnabled: true)
],serviceAccount: 'jenkinsbuild',//jenkinsbuild
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
hostPathVolume(mountPath: '/root/.m2', hostPath: '/root/.m2'),
hostPathVolume(mountPath: '/home/jenkins/.kube', hostPath: '/root/.kube'),
hostPathVolume(mountPath: '/etc/kubernetes/pki', hostPath: '/etc/kubernetes/pki'),
])
{
node('jnlp') {
stage('Clone') {
echo "1.Clone Stage"
git credentialsId: '56cc9ad2-aafa-41f3-bc6b-2d7d66c52f32', url: "https://gitee.com/xujk-27400861/springboot-dubbo.git"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
echo "${build_tag}"
}
stage('Test') {
echo "2.Test Stage"
}
stage('执行构建') {
container('maven')
{
sh "mvn --version"
sh 'pwd'
sh '''cd provider/
mvn clean package -DskipTests'''
//sh 'mvn package'
echo '构建完成'
}
}
stage('Build') {
echo "3.Build Stage"
container('docker') {
sh "docker -v"
sh 'pwd'
sh """cd /home/jenkins/agent/workspace/linetest/provider/
ls
docker -H tcp://192.168.231.132:2375 build -t xjk27400861/springbootapp:${build_tag} ."""
}
}
stage('Push') {
echo "4.Push Docker Image Stage"
container('docker') {
sh "docker -H tcp://192.168.231.132:2375 login --username=xjk27400861 -p xujingkun@123"
sh "docker -H tcp://192.168.231.132:2375 push xjk27400861/springbootapp:${build_tag}"
}
}
stage('Deploy') {
echo "5. Deploy Stage"
container('kubectl') {
sh "kubectl version"
def namespace="jenkinsdemo"//springboot2node
sh """cd /home/jenkins/agent/workspace/linetest/provider/
ls
sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml
sed -i 's/<BUILD_NAMESPACE>/${namespace}/' k8s.yaml
kubectl delete -f .
kubectl apply -f k8s.yaml --record
"""
}
}
}
}

7、完整pipeline脚本说明

  • 创建一个pod,里面包含构建有三个docker容器,maven,docker与kubectl,分别进行代码maven构建,docker打包镜像,kubectl部署应用到k8s环境
  • 代码段:serviceAccount: 'jenkinsbuild';指定操作k8s环境的账户;这个是rancher2.6.3部署jenkins的时候,自动创建的账户(service account)

  • 代码段:docker -H tcp://192.168.231.132:2375;操控单节点docker进行镜像打包及推送操作
  • 部署应用的时候,可能会提示用户jenkinsbuild没有构建pod或者services的权限,可以通过rancher的rbac编辑用户权限(Roles&RoleBindings)

    Roles设置



    编辑配置



    RoleBindings无需修改,后面如果有需要其他用户操作k8s的话,可以通过创建Role与RoleBindings,赋予其他账户对应的权限来操作k8s环境

  • jenkins的k8s连通环境配置

    Manage Jenkins -> Manage nodes and clouds 依次点击,进入配置页面

    点击:Configure Clouds;名称默认:kubernetes,我们的脚本里用cloud属性指定的k8s集群

    由于我使用的是rancher通过应用市场安装的,此处的kubernetes设置的都是默认值,无需修改

  • 配置连接集群外的k8s集群方法

    修改k8s集群的地址(https://192.168.231.133:6443

    连接k8s集群的认证方式,我这里配置了3种,用户名密码&秘钥文本&kube.config文件

    用户名密码方式,就直接输入我们k8s集群的访问用户名和密码,在jenkins创建全局凭证,配置时选中即可

    秘钥文本方式,我们通过rancher,下载k8s的配置文件

    打开配置文件,把下图圈起来的数据,在jenkins创建凭据,secret text类型

    使用k8s的配置文件,创建secret file类型的凭证,上传我们的配置文件,测试;由于文件里配置的是k8s集群的访问域名,所以提示失败,如果域名可通的话,也是可以的

  • 流水线脚本配置maven镜像文件的时候,要注意与你springboot项目中使用的版本保持一致,否则会出现编译构建错误

  • 关于serviceAccount: 'jenkinsbuild',这段,需要设置访问k8s集群的用户名,同时需要设置role与rolebindings赋予用户应有的权限,否则会提示权限错误
  • 本文使用的代码见仓库,含有k8s部署文件,https://gitee.com/xujk-27400861/springboot-dubbo/tree/master/provider
  • 同时,也可以通过jenkinsfile构建,在项目中相应目录创建jenkinsfile,里面参考流水线脚本,也是可以实现构建发布的,此处不详述

好的,本篇到此为止

jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)的更多相关文章

  1. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)

    前言:前面写过2篇文章,介绍jenkins通过slave节点部署构建并发布应用到虚拟机中,本篇介绍k8s(k3s)环境下,部署jenkins,通过流水线脚本方式构建发布应用到k8s(k3s)集群环境中 ...

  2. 使用Rancher Server部署本地多节点K8S集群

    当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...

  3. 使用Kubeadm创建k8s集群之部署规划(三十)

    前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...

  4. 使用Kubeadm创建k8s集群之节点部署(三十一)

    前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...

  5. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  6. 从0到1搭建k8s集群系列1:安装虚拟机及docker

    前言 本系列文章记录了本人学习k8s集群搭建的过程,从k8s基本组件的安装.到部署mysql服务到k8s集群.部署web项目到k8s集群以及安装可视化界面管理工具kuboard. 因为k8s的组件安装 ...

  7. [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成

    另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...

  8. K8S(08)交付实战-交付jenkins到k8s集群

    k8s交付实战-交付jenkins到k8s集群 目录 k8s交付实战-交付jenkins到k8s集群 1 准备jenkins镜像 1.1 下载官方镜像 1.2 修改官方镜像 1.2.1 创建目录 1. ...

  9. kubernetes实战-交付dubbo服务到k8s集群(六)使用blue ocean流水线构建dubbo-consumer服务

    我们这里的dubbo-consumer是dubbo-demo-service的消费者: 我们之前已经在jenkins配置好了流水线,只需要填写参数就行了. 由于dubbo-consumer用的gite ...

随机推荐

  1. [零基础学IoT Pwn] 复现Netgear WNAP320 RCE

    [零基础学IoT Pwn] 复现Netgear WNAP320 RCE 0x00 前言: 这是[零基础学IoT Pwn]的第二篇,上篇我们搭好了仿真环境后,模拟运行了Netgear WNAP320固件 ...

  2. NC24724 [USACO 2010 Feb S]Chocolate Eating

    NC24724 [USACO 2010 Feb S]Chocolate Eating 题目 题目描述 Bessie has received \(N (1 <= N <= 50,000)\ ...

  3. 自定义 systemd service

    Red Hat Linux 自 7 版本后 采用systemd 形式取代原先 init ,用户可以参考 系统service 创建自己的service ,以便于日常统一管理,系统service 存储路径 ...

  4. 使用 NSProxy 实现消息转发

    一.简介 ​ 在 iOS 应用开发中,自定义一个类一般需要继承自 NSObject 类或者 NSObject 子类,但是,NSProxy 类不是继承自 NSObject 类或者 NSObject 子类 ...

  5. dubbox 入门demo

    1.Dubbox简介 Dubbox 是一个分布式服务架构,其前身是阿里巴巴开源项目 Dubbo,被国内电商及互联网项目使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继 ...

  6. Java之取余操作 "%"

    取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...

  7. 【最全】CSS盒子(div)水平垂直居中居然还有这种方式

    最全的CSS盒子(div)水平垂直居中布局,对CSS 布局掌握程度决定你在 Web 开发中的开发页面速度. 相对于屏幕 方法一:利用定位 <div class="box"&g ...

  8. SpringMVC-01

    1. 概述 1.1 概念 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 项目请求响应架构演进: 软件三层 软件三层 ...

  9. World Tour Finals 2019 D - Distinct Boxes 题解

    太神了,专门写一篇题解 qwq 简要题意:给你 \(R\) 个红球和 \(B\) 个蓝球,你要把它们放到 \(K\) 个箱子里,要求没有两个箱子完全相同(即两种球个数就相同),求 \(K\) 的最大值 ...

  10. 为你的网站加上live2d的动态小挂件,博君一晒

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_122 喜欢二次元的朋友一定对大名鼎鼎的live2d技术并不陌生,live2D是一种应用于电子游戏的绘图渲染技术,技术由日本Cybe ...