草庐IT

DevOps之Jenkins流水线

羋学僧 2023-10-11 原文

1 、Jenkins流水线任务介绍

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

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

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

2、 Jenkins流水线任务

2.1、 构建Jenkins流水线任务
  • 构建任务

    构建Jenkins流水线任务
  • 生成Groovy脚本

    Hello World脚本生成
  • 构建后查看视图

    构建后查看视图
2.2、 Groovy脚本
  • Groovy脚本基础语法

    // 所有脚本命令包含在pipeline{}中
    pipeline {  
      // 指定任务在哪个节点执行(Jenkins支持分布式)
        agent any
        
        // 配置全局环境,指定变量名=变量值信息
        environment{
          host = '192.168.117.112'
        }
    
        // 存放所有任务的合集
        stages {
          // 单个任务
            stage('任务1') {
              // 实现任务的具体流程
                steps {
                    echo 'do something'
                }
            }
          // 单个任务
            stage('任务2') {
              // 实现任务的具体流程
                steps {
                    echo 'do something'
                }
            }
            // ……
        }
    }
    
  • 编写例子测试

    pipeline {
        agent any
    
        // 存放所有任务的合集
        stages {
            stage('拉取Git代码') {
                steps {
                    echo '拉取Git代码'
                }
            }
    
            stage('检测代码质量') {
                steps {
                    echo '检测代码质量'
                }
            }
    
            stage('构建代码') {
                steps {
                    echo '构建代码'
                }
            }
    
            stage('制作自定义镜像并发布Harbor') {
                steps {
                    echo '制作自定义镜像并发布Harbor'
                }
            }
    
            stage('基于Harbor部署工程') {
                steps {
                    echo '基于Harbor部署工程'
                }
            }
        }
    }
    
    配置Grovvy脚本
  • 查看效果

    查看效果

Ps:涉及到特定脚本,Jenkins给予了充足的提示,可以自动生成命令

生成命令位置
2.3、 Jenkinsfile实现

Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建

  • 配置pipeline

    配置pipeline
  • 准备Jenkinsfile

    准备Jenkinsfile文件
  • 测试效果

    测试效果

3、 Jenkins流水线任务实现

3.1、 参数化构建

添加参数化构建,方便选择不的项目版本

Git参数化构建
3.2、 拉取Git代码

通过流水线语法生成Checkout代码的脚本

语法生成

将*/master更改为标签${tag}

pipeline {
    agent any
    stages {

        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }
    }
}
3.3、 构建代码

通过脚本执行mvn的构建命令

pipeline {
    agent any

    stages {

        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
            }
        }

        stage('构建代码') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }
    }
}
3.4、 代码质量检测

通过脚本执行sonar-scanner命令即可

pipeline {
    agent any

    stages {

        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
            }
        }
    }
}

3.5、 制作自定义镜像并发布
  • 生成自定义镜像脚本
  pipeline {
      agent any
      environment{
          harborHost = '192.168.117.112:80'
          harborRepo = 'repo'
          harborUser = 'admin'
          harborPasswd = 'Harbor12345'
      }
  
      // 存放所有任务的合集
      stages {
  
          stage('拉取Git代码') {
              steps {
                  checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
              }
          }
  
          stage('制作自定义镜像并发布Harbor') {
              steps {
                  sh '''cp ./target/*.jar ./docker/
                  cd ./docker
                  docker build -t ${JOB_NAME}:${tag} ./'''
  
                  sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                  docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                  docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
              }
          }
      }
  }
  • 生成Publish Over SSH脚本
pipeline {
    agent any
    environment{
        harborHost = '192.168.117.112:80'
        harborRepo = 'repo'
        harborUser = 'admin'
        harborPasswd = 'Harbor12345'
    }
    stages {

        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
            }
        }
        

        stage('制作自定义镜像并发布Harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${JOB_NAME}:${tag} ./'''
  
                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }

        stage('目标服务器拉取镜像并运行') {
              steps {
                  sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              }
          }
    }
}

Ps:由于采用变量,记得使用双引号

4、 Jenkins流水线整合钉钉

在程序部署成功后,可以通过钉钉的机器人及时向群众发送部署的最终结果通知

  • 安装插件

    安装插件
  • 钉钉内部创建群组并构建机器人

    钉钉内部创建群组并构建机器人

    最终或获取到Webhook信息

https://oapi.dingtalk.com/robot/send?access_token=bf92a9c16c58bf6244cedebca6175eb38b6aa47e833f0de830993d995ce080cb
  • 系统配置添加钉钉通知

    配置钉钉通知
  • 任务中追加流水线配置
pipeline {
    agent any
    environment{
        harborHost = '192.168.117.112:80'
        harborRepo = 'repo'
        harborUser = 'admin'
        harborPasswd = 'Harbor12345'
    }
    stages {

        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
            }
        }
        

        stage('制作自定义镜像并发布Harbor') {
            steps {
                sh '''cp ./target/*.jar ./docker/
                cd ./docker
                docker build -t ${JOB_NAME}:${tag} ./'''
  
                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }

        stage('目标服务器拉取镜像并运行') {
              steps {
                  sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              }
          }
    }
    post {
        success {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
              )
          }
        failure {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "fail: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
              )
        }
    }
}
  • 查看效果

    钉钉通知效果

5、 Jenkins流水线从GitLab拉取脚本

5.1、流水线使用SCM
5.2、创建Jenkinsfile
5.3、编写脚本
效果

有关DevOps之Jenkins流水线的更多相关文章

  1. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  2. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  3. IDC最新MarketScape报告:DevOps市场需求广泛 - 2

    日前,全球著名咨询机构IDC最新MarketScape报告《中国DevOps平台市场厂商评估,2022》正式发布,此报告中对中国主流DevOps云厂商分别从现有能力和未来战略维度两个层面对厂商进行评估,IDC对具有代表性的8家提供商进行了深度研究,他们分别是(按照拼音字母顺序):AWS、阿里云、百度、博云、华为云、京东云、微软、腾讯云(CODING)。华为云、阿里云和腾讯云CODING均在战略和能力两大维度表现强势,成功入席领导者(Leaders)位置。IDC MarketScape:中国DevOps平台市场厂商评估,2022华为云软件开发生产线DevCloud在市场份额和发展战略两大维度均排

  4. ruby - 使用 Ruby 验证 Jenkins 插件表单 - 2

    我正在用Ruby开发一个Jenkins插件。您应该能够配置连接到服务器的每个节点,以便在节点失去与主服务器的连接时将电子邮件发送到指定地址。EmailNodeProperty添加一个字段以输入电子邮件地址:##Saveanemailpropertyforeverynode#classEmailNodeProperty配置节点时,有一个名为email的字段,您可以在其中输入电子邮件地址。我希望在您输入地址时验证此字段。当您保存配置时,将创建一个EmailNodeProperty,您可以从中(没错)访问电子邮件地址。MyComputerListener的offline在节点失去连接时被调用

  5. ruby - 无法运行 Jenkins Build - bundle : "command not found" - 2

    我目前正在尝试为我的一些cucumber任务运行jenkins构建。我所有的gem都是使用Bundler安装的。Gem存储在vendor文件夹中。但是,当我尝试在执行shell构建步骤中运行bundleinstall--deployment时,出现以下错误:StartedbyuseranonymousBuildinginworkspace/Users/Shared/Jenkins/Home/jobs/cukes/workspace[workspace]$/bin/sh-xe/var/folders/zz/zyxvpxvq6csfxvn_n0000004000001/T/hudson44

  6. ruby - RVM 和 Jenkins 设置 - 2

    我是JenkinsCI的新手。我在我的远程Jenkins中安装RVM,当我在shell下执行时。#!/bin/bash-xsource~/.bashrcrvmuse1.9.3@rails-3.2.3我收到以下错误。+source/var/lib/jenkins/.bashrc++PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/var/lib/jenkins/.rvm/bin:/var/lib/jenkins/.rvm/bin+rvmuse1.9.3@rails-3.2.3RVMisnotafunction,s

  7. 51单片机(中断系统)按键控制LED流水灯模式(2) - 2

    一、中断系统中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请

  8. Jenkins发布uniapp开发的H5遇到的问题 - 2

    目录​编辑 前言:一、问题:     二、解决经历:    1、思路1(不成功):    2、思路2(成功):        三、原因分析:总结前言:    背景:由于历史原因,公司有个历史项目使用vue开发的公众号H5,原生开发的微信小程序。两端功能的完全一样,但是需要维护两个项目,最近客户提了需求需要修改部分功能,博主接到需求后,觉得维护两套代码不仅是重复开发,测试起来也麻烦,因为之前是两个人开发不同端的缘故,导致大部分的bug都是因为两端不一致产生的。为了节省时间和维护成本,提升开发测试效率,在反复对比调研,最终选择了uniapp技术框架融合两端进行重构。一、问题:           

  9. 【真北直播笔记】董越:简明DevOps学习地图 - 2

    缘起真北敏捷社区的宗旨是:求知、连接。求知就是学习,家里没矿的话,学习是一个人最重要的动力之源。连接就是把人拉在一起,我们相信人与人的互动会带来美好的变化。今天的直播是把大家拉在一起学习,就是求知、连接。嘉宾介绍董越,DevOps资深专家,阿里巴巴集团前研发效能事业部架构、高级产品专家等职,从事Aone&云效DevOps产品设计、阿里云专有云集成与交付解决方案设计等工作。在加入阿里之前,他还曾就职于西门子、摩托罗拉、雅虎、索尼、去哪儿网等大型企业,一直从事软件配置管理、软件集成与交付、DevOps相关的工作。当前主要从事企业级DevOps体系建设与咨询工作,帮助众多企业提升软件研发交付效能。已

  10. Sonarqube 安装 及与Jenkins sonar scanner插件集成部署 - 2

    一、SonarQube基本概述1.什么是SonarQubeSonarQube是一个开源的代码质量管理系统,用于检测代码中的错误,漏洞和代码规范。它可以现有的Gitlab、Jenkins集成,以便在项目拉取后进行连续的代码检查。2.使用SonarQube前提SonarQube基于Java开发,所以需要安装OpenJDK8版本。SonarQube需要依赖MySQL数据库,至少5.6版本以上8版本以下。SonarQube的小型实例至少需要4GB内存,如果是大型实例需要16GB二、SonarQube服务安装分两个步骤,第一步安装sonarqubeserver端,第二步,jenkins集成sonarqu

随机推荐