【DevOps】Jenkins 流水线 & Kubernetes

在DevOps搭建全流程中,采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

所以Pipeline相对自由风格或者其他的项目风格更容易操作。

Jenkins流水线任务

  • 新建流水线任务
    在这里插入图片描述
  • 一个简单的Hello Word模板
    在这里插入图片描述
  • 构建视图
    在这里插入图片描述
Groovy脚本
  • Groovy脚本基础配置结构
// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 配置全局环境,指定变量名=变量值信息
    environment{
    	host = '111'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
        // ……
    }
}
  • 语法可生成
    在这里插入图片描述
    在这里插入图片描述
Jenkinsfile

Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建。其实也就是Groovy脚本,只不过是将其放在项目中维护了。

  • 配置pipeline任务
    在这里插入图片描述
  • 准备个Jenkinsfile文件测试下
    在这里插入图片描述
  • 尝试构建(成功)
    在这里插入图片描述

Jenkins流水线任务实现

此段落真正实现了整个任务的全流程,主要就是各个阶段的配置和脚本文件的编写。

拉取代码
  • 选择参数化构建
    在这里插入图片描述

  • 利用流水线语法生成Checkout代码的脚本
    在这里插入图片描述
    在这里插入图片描述

  • 修改Jenkinsfile
    在这里插入图片描述

  • 尝试构建(成功)在这里插入图片描述

构建项目
  • 流水线语法生成
    在这里插入图片描述
  • 修改Jenkinsfile文件
    在这里插入图片描述
  • 尝试构建(成功)
    在这里插入图片描述
代码检测
  • 流水线语法生成(略)
  • 修改Jenkinsfile
    在这里插入图片描述
  • 尝试构建(成功)在这里插入图片描述
制作镜像并推送
  • 修改Jenkinsfile
    在这里插入图片描述

  • 尝试构建(成功)
    在这里插入图片描述

通知目标服务器部署服务
  • 脚本生成
    在这里插入图片描述
    在这里插入图片描述

  • 修改Jenkinsfile文件
    在这里插入图片描述

  • 尝试构建
    在这里插入图片描述

  • 观察容器并测试接口
    在这里插入图片描述
    在这里插入图片描述

完整的Jenkinsfile

仅供参考

PS:对于引用了Jenkinsfile和Jenkins job中的的变量,注意单引号和双引号的替换。小心出现占位变量被直接输出为字符串的情况。

pipeline {  

    agent any
      
    environment{
    	host = ''
    }

    stages {

        stage('拉取gialab代码') {
            steps {
                checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.190:8929/root/mytest.git']])
            }
        }

        stage('构建项目') {
            steps {
               sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }

        stage('检测代码质量') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=6caa523d0115fa5e89f5016e7b158d3a51ce116f' 
            }
        }

        stage('制作自定义镜像并发布Harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t 192.168.1.190:80/mytest/test:$tag ./'''

                sh '''docker login --username admin --password-stdin < ~/my_password.txt 192.168.1.190:80
                docker push 192.168.1.190:80/mytest/test:$tag'''
            }
        }

        stage('通知服务器发布') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: '190', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'deploy.sh 192.168.1.190:80 mytest test $tag 9090', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        
    }
}

部署结果通知(钉钉)

友情链接:插件使用文档

实现
  • 创建群并添加自定义机器人
    在这里插入图片描述
  • Jenkins下载对应插件 在这里插入图片描述
  • 插件配置
    在这里插入图片描述
  • Jenkinsfile修改
     post {
         success {
             dingtalk (
                 robot: 'Jenkins',
                 type:'MARKDOWN',
                 title: "success: ${JOB_NAME}",
                 text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
             )
         }
         failure {
             dingtalk (
                 robot: 'Jenkins',
                 type:'MARKDOWN',
                 title: "fail: ${JOB_NAME}",
                 text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
             )
         }
     }
    
    目录结构在这里插入图片描述
  • 测试
    • 失败消息
      在这里插入图片描述
      在这里插入图片描述
    • 成功消息
      在这里插入图片描述
      在这里插入图片描述
小结

整合钉钉还是挺简单的,按照说明一步步配置即可,Jenkinsfile有错误的话也会在日志中得到体现,按照提示修正即可。

另外可以设置推送消息的类型,如:TEXT、LINK、MARKDOWN、ACTION_CARD。每个消息的显示和适用性各有不同。也可以设置@某人等,有兴趣的朋友可以去本章节开始的友情链接查看相关文档,里面有实例供参考。


Jenkins & k8s

  • k8s环境准备(略过)
    在这里插入图片描述

  • 各节点添加私库地址
    在这里插入图片描述

  • 验证登录
    在这里插入图片描述

  • 创建secret,用来访问harbor
    在这里插入图片描述

  • 准备部署文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: devops
      name: pipeline
      labels:
        app: pipeline
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: pipeline
      template:
        metadata:
          labels:
            app: pipeline    
        spec:
          containers:
          - name: pipeline
            image: 192.168.1.190:80/mytest/test:v3.0.0
            imagePullPolicy: Always
            ports:
            - containerPort: 9090
          imagePullSecrets:
          - name: myharbor
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: devops
      labels:
        app: pipeline
      name: pipeline  
    spec:
      selector:
        app: pipeline
      ports:
      - port: 9090
        targetPort: 9090
        nodePort: 32323
      type: NodePort
    
  • 部署文件放置Gitlab,方便维护
    在这里插入图片描述

  • 新增SSH配置 k8s master 节点连接
    在这里插入图片描述

  • SSH密钥远程登录 k8s master (运行kubectl指令)

    • Jenkins容器内生成密钥对
      在这里插入图片描述

    • 将公钥传输至k8s master
      在这里插入图片描述

    • 尝试宿主机无密码登录master并运行命令
      在这里插入图片描述

  • Jenkinsfile文件修改(流水线语法生成)
    在这里插入图片描述

  • 代码修改
    在这里插入图片描述

  • tag版本变更
    在这里插入图片描述
    在这里插入图片描述

  • 构建测试

    • 钉钉
      在这里插入图片描述
    • k8s查看
      在这里插入图片描述
    • 接口测试
      在这里插入图片描述

总结

此次使用传统的Jenkins整合 k8s 来实现DevOps。总体来看:

  • 较为复杂:需要一定的学习和经验来正确设置和维护。而且传统的Jenkins需要自行配置和管理Kubernetes集成,更是需要额外的工作量和配置。
  • 灵活性更高:有插件生态系统的支持,这意味着你可以根据需要集成Kubernetes、Docker和其他DevOps工具,以构建完整的CI/CD流水线。
  • 安全:存在时间较长,广泛应用于各种企业环境中,具有较高的稳定性和可靠性。

和KubeSphere平台提供的一体化的DevOps各有千秋。
需求决定一切,没有最好,只有合不合适。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总在寒冷清秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值