jenkins 部署应用到多个环境

在日常开发的过程中,我们经常会遇到将应用程序部署到多个环境的需求场景,如会先发布到测试环境,由测试人员进行测试,成功之后,会继续将当前应用部署到集成环境,进行集成测试,全部通过后,再继续将应用部署到生产环境,即完成一整个上线的流程。

本文将介绍如何基于流水线的方式,将应用部署到多个环境,本次之多两个环境,分别是测试环境和生产环境,可以根据实际情况进行优化调整。

创建项目

如上,创建一个流水线的项目

设置参数

如上图所示,设置一个标识参数,是否部署到生产环境

配置流水线

流水线的配置,如下图所示,是整个项目配置的核心所在,我们需要在此处设置项目构建工具maven,拉取项目代码,构建项目代码,将打包后的文件上传到部署的服务器上,在远程服务器上启动应用以及最后的清理等步骤。

设置环境变量

设置环境变量是为了将之前配置的参数写到环境变量中,供后续阶段使用

environment {
        DEPLOY_TO_PROD = "${params.deployToProd}"
    }

以上配置之后,后续便可以通过env.DEPLOY_TO_PROD进行引用。

配置maven

tools {
        maven "maven"
    }

以上配置了项目的构建工具maven,maven的值是之前在全局设置中配置的,可参考之前的文章。

构建

stages {

}

配置了构建的阶段,可以在里面配置多个stage代码块,每个块代表一个阶段,如构建、部署测试、部署生产等。

构建项目阶段

在构建阶段,我们拉取代码,并使用maven进行构建,构建成功后,将构建成功的包进行归档,供后续阶段使用

stage('构建') {steps {// Get some code from a GitHub repositorygit branch: 'main', credentialsId: 'git', url: 'http://ip:port/projectName.git'// Run Maven on a Unix agent.sh "mvn -Dmaven.test.skip=true clean package"}post {// If Maven was able to run the tests, even if some of the test// failed, record the test results and archive the jar file.success {archiveArtifacts 'target/*.jar'archiveArtifacts 'Dockerfile'}}}

在stage中,通过steps配置当前阶段的构建步骤,在上述片段中,先拉取代码,并使用mvaven进行构建。post片段是在maven执行成功后进行构建,我们将项目构建成功后的jar包以及项目根目录下的Dockerfile进行归档。在下一个步骤中,会将归档后的文件上传到部署的服务器中。

部署测试环境

在将项目的部署文件归档后,便可以部署到测试环境了,片段如下

在上个阶段,我们配置的是部署到测试环境,首先使用ssh over publisher插件,将归档的构建上传到服务器,在post中,设置了success 片段,是在上传成功后执行的片段,在此我们使用sh 命令,在远程服务器上执行命令,本项目使用了docker,因此,ssh中的命令都是关于docker的,大家可以根据实际情况,进行调整。此外,需要注意 ssh -o StrictHostKeyChecking=no root@ip,其中ip是远程服务器的ip地址,需要提前配置私匙,之前文章有讲解,可以参考下。此处,无须设置密码的操作。

部署生产环境

在部署生产环境时,需要判断环境变量DEPLOY_TO_PROD是否符合条件,如果符合,则执行生产阶段的代码,否则不执行。如下图所示

本例子中,实在生产环境部署了两台服务器,因此sshPublisher是两个,而在post中,使用了script脚本,因为要操作两台服务器,变脸执行每台服务器的命令,大家可以根据需要调整。

清理阶段

post {always {// 清理工作空间cleanWs()}}

如上,执行部署完成后的清理操作。

整体代码如下:

pipeline {agent anyparameters {choice(name: 'deployToProd',choices: ['否','是'],description: "如果需要部署到生产,选择【是】")}environment {DEPLOY_TO_PROD = "${params.deployToProd}"}tools {// Install the Maven version configured as "M3" and add it to the path.maven "maven"}stages {stage('构建') {steps {// Get some code from a GitHub repositorygit branch: 'main', credentialsId: 'git', url: 'http://ip:port/projectName.git'// Run Maven on a Unix agent.sh "mvn -Dmaven.test.skip=true clean package"}post {// If Maven was able to run the tests, even if some of the test// failed, record the test results and archive the jar file.success {archiveArtifacts 'target/*.jar'archiveArtifacts 'Dockerfile'}}}stage("测试") {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'ss', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "Success"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}post {success {sh '''ssh -o StrictHostKeyChecking=no root@remote_ip "cd /app/dir"'''}}}stage('线上环境') {when {expression { return env.DEPLOY_TO_PROD == '是' }}steps {sshPublisher(publishers: [sshPublisherDesc(configName: '10_202', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])sshPublisher(publishers: [sshPublisherDesc(configName: '10_201', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo "s"', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'refine', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}post {success {script {def servers = ['remote_ip1','remote_ip2']servers.each { server ->echo "Processing server: ${server}"sh """ssh -o StrictHostKeyChecking=no root@${server} "cd /home/app/dir# 其他linux命令""""}}}}}}post {always {// 清理工作空间cleanWs()}}
}

以上是完成的流水线代码,大家可以根据实际情况进行调整。

部署效果,如上图所示!

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

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

相关文章

RAG 聊天机器人:用 Langchain 和 Streamlit开启与 PDF 的智能对话

与大量 PDF 文档的交互如今变得前所未有地便捷与智能。想象一下,您可以轻松与您的笔记、书籍和各种文档进行无缝对话,不再需要繁琐的手动查找和处理。 这篇文章将带您逐步构建一个基于 Multi-RAG 和 Streamlit 的 Web 应用程序,该应用程序通过 AI 驱动的聊天机器人来读取、…

以实时,见未来——DolphinDB 2024 年度峰会圆满举办

2024年9月6日,“以实时,见未来”—— DolphinDB 2024 年度峰会在杭州圆满落下帷幕。本次峰会由主会场与三个专题分会场组成,众多金融机构领导与专家、行业领袖、高校与研究机构学者等近300位嘉宾共襄盛举,一同探讨数智化浪潮下金融…

基于JAVA+SpringBoot+Vue的工程教育认证的计算机课程管理平台

基于JAVASpringBootVue的工程教育认证的计算机课程管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接…

第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)

目录 大会介绍 基本信息 合作单位 主讲嘉宾 会议组委 征文主题 ​ 参会方式 会议日程 中国-天津 | 2024年10月25-27日 | 会议官网:www.iiip.net 大会介绍 第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)将于202…

MNIST数据集内容查看

测试数据集:t10k-images-idx3-ubyte.gz(1.57 MB ,包含10,000个样本)。测试数据集标签:t10k-labels-idx1-ubyte.gz(4.43 KB,包含10,000个样本的标签)训练数据集:train-ima…

使用 Parallel 类进行多线程编码(上)

用 C# 进行多线程编程有很多方式,比如使用 Thread 对象开启一个新线程,但这已经是一种落后的写法了,现在推荐的写法是使用 Parallel 类,它可以让我们像写传统代码一样编写多线程的程序,Parallel 类有三个常用的方法如下…

PyTorch 创建数据集

图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件,文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步,首先创建数据类对象 此时可以想象为单个数据单元的…

在这12种场景下会使Spring事务失效--注意防范

在某些业务场景下,如果一个请求中,需要同事写入多张表的数据,但为了保证操作的原子性(要么同事插入数据成功,要么同事插入失败),例如,当我们创建用户的时候,往往会给用户…

【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

1 灰度图 import cv2 # 导入 OpenCV 库,用于图像处理 import numpy as np # 导入 NumPy 库,用于数组操作 import matplotlib.pyplot as plt # 导入 Matplotlib 库,用于绘图# %matplotlib inline 是 Jupyter Notebook 特有的魔法命令&…

ABC 370 E - Avoid K Partition

原题链接:E - Avoid K Partition 题意:给长度为n的数组,将数组划分成任意份,但是每一份的总和都不能是k,问有多少种分割方法。 思路:dp,f[i],代表前i个元素满足题意的划分的总和&a…

Windows--linux共享文件夹

1、如果共享文件夹设置在Windows上面 文件夹设置 个人家里电脑通常不设置用户名密码 linux端mount命令行 mount -t cifs -o usernamewade,vers3.0 //192.168.0.143/openvswitch-2.17.10 /root/windows

适用于计算机视觉的机器学习

使用筛选器将效果应用于图像的功能在图像处理任务中非常有用,例如可能使用图像编辑软件执行的任务。 但是,计算机视觉的目标通常是从图像中提取含义或至少是可操作的见解,这需要创建经过训练以基于大量现有图像识别特征的机器学习模型。 卷积…

mysql快速定位cpu 占比过高的sql语句

mysql快速定位cpu 占比过高的sql语句 当MySQL数据库的CPU使用率异常升高时,定位导致问题的SQL语句可以通过以下步骤进行 1、使用top命令找出mysl进程中占用CPU靠前的线程 #找出mysql 的进程号 ps -ef | grep mysql#根据进程号,找出占用CPU靠前的线程号…

树莓派通过串口驱动HC-08蓝牙模块

树莓派通过串口驱动HC-08蓝牙模块 文章目录 树莓派通过串口驱动HC-08蓝牙模块一、HC-08蓝牙模块介绍二、树莓派与蓝牙模块硬件连接三、树莓派通过蓝牙控制设备 一、HC-08蓝牙模块介绍 蓝牙模块,是一种集成的蓝牙功能的PCB板,用于短距离无线通信&#xff…

避障小车—51单片机

一、小车底盘组装 根据视频的安装步骤安装 二、 电机模块开发 2.1 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,但是不对,根据下节课实际调试 IA1输入高电平,IA1输入低电平,【OA1 OB1…

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能,还有两个需要实现: 新增员工 修改员工 首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在&quo…

PDF样本图册转换为一个链接,随时打开无需印刷

想象一下,您手中有一本厚重的样本图册,里面包含了丰富多样的内容,如产品介绍、项目方案、学术论文等。在过去,您需要逐一翻阅、筛选,甚至为了便于查看,不得不将其印刷出来。如今,借助先进的数字…

机器学习:opencv--图像形态学

目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀&#xff08…

都2024年了还不明白Redis持久化?RDB文件、AOF文件、AOF重写

都2024年了,不会还有人不知道redis的RDB和Aof吧?不知道没关系,看完这篇文章我相信你就会有个大概的了解和认识了 1. Redis持久化 1.1 持久化概念 Redis本身是一个基于内存的数据库,它提供了RDB持久化、AOF持久化两种方式&#…

田纳西州橡树岭全球最快的超级计算机名为Frontier

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…