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


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

    1、从gitlab上拉取代码步骤

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

      image

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

      image

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

      image

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

      image

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

      image

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

      image

      image

      代码块:

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

    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=xjk*** -p pass@word"
            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}/' k8s.yaml
              sed -i 's//${namespace}/' k8s.yaml
              kubectl delete -f .
              kubectl apply -f k8s.yaml --record
              """
        }
      }
      
    • 部署成功后,通过k8s主机节点+端口,访问应用
      image

    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=xjk*** -p ***"
          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}/' k8s.yaml
            sed -i 's//${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)

      image

      image

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

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

    • jenkins的k8s连通环境配置

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

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

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

      image

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

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

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

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

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

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

      image

      image

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

      image

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

      image

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

    好的,本篇到此为止

  • 相关阅读:
    【pwn入门】用gdb实现第1个pwn
    器学习算法(六)基于天气数据集的XGBoost分类预测
    idea如何创建并运行第一个java程序
    如何选择示波器?
    k8s入门使用
    背废完虐面试官,字节架构师 8 年心血终成《图解设计模式》手册,拿下 offer 洒洒水啦
    批量条件赋值、文本字段计算常用表达式
    精致小巧,支持苹果 Find My 的Chipolo ONE Spot
    国际版阿里云/腾讯云免费开户:什么是DDos攻击?
    mmcls 多标签模型部署在torch serve
  • 原文地址:https://www.cnblogs.com/kunwn/p/16687516.html