从零开始带你实现一套自己的CI/CD(四)Jenkins Pipeline流水线

news/2024/11/7 17:00:01/

目录

  • 一、简介
  • 二、Groovy
    • 2.1 HelloWorld
    • 2.2 Pipeline script from SCM
  • 三、Jenkinsfile
    • 3.1 拉取代码
    • 3.2 代码质量检测
    • 3.3 构建代码
    • 3.4 制作镜像并发布镜像仓库
    • 3.5 部署到目标服务器
    • 3.6 完整的Jenkinsfile
    • 3.7 参数配置
    • 3.8 通过参数构建
    • 四、添加邮件通知
    • 4.1 配置Jenkins邮件配置
    • 4.2 生成Pipeline语法
    • 4.3 邮件发送内容
  • 完整Jenkinsfile文件

一、简介

从零开始带你实现一套自己的CI/CD(一)Jenkins
从零开始带你实现一套自己的CI/CD(二)Jenkins+Sonar Qube
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor

通过前面的文章,我们已经实现了Jenkins 自由风格部署项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。

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

所以Pipeline相对自由风格或者其他的项目风格更容易操作。
下面我们就来介绍一下使用Jenkins Pipeline构建项目。

二、Groovy

2.1 HelloWorld

使用Jenkins Pipeline部署项目,需要编写Jenkinsfile文件,Jenkinsfile文件使用groovy语言进行编写的。
下面是groovy编写的HelloWorld程序:

pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'}}}
}

在这里插入图片描述

点击应用 保存,返回项目点击立即构建

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

2.2 Pipeline script from SCM

但是我们并不在Jenkins这里编写脚本,而是把Jenkinsfile文件放在项目里,Jenkins从Git仓库拉去代码执行Jenkinsfile文件中的脚本。
需要将Jenkins流水线定义为Pipeline script from SCM,输入Git仓库的地址。

在这里插入图片描述

在项目中新建一个Jenkinsfile文件:

pipeline {agent anystages {stage('拉取Git代码') {steps {echo '拉取Git代码'}}stage('检测代码质量') {steps {echo '检测代码质量'}}stage('构建代码') {steps {echo '构建代码'}}stage('制作自定义镜像并发布Harbor') {steps {echo '制作自定义镜像并发布Harbor'}}stage('基于Harbor部署工程') {steps {echo '基于Harbor部署工程'}}}
}

然后通过Jenkins进行构建,可以看到每个步骤构建的过程。

三、Jenkinsfile

上面的脚本只是输出了日志,现在我们将一一实现上面的每个步骤。
在这里插入图片描述
Jenkins为我们提供了生成Groovy脚本的方法。

3.1 拉取代码

进入流水线语法,选择checkout,填入Git地址,点击生成流水线语法即可。
在这里插入图片描述
在这里插入图片描述

checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'https://gitee.com/L1692312138/jenkins-demo.git']]])

我们将这个脚本直接粘贴到上面拉取Git代码的地方。

3.2 代码质量检测

执行脚本进行Sonar代码质量检测

/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

Sonar可以在此处生成Token:
在这里插入图片描述
在这里插入图片描述

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=7d66af4b39cfe4f52ac0a915d4c9d5c513207098'

3.3 构建代码

执行shell脚本进行Mavne打包(注意:Jenkins安装Mavne的位置)

/var/jenkins_home/apache-maven-3.8.6/bin/mvn clean package -DskipTests

在这里插入图片描述

sh '/var/jenkins_home/apache-maven-3.8.6/bin/mvn clean package -DskipTests'

3.4 制作镜像并发布镜像仓库

cp ./target/*.jar ./deploy/
cd ./deploy
docker build -t ${JOB_NAME}:${tag} .
docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}

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

   sh '''cp ./target/*.jar ./deploy/cd ./deploydocker 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}'''

在这里插入图片描述

3.5 部署到目标服务器

连接到目标服务器,执行目标服务器准备好的deploy.sh脚本

deploy.sh $harbor_url $harbor_project_name $JOB_NAME $tag $container_port $host_port

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

sshPublisher(publishers: [sshPublisherDesc(configName: '131', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'deploy.sh $harbor_url $harbor_project_name $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)])

注意:在之前的文章中已经准备了deploy.sh脚本和配置了目标服务器

3.6 完整的Jenkinsfile

pipeline {agent anyenvironment{harborHost = '192.168.153.131:80'harborRepo = 'helloworld'harborUser = 'admin'harborPasswd = 'Harbor12345'}// 存放所有任务的合集stages {stage('Pull Code') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'https://gitee.com/L1692312138/jenkins-demo.git']]])}}//         stage('Sonar Scan') {
//             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=7d66af4b39cfe4f52ac0a915d4c9d5c513207098'
//             }
//         }stage('Maven Build') {steps {sh '/var/jenkins_home/apache-maven-3.8.6/bin/mvn clean package -DskipTests'}}stage('Push Harbor') {steps {sh '''cp ./target/*.jar ./deploy/cd ./deploydocker 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('Publish Over SSH') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: '131', 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)])}}}
}

因为博主的机器是arm64架构,sonar-scanner不支持这个架构,所以注释了。
在这里插入图片描述

3.7 参数配置

在Jenkinsfile中使用了$符号取值,我们需要配置这些变量。

  1. Git 参数 tag
  2. 字符参数 container_port
  3. 字符参数 host_port

在这里插入图片描述

在这里插入图片描述

3.8 通过参数构建

在这里插入图片描述

在这里插入图片描述
可以看到构建成功了
去Harbor也可以看到镜像已经上传
目标服务器容器也已经运行了
在这里插入图片描述

Jenkins Pipeline构建成功!

四、添加邮件通知

在项目构建成功后,发送邮件通知构建结果

4.1 配置Jenkins邮件配置

下载Jenkins插件 Email Extension Plugin
在这里插入图片描述

进入QQ邮箱设置:
开启POP3/SMTP服务
在这里插入图片描述
在这里插入图片描述

邮箱POP3服务器(端口995)SMTP服务器(端口465或587)
qq.compop.qq.comsmtp.qq.com

生成授权码

在这里插入图片描述
在Jenkins设置中配置 系统管理员邮件地址
在这里插入图片描述

在Jenkins设置中配置邮件通知

在这里插入图片描述

点击 Test Configuration 测试配置是否成功

在这里插入图片描述

4.2 生成Pipeline语法

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

 post {always {emailext body: '${FILE,path="email.html"}', subject: '【构建通知】:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: 'xxxx@qq.com'}}

4.3 邮件发送内容

在项目中新建email.html文件:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head><body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"offset="0">
<table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"><tr>本邮件由系统自动发出,无需回复!<br/>各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br><td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td></tr><tr><td><br /><b><font color="#0B610B">构建信息</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>项目名称 : ${PROJECT_NAME}</li><li>构建编号 : 第${BUILD_NUMBER}次构建</li><li>触发原因: ${CAUSE}</li><li>构建状态: ${BUILD_STATUS}</li><li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li><li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li><li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li><li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li></ul><h4><font color="#0B610B">失败用例</font></h4><hr size="2" width="100%" />$FAILED_TESTS<br/><h4><font color="#0B610B">最近提交</font></h4><hr size="2" width="100%" /><ul>${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}</ul>详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/></td></tr>
</table>
</body>
</html>

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

完整Jenkinsfile文件

pipeline {agent anyenvironment{harborHost = '192.168.153.131:80'harborRepo = 'helloworld'harborUser = 'admin'harborPasswd = 'Harbor12345'}// 存放所有任务的合集stages {stage('Pull Code') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'https://gitee.com/L1692312138/jenkins-demo.git']]])}}//         stage('Sonar Scan') {
//             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=7d66af4b39cfe4f52ac0a915d4c9d5c513207098'
//             }
//         }stage('Maven Build') {steps {sh '/var/jenkins_home/apache-maven-3.8.6/bin/mvn clean package -DskipTests'}}stage('Push Harbor') {steps {sh '''cp ./target/*.jar ./deploy/cd ./deploydocker 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('Publish Over SSH') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: '131', 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 {always {emailext body: '${FILE,path="email.html"}', subject: '【构建通知】:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: 'liush99@foxmail.com'}}
}

http://www.ppmy.cn/news/11478.html

相关文章

CAD转换PDF怎么转换?新手必备的方法

相信很多从事建筑类的相关工作的小伙伴们对CAD文件都并不陌生&#xff0c;在设计图纸和数据更改大都是使用这类文件的专业工具。这类文件的专业性较强设计出来的图纸也比较规范&#xff0c;但就有一个问题比较麻烦&#xff0c;那便是在不同设备打开需要对应的查阅软件&#xff…

『 MySQL篇 』:库操作、数据类型

目录 目录 一、初识数据库 数据库 数据库管理系统 SQL语言 二、详解MySQL MySQL 存储引擎 三、简单的库操作 设置数据库的编码字符集 创建数据库 显示数据库 使用数据库 删除数据库 四、MySQL数据类型 数值类型 字符串类型 日期类型 一、初识数据库 学习 MyS…

为什么 TCP 建立连接需要三次握手

TCP 协议是我们几乎每天都会接触到的网络协议&#xff0c;绝大多数网络连接的建立都是基于 TCP 协议的&#xff0c;学过计算机网络或者对 TCP 协议稍有了解的人都知道 —— 使用 TCP 协议建立连接需要经过三次握手&#xff08;three-way handshake&#xff09;。 如果让我们简…

DMIPS, FLOPS, OPS概念

DMIPS DMIPS(Dhrystone Million Instructions executed Per Second)&#xff1a;Dhrystone是测量处理器运算能力的最常见基准程序之一&#xff0c;常用于处理器的整型运算性能的测量。Dhrystone是一种整数运算测试程序。换句话说&#xff0c;就是使用Dhrystone这种程序在不同的…

【Python】如何使用python将一个py文件变成一个软件?

系列文章目录 这个系列文章将写一些python中好玩的小技巧。 第一章 使用Python 做一个软件 目录 系列文章目录 前言 一、第一步&#xff1a;写好文件 二、第二步&#xff1a;生成程序 1.安装库 2.使用安装的库进行转化 总结 前言 本文重点说如何将py文件转化为exe文件…

LeetCode150.逆波兰表达式

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意 有效的算符为 、-、* 和/。…

SegFormer笔记(1)安装

一、代码地址github地址&#xff1a;https://github.com/NVlabs/SegFormer二、我的系统配置&#xff1a;1、硬件2、软件win10&#xff0c;vs2022&#xff0c;python3.7三、创建虚拟环境conda create -n MySegFormer python3.7 numpy conda activate MySegFormer python会显示如…

JVM—类加载与字节码技术

目录一、类文件结构1、魔术2、版本3、常量池二、字节码指令1、javap工具2、图解方法执行流程3、通过字节码指令来分析问题4、构造方法5、方法调用6、多态原理——HSDB7、异常处理四、类加载阶段五、类加载器六、运行期优化一、类文件结构 以一个简单的HelloWord.java程序为例 …