Jenkins使用pipeline流水线部署项目

新建流水线任务

前面的项目整个部署日志都在一个控制台页面,出现了错误不能快速定位不方便查阅

Jenkins提供了流水线方式的任务

这里我新建一个叫“pipeline-mytest”的流水线任务

在这里插入图片描述

在流水线出右侧有内置的样式,这里我选择了helloworld的样式。

在这里插入图片描述

构建一下看一下效果,右侧会显示流程执行的时间、日志、是否成功
在这里插入图片描述

流水线脚本语法使用

将流水线里面的样式脚本修改成

//所有脚本命令放在pipeline中
pipeline{//指定任务哪个集群节点执行agent any	//声明全局变量,给后面使用environment{key = 'value'}stages{stage('拉取Gitlab仓库代码'){steps{echo ''}}stage('Maven构建项目'){steps{echo ''}}stage('SonarQube检查代码质量'){steps{echo ''}}stage('制作自定义Docker镜像'){steps{echo ''}}stage('推送镜像到Harbor仓库'){steps{echo ''}}stage('通知目标服务器拉取镜像并启动'){steps{echo ''}}}
}

重新构建看一下效果

在这里插入图片描述

Jenkinsfile维护脚本

流水线还提供了另一个方式,基于Git
在定义处选择SCM,填写你的Gitlab仓库地址

在这里插入图片描述

需要在你填写的仓库中,新建一个叫Jenkinsfile的文件
然后把之前的脚本命令,粘贴到里面去

在这里插入图片描述

再次构建查看效果,相比之前多了一步去Gitlab拉取脚本的步骤

在这里插入图片描述

pipeline拉取Gitlab代码

同样还是通过Gitlab打的标签版本去拉取代码,所以需要先填加个version参数
在配置的最底下有“流水线语法”

在这里插入图片描述

选择checkout:Check out from version control,填写要拉去代码的仓库地址和分支

在这里插入图片描述

然后在最底下点击“生产流水线脚本”按钮

在这里插入图片描述

接着将脚本命令复制到Jenkinsfile文件中拉取仓库代码步骤中

在这里插入图片描述
接着将脚本命令复制到Jenkinsfile文件中拉取仓库代码步骤中

注意需要把*/main替换成我们设置的构建参数version,不然默认是去拉取最新代码而不是我们指定拉取的标签版本代码

checkout scmGit(branches: [[name: '${version}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.170.111:8888/root/jenkins-cicd-mytest.git']])

在这里插入图片描述

pipeline流水线Maven构建项目

同样去生产脚本命令的地方选择"sh:Shell Script"

输入要执行的命令进行生产

在这里插入图片描述
再把生成的流水线脚本复制到Gitlab的Jenkinsfile文件里面去

在这里插入图片描述

验证很简单,Jenkins构建完后去到Jenkins容器的工作目录下,看是否生产target目录
如下,我构建了两次,第一次构建下载各种包花了一分多钟,第二次只需要4秒。

在这里插入图片描述

pipeline流水线SonarQube检查代码

和Maven一样,在生成脚本的地方,把之前在自定义风格里面指定的参数放到生成脚本“sh:Shell Script”命令中生成

需要在各个参数前面加上“-D”,并且多了个Sonar.login指定令牌(去SonarQube账户下再生成一个令牌)

/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target -Dsonar.login=8b2d57757d51a640fa47d90cce47b2d480170093

在这里插入图片描述
放入到Gitlab的Jenkinsfile文件中

sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target -Dsonar.login=8b2d57757d51a640fa47d90cce47b2d480170093'

在这里插入图片描述
构建,扫描成功
在这里插入图片描述

pipeline流水线自定义Docker镜像

通过Docker命令,还是直接用“sh:Shell Script”生成

移动target目录下的jar包到docker目录中,镜像命名为当前任务名:版本(即pipeline-mytest:Gitlab拉取的标签版本)

后面跟着的docker/目录指定Dockerfile文件在此目录下,根据它构建镜像。

mv target/*.jar docker
docker build -t ${JOB_NAME}:$version docker/

在这里插入图片描述

将脚本复制到Jenkinsfile文件相应流程中

sh '''mv target/*.jar docker
docker build -t ${JOB_NAME}:$version docker/'''

在这里插入图片描述
构建只花了1秒,并成功构建了

在这里插入图片描述
去Jenkins服务器上查看镜像已经生成了个pipeline-mytest的镜像

在这里插入图片描述

pipeline流水线推送镜像到Harbor仓库

在生成脚本之前,先修改一下Jenkinsfile文件,增加几个变量:仓库地址、仓库名称、用户、密码

在这里插入图片描述
来到生成脚本页面,编写docker命令生成脚本

docker login -u ${harbor_user} -p ${harbor_pwd} ${harbor_addr}
docker tag ${JOB_NAME}:${version} ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}
docker push ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}

在这里插入图片描述
复制到Jenkinsfile文件中对应的流程

sh '''docker login -u ${harbor_user} -p ${harbor_pwd} ${harbor_addr}
docker tag ${JOB_NAME}:${version} ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}
docker push ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}'''

在这里插入图片描述
构建流水线查验,花费2秒无报错

在这里插入图片描述
来Harbor仓库看一下,已经上传上来了,Monster仓库下多了个pipeline-mytest的镜像。

在这里插入图片描述

pipeline流水线通知目标服务器部署项目

部署项目需要映射容器端口和宿主机端口,和之前一样先给在pipeline-mytest流水线添加2个构建参数

这里新增了host_port和container_port

在这里插入图片描述

来到生成脚本页面选择“sshPublisher: Send build artifacts over SSH”

SSH Publisher选择要通知的目标服务器

设置要执行的命令点击生成,这里的命令不需要使用括号括起来,这里是通过执行脚本的时候去引用

deploy.sh$harbor_addr $harbor_warehouse $JOB_NAME $version $host_port $container_port

在这里插入图片描述
把生成的命令拷贝到Jenkinsfile文件中对应的流程

sshPublisher(publishers: [sshPublisherDesc(configName: '应用服务器-170.111', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'deploy.sh$harbor_addr $harbor_warehouse $JOB_NAME $version $host_port $container_port', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

需要注意把单引号修改成双引号,不然不会生效,Jenkinsfile文件中即引用的Jenkinsfile当中的全局变量,也引用的Jenkins提供的参数。
在这里插入图片描述
构建前,我修改项目代码增加pipeline字样
在这里插入图片描述
然后提交到Gitlab仓库,重新打个标签v1.0.3

在这里插入图片描述
通过pipeline构建项目,由于之前的mytest自由风格构建的任务,构建了一个8081端口的项目没有停用,这里我修改一下宿主机映射的端口为8082
在这里插入图片描述
没有报错,显示黄色不稳定,查看后面的每一个流程都没有保存,大概率是最后一步远程到目标服务器执行的脚本有问题。
在这里插入图片描述
查看日志,有个报错状态 Status [127]],在 Jenkins 中报错状态 127 通常表示找不到命令或可执行文件。这可能是由于路径问题、权限问题或缺少必要的软件包等原因引起的。

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [127]]

在这里插入图片描述
检查脚本,少了个空格,修改即可
在这里插入图片描述
重新构建,成功
在这里插入图片描述
访问页面没问题

在这里插入图片描述

Jenkinsfile脚本文件全部内容

//所有脚本命令放在pipeline中
pipeline{//指定任务哪个集群节点执行agent any	//声明全局变量,给后面使用environment{//Harbor地址harbor_addr = '192.168.170.111:80'//仓库名harbor_warehouse = 'monster'//用户名harbor_user = 'admin'//密码harbor_pwd = 'Harbor12345'}stages{stage('拉取Gitlab仓库代码'){steps{checkout scmGit(branches: [[name: '${version}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.170.111:8888/root/jenkins-cicd-mytest.git']])}}stage('Maven构建项目'){steps{sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'}}stage('SonarQube检查代码质量'){steps{sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target -Dsonar.login=8b2d57757d51a640fa47d90cce47b2d480170093'}}stage('制作自定义Docker镜像'){steps{sh '''mv target/*.jar docker
docker build -t ${JOB_NAME}:$version docker/'''}}stage('推送镜像到Harbor仓库'){steps{sh '''docker login -u ${harbor_user} -p ${harbor_pwd} ${harbor_addr}
docker tag ${JOB_NAME}:${version} ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}
docker push ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}'''}}stage('通知目标服务器拉取镜像并启动'){steps{sshPublisher(publishers: [sshPublisherDesc(configName: '应用服务器-170.111', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harbor_addr $harbor_warehouse $JOB_NAME $version $host_port $container_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt5.14.2 深入理解Qt多线程编程,掌握线程池架构实现高效并发

在高并发的软件系统中,多线程编程是解决性能瓶颈和提高系统吞吐量的有效手段。作为跨平台的应用程序开发框架,Qt为我们提供了强大的多线程支持。本文将深入探讨Qt多线程编程的实现细节,并介绍线程池的设计思想,帮助读者彻底掌握Qt…

Linux设置IP地址多种方法保姆级教程,外加修改主机名并通过生成密钥,组建机群。

[引入提问] 怎么设置linux服务器的名称? 方法1: nmtui—自动打开设置机器名称的操作界面---输入即可。重启hostnamed服务, systemctl restart system-hostnamed 方法2: 直接编辑 vim /etc/hostname ,输入新的…

Spring boot2.7整合jetcache方法缓存

前面的文章 我们讲了 spring boot 整合 jetcache 做基本字符串数据缓存 但是 我这里有个这样的逻辑 我的 domain 包下 有一个 book 属性类 里面就 id 和 name 属性 设置了 对应的 set get函数 和一个整体的构造函数 package com.example.javadom.domain;public class book {pr…

视频技术1:使用ABLMediaServer推流rtsp

ABLMediaServer定位是高性能、高稳定、开箱即用、商用级别的流媒体服务器 下边展示了如何把1个mp3作为输入源,转换为rtsp流的过程。 作用:用rtsp模拟摄像头的视频流 1、启动ABLMediaServer ABLMediaServer-2024-03-13\WinX64\ABLMediaServer.exe 配…

HTML静态网页成品作业(HTML+CSS)——世博园介绍(2个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有2个页面。 二、作品演示 三、代…

聚类分析 | Matlab实现基于PCA+DBO+K-means的数据聚类可视化

聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化 目录 聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PCA(主成分分析)、DBO(蜣螂优化算法)和K-means聚类…

挑战杯 车位识别车道线检测 - python opencv

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) …

7大结构型设计模式

结构性设计模式是软件工程中常用的一类设计模式。 作用:主要用于处理类或对象之间的组合以实现更灵活、可扩展和可维护的代码结构。 这些模式通常涉及到类和对象之间的静态组合关系,以及如何将它们组织在一起以满足特定的设计目标。 结构型模式有&#x…

【源码阅读】evmⅠ

代码位置如下: 参考link 以太坊中有一个很重要的用途是智能合约,而其中evm模块是实现了执行智能合约的虚拟机。evm可以逐条解析执行智能合约的指令。 evm中的核心对象是EVM,代表一个以太坊虚拟机。其内部主要依赖:解释器Interore…

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

文章目录 一、数据聚合1.1 聚合种类1.2 DSL实现聚合1.3 RestAPI实现聚合1.4 演示:多条件聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 DSL自动补全查询2.5 实现酒店搜索框自动补全2.5.1 修改酒店索引库数据结构2.5.2 RestAPI实现自动补全查询2.5.3 实战 三、…

基于PyTorch的视频分类实战

1、数据集下载 官方链接:https://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/#Downloads 百度网盘连接: https://pan.baidu.com/s/1sSn--u_oLvTDjH-BgOAv_Q?pwdxsri 提取码: xsri 官方链接有详细的数据集介绍&#xf…

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myecli…