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

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

1、从gitlab上拉取代码步骤

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

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

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

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

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

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

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

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

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

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

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

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

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

    代码块:

      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参数,表示跳过代码测试

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

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主机节点+端口,访问应用

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

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)

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

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

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

    Roles设置
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
    编辑配置
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
    RoleBindings无需修改,后面如果有需要其他用户操作k8s的话,可以通过创建Role与RoleBindings,赋予其他账户对应的权限来操作k8s环境

  • jenkins的k8s连通环境配置

    Manage Jenkins -> Manage nodes and clouds 依次点击,进入配置页面
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    点击:Configure Clouds;名称默认:kubernetes,我们的脚本里用cloud属性指定的k8s集群
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    由于我使用的是rancher通过应用市场安装的,此处的kubernetes设置的都是默认值,无需修改
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

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

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

    修改k8s集群的地址(https://192.168.231.133:6443
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    连接k8s集群的认证方式,我这里配置了3种,用户名密码&秘钥文本&kube.config文件
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    用户名密码方式,就直接输入我们k8s集群的访问用户名和密码,在jenkins创建全局凭证,配置时选中即可
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    秘钥文本方式,我们通过rancher,下载k8s的配置文件
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    打开配置文件,把下图圈起来的数据,在jenkins创建凭据,secret text类型
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

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

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

    使用k8s的配置文件,创建secret file类型的凭证,上传我们的配置文件,测试;由于文件里配置的是k8s集群的访问域名,所以提示失败,如果域名可通的话,也是可以的
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

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

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

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

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

好的,本篇到此为止

发表评论

评论已关闭。

相关文章