二.基于jenkins与gitlab的CI/CD及DevOps实战 4.2 jenkins 分布式架构、声明式pipeline详解及案例

jenkins分布式架构、声明式pipeline详解及案例

主要内容:
    Jenkins分布式架构概念与实现;
    声明式Pipeline语法结构;
    声明式Pipline快速入门;
    参数化Pipeline及高级应用;
    Jenkins通知机制,在声明式Pipeline中使用post;
    Jenkins视图简介与应用场景;
    代码质量测试工具sonarqube介绍;
    Sonarqube部署、插件管理、实现代码扫描;
    Jenkins结合sonarqube实现代码自动扫描;
    实战案例:基于Docker系统实现代码自动发布和回滚;
    
Jenkins分布式架构概念与实现;
  jenkins单节点环境:

 

 

 




jenkins分布式环境:
  jenkins master节点负责job的创建、管理与触发。
  job在执行时分配给特定的jenkins slave节点执行job执行成功后由jenkins master发送邮件通知。
  降低jenkins master的负载。
  基于jenkins分布式架构可以快速横向扩容jenkins的构建job并发执行能力、提高部署效率。    

slave节点的安装:
    环境要标准化
        JDK
        工作路径
        安装git mvn等必要的工具
    服务器配置
        CPU 内存 硬盘SSD
    节点标签-label(很重要)
        对服务器进行筛选

添加jenkins slave节点:(192.168.106.191)
    jenkins slave节点创建工作目录与基本环境配置,如果jenkins slave节点需要clone代码和执行java 代码编译,则jenkins slave节点也需要配置java环境并且安装git、svn、maven等与master相同的基础运行环境,另外也要创建与master相同的数据目录,方便后期目录切换与制品同步,此路径通常与master和各node节点保持一致。
        # mkdir -p /var/lib/jenkins #创建数据目录
        # apt install openjdk-11-jdk
   root@docker-server1:/data/scripts# pwd
/data/scripts
root@docker-server1:/data/scripts# ls
laimiya-app1-deploy.sh

root@docker-server1:/data/scripts# apt install git

 
    Jenkins—系统管理—节点管理—新建节点:
  

 

 

 

 

    认证凭据:
   

 

 

 

 

 

 


    
    slave启动方式:    
   

 

 

 

 

 

 

 

 

    验证jenkins slave节点状态:

 

 

 

 

 

    jenkins slave节点执行job:(结合pipeline,如下)

 

声明式Pipeline语法结构;

 pipline 简介:
    pipline运行在jenkins 2.X版本的核心插件,Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化。
    
    流水线的优势:
        可持续性:jenkins的重启或者中断后不影响已经执行的Pipline Job
        支持暂停:pipline可以选择停止并等待人工输入或批准后再继续执行。
        可扩展性:通过groovy的编程更容易的扩展插件。
        并行执行:通过groovy脚本可以实现step,stage间的并行执行,提高构建效率。
        
    流水线的分类及对比:
        pipline流水线分为脚本式流水线与声明式流水线
        1.语法差异,声明式的在pipline {}块中定义,脚本式直接以node开始
        2.脚本式的在一台节点执行所有操作,而声明式可以将不同的job定义到不同的节点执行。
        3.声明式比脚本式的写法更复杂,但功能更强大
        4.目前主要使用声明式较多

pipline 语法简介:
    流水线过程定义在 Pipeline{}块中,在Pipeline 块定义了整个流水线中完成的所有的操作。
    
    Stage:阶段,一个pipline可以划分为若干个stage,每个stage都是一个操作阶段,比如代码clone、代码编译、代码测试和代码部署,阶段是一个逻辑分组,在pipline中可以实现跨多个node执行不同的stage。
    Step:步骤,step是jenkins pipline最基本的操作单元,一个stage中可以有多个step,例如在代码clone的stage中需要定义代码clone的step、在代码编译stage需要定义代码编译的step。
    Node:jenkins工作节点,可以是jenkins master也可以是jenkins slave,node是执行step的具体服务器。

pipline 语法-指定节点:
  基于agent指令选择jenkins节点:
    any:可以在任何可用的节点执行,有jenkins自动分配
pipeline {
  agent any
}
  none:表示pipline脚本没有定义在默认执行的jenkins节点,需要在后续的每一个stage中单独定义节点
pipeline {
  agent none
  stages {
    stage('代码clone'){
      agent any
        steps{
          sh 'echo 代码clone'
    }
  }
    stage('代码部署'){
      agent any
        steps{
          sh 'echo 代码部署'
        }
    }
  }
}

 

 基于agent指令选择jenkins节点:

  label:通过标签指定在指定的节点执行从操作:
pipeline{
    //agent any  //全局必须带有agent,表明此pipeline执行节点
    agent { label 'jenkins-slave1' } //基于label指定具体执行的步骤节点,非必须
    stages{
        stage("代码clone"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
            steps{
                sh "cd /var/lib/jenkins/workspace/pipeline-test1 && rm -rf ./*"
                git branch: 'main', credentialsId: 'f24f8245-4054-4fcf-924b-53722be083a1', url: 'git@192.168.106.200:laimiya/app1.git'
                echo "代码 clone完成"
            }
        }
        
        stage("代码构建"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
                steps{
                    sh "tar czvf frontend.tar.gz --exclude=.git --exclude=.gitignore  --exclude=README.md ./"
                }
        }    
    }
}

 

 

 

 


  node:和 label 的功能类似都是用于指定节点,区别是node可以额外设置一些参数配置,比如设置customWorkspace(设置当前stage的自定义工作目录)
pipeline {
  agent none
  stages {
    stage('代码clone'){
      agent {
        node {
          label 'jenkins-master'
          customWorkspace "/data/gitdata/magedu"
        }
      }
      steps {
        sh "echo 代码clone"
      }
    }
    stage('代码部署'){
      agent {
        node {
          label 'jenkins-master'
          customWorkspace "/data/gitdata/magedu"
        }
      }
      steps {
        sh "echo 代码部署"
      }
    }
  }
}

 基于input实现交互式操作:(基本不使用)
  Input 指令可以在流水线中实现必要的交互式操作,比如选择要部署的环境、是否向后继续执行任务等。
  input配置简介:
    message:必选,在input界面的提示信息,比如:“是否继续?”等,内容可自定义。
    id:可选,input 的标识符,默认为 stage 的名称。
    ok:可选,确认按钮的显示信息,比如可以是“确定”、“允许”等 自定义内容,默认继续为Proceed 、取消为 Abort。
    submitter:可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input。
    parameters:提供一个参数列表供 input 使用。

pipeline {
  agent any
  stages {
    stage('交互测试') {
      input {
        message "是否继续部署?"
        ok "继续部署"
        submitter "jenkinsadmin"
      }
      steps {
        echo "Hello jenkins!"
      }
    }
  }
}

 

Jenkins通知机制,在声明式Pipeline中使用post;

post指令:
  post一般用于pipline流水线执行后的进一步处理,比如错误通知等,post可以针对流水线不同的执行结果做出不同的处理,比如执行成功做什么处理、执行失败做什么处理等。
  post条件简介:
  Post 可以定义在 Pipeline 或 stage 中,目前支持以下条件:
always:无论Pipeline或stage的最后是执行成功还是失败,都执行post中定义的指令。
changed:只有当前Pipeline或stage的完成状态与它之前的运行不同时,比如从成功转换为失败、或从失败转换为成功,才执行post中定义的指令。
fixed:当本次Pipeline或stage成功,且上一次构建是失败或不稳定时,就执行post中定义的指令,从失败转换为成功。
regression:当本次Pipeline或stage的状态为失败、不稳定或终止,且上一次构建的状态为成功时,就执行post中定义的指令,从成功转换为失败。
failure:只有当前Pipeline或stage的完成状态为失败(failure),才允许在post部分运行该步骤,而且通常这时在Web界面中显示为红色。
success:当前执行状态为成功(success),执行post步骤,通常在Web界面中显示为蓝色或绿色。
unstable:当前状态为不稳定(unstable),执行post步骤,通常原因是由于测试失败或代码违规等造成,而且会在Web界面中显示为黄色。
aborted:当前状态为终止(aborted),执行该post步骤,通常由于流水线被手动终止触发,这时在在Web界面中显示为灰色。
unsuccessful:当前状态只要不是success时,执行该post步骤;
cleanup:无论pipeline或stage的完成状态如何,都允许运行该post中定义的指令,和always的区别在于cleanup会在post其它条件执行之后执行(最后执行cleanup)。



post发送邮件通知示例:

pipeline-post-test 演示在这执行异常后post阶段的操作,cleanup会晚于always执行,发送邮件需要提前配置好jenkins的邮件通知配置:

pipeline {
  agent any
  stages {
    stage('post测试-代码clone阶段') {
      steps {
        sh 'echo git clone'
        sh 'cd /data/xxx' //此步骤会执行失败,用于验证构建失败的邮件通知
      }
      post {
        cleanup {
          echo "post cleanup-->测试是否执行"
        }
        always {
          echo "post always"
        }
        aborted {
          echo "post aborted"
        }
        success {
          script {
            mail to: '253818242@qq.com',
            subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
            body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} - 构建成功!\n 点击链接 ${env.BUILD_URL} 查看详情"
          }
        }
        failure {
          script {
            mail to: '253818242@qq.com',
            subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
            body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} - 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
          }
        }
      }
    }
  }
}

声明式Pipline快速入门;

pipline环境变量:
基于environment传递环境变量:
pipeline {
  agent any
  environment {   //全局的变量,在当前pipline所有的stage中都会生效
    NAME='user1'
    PASSWD='123456'
  }
  stages {
    stage('环境变量stage1') {
      environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效
        GIT_SERVER = 'git@172.31.5.101:magedu/app1.git'
      }
      steps {
        sh """
            echo '$NAME'
            echo '$PASSWD'
            echo '$GIT_SERVER'
        """
      }
    }
    stage('环境变量stage2') {
      steps {
        sh """
            echo '${NAME}'
            echo '$PASSWD'
        """
      }
    }
  }
}

参数化Pipeline及高级应用;

  pipline参数简介:
基于parameters给step传递参数:
 可以基于parameters自定义参数,参数用于在执行pipline流水线的时候传递给step进行使用,比如传递选项参数、gitlab的分支、镜像仓库、镜像tag等信息。
parameters简介:
 string: #字符串类型参数,可以传递账户名、密码等参数
 text: #文本型参数,一般用于定义多行文本内容的变量。
 booleanParam:#布尔型参数
 choice:#选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值使用
 password: #密码型变量,一般用于定义敏感型变量,在 Jenkins 控制台会输出为*隐藏密码
pipline参数示例:
示例:
pipeline {
  agent any
  parameters {
    string(name: 'BRANCH', defaultValue:  'develop', description: '分支选择')   //字符串参数,会配置在jenkins的参数化构建过程中
    choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择')  //选项参数,会配置在jenkins的参数化构建过程中
  }
  stages {
    stage('测试参数1') {
      steps {
        sh "echo $BRANCH"
      }
    }
    stage('测试参数2') {
      steps {
        sh "echo $DEPLOY_ENV"
      }
    }
  }
}

pipline if指令:
    基于if指令实现流程判断:
pipeline {
  agent any
  environment {
       //代码仓库变量
      def BRANCH_NAME = 'main'
   }
  stages {
      stage('if指令测试') {
         steps {
            script {
              if (env.BRANCH_NAME == 'main') {
      echo '我是master'
    } else if (env.BRANCH_NAME =='develop'){
      echo '我是develop'
    } else {
      echo '我是默认的'
}
}
}
}
}
}

options选项配置参数简介:
buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本
timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS
timestamps() //在控制台显示命令执行的时间,格式为10:58:39
retry(2) //流水线构建失败后重试次数为2次

options选项配置参数示例:
示例:
pipeline {
    agent any
    environment { //全局的变量,在当前pipline所有的stage中都会生效
  NAME='user1'
  PASSWD='123456'
}
  options { //定义pipline参数
         buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本
    timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS
         timestamps() //在控制台显示命令执行的时间,格式为10:58:39
         retry(2) //流水线构建失败后重试次数为2次
}
  stages {
    stage('代码clone') {
    environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效
    GIT_SERVER = 'git@192.168.106.200:laimiya/app1.git'
}
  steps {
    sh """
      echo '代码clone'
      """
}
}
}
}

Jenkins视图简介与应用场景
  我的视图:
          显示当前账户有权限看到的所有job
  列表视图:
          以列表形式,显示指定项目中的job

 

posted @   梳碧湖砍柴少年  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示