DevOps实战系列【第十四章-完结篇】:Jenkins Pipeline最佳实践案例

news2024/11/14 13:41:12

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

我们将之前的案例,使用流水线构建一下

在这里插入图片描述


搭建一个Jenkinsfile模型

pipeline {
    agent any

    stages {
        stage('拉取gitlab项目代码') {
            steps {
                echo "拉取git代码"
            }
        }
        stage('构建代码') {
            steps {
                echo "通过maven构建代码"
            }
        }
        stage('代码质量审计') {
            steps {
                echo "通过sonar进行代码质量审计"
            }
        }
        stage('构建镜像/推送镜像') {
            steps {
                echo "构建docker镜像并推送私服"
            }
        }
        stage('拉取镜像/发布容器') {
            steps {
                echo "宿主机拉取镜像并发布启动微服务容器"
            }
        }
    }
}

创建pipeline job

在这里插入图片描述

1.gitlab脚本生成:

指定基于git参数为分支的构建配置,而此时如果我们选择构建,则会报错,因为还没有指定git仓库配置
在这里插入图片描述
在这里插入图片描述
此时,我们需要通过pipeline的阶段-步骤来完成git仓库的配置,我们选择语法生成工具,如下
在这里插入图片描述
注意:配置完scm后,需要我们先构建一下,然后git参数才能正常显示,这里是jenkins的一个算是小bug吧,不运行一次他检测不到配置的scm仓库。

2.maven脚本生成:

接下来我们来生成maven的构建脚本
在这里插入图片描述

3.sonar脚本生成:

当然我们也可以将sonar的配置单独拎出去:而sonar是集成到jenkins中的,所以也是执行shell脚本,通过命令来运行,

此处我们借助sonar-scanner插件的pipeline脚本来执行,这样可以复用我们配置到jenkins中的sonar环境,如下:
在这里插入图片描述

withSonarQubeEnv(credentialsId: 'sonar-key') {
// some block
}

在这里插入图片描述
这里运行后有个报错,是因为生成器丢了一个参数,我们把他加上:

注意:因为sonar-scanner本身不支持覆盖率的生成而是借助jacoco生成报告,然后由scanner上报给sonar服务进行分析,即sonar不能生成报告而是只能分析,所以我们依然借助maven去生成覆盖率报告

// name是我们在系统配置中设置的name
withSonarQubeEnv(installationName: 'sonar', credentialsId: 'sonar-key') {
	sh "$SCANNER_HOME/sonar-scanner -Dsonar.java.binaries=target -Dsonar.projectKey=$JOB_NAME"
}

在这里插入图片描述

4.构建镜像/推送镜像到私服:

在这里插入图片描述
在这里插入图片描述

5.最后远程通知宿主机拉取镜像并部署容器:

在这里插入图片描述
在这里插入图片描述
最后我们稍微调整下变量的定制:

sshPublisher(publishers: [sshPublisherDesc(configName: 'omv', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /share/jenkins/demo/script/publish.sh $PUBLIC_REGISTRY $JOB_NAME $branch", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '$JOB_NAME', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'script/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])

注意:最后我们可以把verbose参数设置成true,这样远程执行的日志就可以打印到jenkins了。


创建Jenkinsfile

pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "maven3.8.6"
    }
    
    environment {
        SCANNER_HOME = "${tool 'scanner4.7'}/bin"
        
        // docker registry
        PRIVATE_REGISTRY = '10.10.1.199:9082'
        PUBLIC_REGISTRY = '10.10.1.199:9083'
        USER = "admin"
        PWD = "123456"
    }
    
    stages {
        stage('拉取gitlab项目代码') {
            steps {
                // 检出代码
                checkout([$class: 'GitSCM', branches: [[name: '$branch']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-ssh', url: 'ssh://git@10.10.1.199:2224/devops/helloworld.git']]])
            }
        }
        stage('构建代码') {
            steps {
                // 执行shell脚本 
                sh 'mvn clean package verify'
            }
        }
        stage('代码质量检测') {
            steps {
                // name是我们在系统配置中设置的name
                withSonarQubeEnv(installationName: 'sonar', credentialsId: 'sonar-key') {
                    sh "$SCANNER_HOME/sonar-scanner -Dsonar.java.binaries=target -Dsonar.projectKey=$JOB_NAME"
                }
            }
        }
        stage('构建镜像/推送镜像') {
            steps {
                sh """set -e \\
                && mv target/*.jar docker/ \\
                && cd docker \\
                && docker build -t $JOB_NAME:$branch . \\
                && docker tag $JOB_NAME:$branch $PRIVATE_REGISTRY/$JOB_NAME:$branch \\
                && docker login -u $USER -p $PWD $PRIVATE_REGISTRY \\
                && docker push $PRIVATE_REGISTRY/$JOB_NAME:$branch \\
                && docker image prune -f"""
            }
        }
        stage('拉取镜像/发布容器') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'omv', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /share/jenkins/demo/script/publish.sh $PUBLIC_REGISTRY $JOB_NAME $branch", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '$JOB_NAME', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'script/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
            }
        }
    }
}

提取共享库

如上我们有一些公共的变量,这些变量我们都可以定义到share liberary,方便其他流水线复用。

复用我们之前创建的jenkinslib项目,我们增加一个var/dockerVar.groovy

缺点:定义一个变量就需要@groovy.transform.Field注解,严重冗余,这时候我们可以通过src中定义类,将变量包装成属性即可,这个大家自己试一下就行了

// docker registry
@groovy.transform.Field
PRIVATE_REGISTRY = '10.10.1.199:9082'
@groovy.transform.Field
PUBLIC_REGISTRY = '10.10.1.199:9083'
@groovy.transform.Field
USER = "admin"
@groovy.transform.Field
PWD = "123456"

jenkinsfile做一下调整:同样创建在jenkinslib工程,目录:jenkinsfiles/docker.jenkinefile

只是拿环境变量来做一个演示

@Library('mylib@master') _

pipeline {
agent any

tools {
    // Install the Maven version configured as "M3" and add it to the path.
    maven "maven3.8.6"
}

environment {
    SCANNER_HOME = "${tool 'scanner4.7'}/bin"
}

stages {
    stage('拉取gitlab项目代码') {
        steps {
            // 检出代码
            checkout([$class: 'GitSCM', branches: [[name: '$branch']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-ssh', url: 'ssh://git@10.10.1.199:2224/devops/helloworld.git']]])
        }
    }
    stage('构建代码') {
        steps {
            // 执行shell脚本 
            sh 'mvn clean package verify'
        }
    }
    stage('代码质量检测') {
        steps {
            // name是我们在系统配置中设置的name
            withSonarQubeEnv(installationName: 'sonar', credentialsId: 'sonar-key') {
                sh "$SCANNER_HOME/sonar-scanner -Dsonar.java.binaries=target -Dsonar.projectKey=$JOB_NAME"
            }
        }
    }
    stage('构建镜像/推送镜像') {
        steps {
            sh """set -e \\
            && mv target/*.jar docker/ \\
            && cd docker \\
            && docker build -t $JOB_NAME:$branch . \\
            && docker tag $JOB_NAME:$branch $dockerVar.PRIVATE_REGISTRY/$JOB_NAME:$branch \\
            && docker login -u $dockerVar.USER -p $dockerVar.PWD >$dockerVar.PRIVATE_REGISTRY \\
            && docker push $dockerVar.PRIVATE_REGISTRY/$JOB_NAME:$branch \\
            && docker image prune -f"""
        }
    }
    stage('拉取镜像/发布容器') {
        steps {
            sshPublisher(publishers: [sshPublisherDesc(configName: 'omv', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /share/jenkins/demo/script/publish.sh $dockerVar.PUBLIC_REGISTRY $JOB_NAME $branch", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '$JOB_NAME', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'script/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
        }
    }
}
}

我们新建一个jenkins job:pipeline-demo-sharelib,使用通过scm获取jenkinsfile文件,

注意:我们这里将jenkinsfile名字前缀设置成了变量,这样我们可以随意使用其他前缀的文件,并且记住我们jenkinsfile中使用了git参数branch,不要漏掉

但我们不能通过当前工程的分支来作为参数了,因为当前工程拉取的是jenkinslib工程,而不是HelloWorld了,当然大家也可以做一下映射,我这里改成手动数据,简单演示一下
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FRP进阶篇之解决方案

目录 一、前言 二、多客户端使用 1、场景 2、解决方案 3、使用 3.1、服务端配置 3.2、客户端配置 3.3、结果验证 三、dashboard 仪表盘使用 1、场景 2、解决方案 3、使用 4、验证 5、使用Java调用API接口获取设备列表 5.1、样例代码 5.2、结果验证 一、前言 通…

27. SAP OData 框架里的缓存(Cache)设计专题讲座

本教程前一篇文章,25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器,我们介绍了 SAP OData 框架处理 metadata 请求的流程,如下图所示: 其中左边的分支,当读取本地服务器的 metadata 时,OData 框架会从 Share Memory 即共…

npm-开发自己的包并发布

目录 1.开发自己的包 1.1. 需要实现的功能 1.2. 初始化包的基本结构 1.3. 初始化 package.json 1.4. 在 index.js 中定义格式化时间的方法 1.5. 在 定义转义 和还原HTML 的方法 1.6. 编写包的说明文档 1.7包的入口文件 2.发布自己的包 2.1注册npm账号 2.2登录npm账…

Jmeter(二十):jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入,而且每次登录时图片验证码都是随机的;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段,然后再登录接口中使用; 通过jmeter对图片验证码…

Qt下载安装及配置教程

进入qt中文网站:https://www.qt.io/zh-cn/ 下载开源版 往下滑,下载Qt在线安装程序 它已经检测出我的是windows系统,直接点击download就好。如果是其它的系统,需要找到对应自己系统的安装包。 然后跟网速有关,等…

计算机毕业设计springboot+vue大学生个人财务管理系统

项目介绍 本大学生个人财务管理系统设计目标是实现收入和支出的信息化管理,提高管理效率,使得支出收入管理工作规范化、科学化、高效化。 本文研究的大学生个人财务管理系统基于springboot架构,采用JSP技术、JAVA编程语言和MYSQL数据库设计开发。通过本系统,实现了管理员和用户…

设计模式之享元模式

Flyweight design pattern 享元模式的概念、享元模式的结构、享元模式的优缺点、享元模式的使用场景、享元模式的实现示例、享元模式的源码分析 1、享元模式的概念 享元模式,即运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少…

基于nodejs博客系统的设计与实现.rar(论文+源码+ppt文档+视频录制)

第一章绪论 3 1.1项目开发的背景和意义 3 1.2国内外研究的现状 4 1.3研究的主要内容 4 第2章系统相关技术介绍 5 2.1 B/S结构技术介绍 5 2.2nodejs技术介绍 6 2.3mysql数据库 7 第三章系统分析 8 3.1可行性分析 8 3.2功能需求分析 8 3.2.1登录模块需求分析 9 3.2.2分类博客模块…

NetSuite 如何统一用户的时区

在NetSuie的原始设置中,用户可以设置自己的时区,这在单一国家的环境中实际上是个缺点。例如,有些客户并没有注意到自己的时区是否是本国时区,所以在查看系统日志时,发现时间不对头,产生了困扰。所以&#x…

操作系统,计算机网络,数据库刷题笔记13

操作系统,计算机网络,数据库刷题笔记13 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql&#xf…

SpringBoot3.0自定义stater整合chatGPT49种应用场景代码已开源

导读 导读 | 12月总体来说互联网的技术圈是非常热闹的,chatGPT爆火,SpringBoot3.0发布等重磅陆消息续进入大家的视线,而本文作者将以技术整合的角度,带大家把最火的两个技术整合在一起。读完本文,你将熟悉SpringBoot3…

我的java学习

犹豫了很久,还是打算简述一下自己学java 的历程,花了些时间,但结果不赖 文章目录从0的开始开始加速过度项目学习懵懂的进入项目进入综合项目学习第二次学习开始从0的开始 没有计算机基础,英语也非常糟糕。 起初也时常在想&#x…

Java+MySQL基于SSM的高校科研仪器共享平台

随着在校学生人数的不断增加,学生的数量也在不断的增加,同时面临的就是如何更加方便快捷和高效的管理高校科研仪器的问题,传统模式的科研仪器管理明显已经不能够满足当下的需求,于是我们提出了高校科研仪器共享平台的设计与开发。 本课题是一个基于SSM的管理系统,本高校科研仪器…

架构设计(六):引入消息队列

架构设计(六):引入消息队列 作者:Grey 原文地址: 博客园:架构设计(六):引入消息队列 CSDN:架构设计(六):引入消息队列…

【LeetCode】1703. 得到连续 K 个 1 的最少相邻交换次数

题目描述 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动,你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数。 示例 1: 输入:nums [1,0,0,1,0,1], k 2 输出&#xf…

入门:镜像结构介绍

前面我们了解了Docker的相关基本操作,实际上容器的基石就是镜像,有了镜像才能创建对应的容器实例,那么我们就先从镜像的基本结构开始说起,我们来看看镜像到底是个什么样的存在。 我们在打包项目时,实际上往往需要一个基…

C++PrimerPlus 第八章 函数探幽-8.1 C++内联函数

目录 8.1 C内联函数 8.1 C内联函数 内联函数是C为提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别不在于编写方式,而在于C编译器如何将它们组合到程序中。要了解内联函数与常规函数之间的区别,必须深入到程序内部。 编译过程的最终…

微机原理与接口技术笔记

文章目录前言储存系统与技术材料高速储存器缓冲储存器(Cache)材料,局部性,访问方式Cache全相联映射Cache交换与一致性单核CPU一致性处理多核CPU的MESI协议主储存器(内存)主要技术指标容量带宽内存模组与内存…

牛客题霸sql入门篇之条件查询(四)之高级查询

牛客题霸sql入门篇之条件查询(四)之高级查询 4 计算函数 4.1 查询GPA最高值 4.1.1 题目内容 4.1.2 示例代码 SELECT gpa FROM user_profile WHERE university复旦大学 ORDER BY gpa desc limit 1; -- LIMIT 初始位置,记录数 一个参数就是记录数4.1.3 运行结果 4…

Python Flask构建微信小程序订餐系统 (四)

🔥 创建微信小程序 🔥 微信开发者工具下载 并完成安装 在PyCharm 工具里面 order目录下面 创建mina 文件夹 通过微信小程序开发工具创建微信小程序工程 获取微信小程序ID