DevOps搭建(十九)-Jenkins+K8s自动化CI搭建详细步骤

1、准备脚本

1.1、pipeline-auto.yml脚本

完整的pipeline-auto.yml脚本如下

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline-auto
  labels:
    app: pipeline-auto
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline-auto
  template:
    metadata:
      labels:
        app: pipeline-auto
    spec:
      containers:
        - name: pipeline-auto
          #指定下载的镜像
          image: 192.168.88.125:80/repo/jenkins-kubernetes-auto:dev
          #镜像拉取策略,不管内容变不变都重新拉取
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  #注意:这里要和Deployment的名称一致
  name: pipeline-auto
  labels:
    app: pipeline-auto
spec:
  selector:
    #注意:这里要和Deployment的app名称一致
    app: pipeline-auto
  ports:
    #Service的端口
    - port: 8081
      #容器内的端口
      targetPort: 8080
  type: NodePort
---
#apiVersion值必须写成networking.k8s.io/v1
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline-auto
spec:
  #可视化界面配置的ingress名称
  ingressClassName: ingress
  rules:
    #映射的域名
    - host: k8s.pipeline-auto.com
      http:
        paths:
          #访问什么样的路径
          - path: /
            #匹配方式,前缀匹配,即匹配上path配置的斜杠就可以
            pathType: Prefix
            backend:
              #自定用哪个service
              service:
                name: pipeline-auto
                port:
                  #映射的端口
                  number: 8081

1.2、Jenkinsfile脚本

完整的Jenkinsfile脚本如下

复制代码
//所有的脚本命令都放在pipeline中
pipeline {
    //指定任务在哪个集群节点中执行
    agent any

    //声明全局变量,方便后面使用
    environment {
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.88.125:80'
        harborRepo = 'repo'
    }

    stages {
        stage('拉取代码') {
            steps {
                echo '开始拉取git仓库代码......'
                checkout scmGit(branches: [[name: 'dev']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.88.125:8929/root/devops-test.git']])
                echo '开始拉取git仓库代码完毕。'
            }
        }
        stage('构建项目') {
            steps {
                echo '开始通过maven构建项目......'
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
                echo '通过maven构建项目完毕'
            }
        }
        stage('代码检查') {
            steps {
                echo 'TODO 通过SonarQube做代码质量检测'
            }
        }
        stage('制作镜像') {
            steps {
                echo '通过Docker制作自定义镜像......'
                sh '''mv ./target/*.jar ./docker/
                docker build -t ${JOB_NAME}:dev ./docker/'''
                echo '通过Docker制作自定义镜像完毕'
            }
        }
        stage('推送镜像') {
            steps {
                echo '将自定义对象推送到Harbor仓库......'
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
                docker tag ${JOB_NAME}:dev ${harborAddress}/${harborRepo}/${JOB_NAME}:dev
                docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:dev
                docker image prune -f'''
                echo '将自定义对象推送到Harbor仓库完成'
            }
        }
        stage('将yml文件传到k8smaster') {
            steps {
                echo '将yml文件传到k8smaster......'
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8smaster', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline-auto.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '将yml文件传到k8smaster完毕'
            }
        }
        stage('远程执行k8smaster的kubectl命令') {
            steps {
                echo '远程执行k8smaster的kubectl命令......'
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8smaster', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''kubectl apply -f /usr/local/k8s/pipeline-auto.yml
                //强制重新部署容器
                kubectl rollout restart deployment pipeline-auto -n test''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '远程执行k8smaster的kubectl命令完毕'
            }
        }
    }
}

2、Jenkins配置

2.1、安装GItLab插件

在Jenkins插件管理中搜索GitLab插件进行安装。

2.2、配置构建触发器

进入Jenkins项目配置里的构建触发器,勾选如下选项:

2.3、取消Jenkins的/project路径验证

从系统管理->系统配置->Gitlab将验证去掉,生产最好配置保证安全。

3、Gitlab配置

3.1、设置允许本地发送

如果是GitLab和Jenkins在同一台服务器,需要开启允许请求发送到本地网络

Admin Area->Settings->Network

把Allow requests to the local network from webhooks and integrations选项勾上,如下:

3.2、配置webhooks

在Gitlab中,配置Settings->Webhooks,其中URL填写步骤2中的GitLab webhook URL 对应的值,并且勾选Trigger下的Push evetns选项,并指定推送分支,例如dev。

接着点击最下方的Add webhook按钮

3.3、测试推送代码

如下在Gitlab的Webhook下方点击Test按钮的Push event触发Jenkins构建操作。

到Jenkins里可以看到触发了构建

4、验证自动化部署

修改dev分支的代码,并提交,可以在Jenkins项目里看到构建

构建完成之后,到Kuboard的容器组里看到,原来的容器下线,新的容器部署。

最后我们请求浏览,如下,至此完成了整个自动化部署。

http://192.168.88.126:31762/test/test

相关推荐
(:满天星:)3 小时前
第31篇:块设备与字符设备管理深度解析(基于OpenEuler 24.03)
linux·运维·服务器·网络·centos
小陶来咯3 小时前
【仿muduo库实现并发服务器】Acceptor模块
运维·服务器
cui_hao_nan3 小时前
Docker后端部署
运维·docker·容器
ZZH1120KQ4 小时前
Linux系统安全及应用
linux·运维·系统安全
小扎仙森4 小时前
关于服务器宝塔转移wordperss子比主题问题
运维·服务器
小小小糖果人4 小时前
Linux云计算基础篇(5)
linux·运维·服务器
我不是哆啦A梦5 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
galaxylove5 小时前
Gartner发布塑造安全运营未来的关键 AI 自动化趋势
人工智能·安全·自动化
小张是铁粉5 小时前
docker在Linux的安装遇到的问题
linux·docker·容器
weixin_7714323115 小时前
linux系统 weblogic10.3.6(jar) 下载及安装
linux·运维·jar