人工部署方式,参考文章:

前后端分离项目的完整部署(人工部署)-CSDN博客

目标

在Windows操作系统上,使用Jenkins完成源代码的自动拉取、编译、打包、发布工作。

项目背景

前端使用vue,程序打包后为dist目录

后端使用springboot,程序打包后为jar文件

请求处理服务器为nginx,用来处理用户请求和后端请求转发(提前已经配置好了)

Jenkins服务器和系统访问服务器不是同一台服务器

实施

1.安装Java开发工具包(JDK)

Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本,因为Jenkins依赖高版本的jdk。

安装包下载地址:
Java Downloads | Oracle 中国

2.安装Jenkins

访问Jenkins官方网站,下载最新的Windows安装包。运行安装程序,按照提示完成安装。

安装包下载地址:

Jenkins 的安装和设置

安装教程(文章内容比较多,看安装部分的内容):

Windows下Jenkins软件安装说明及配置_windows jenkins配置文件在哪里-CSDN博客

3.访问Jenkins

访问地址:服务器ip+配置的端口(安装过程中自己配置的端口号)

4.安装需要的插件

因为用到svn,所以需要安装svn的插件

前端vue打包需要用到nodejs,安装插件

安装插件Publish Over SSH,用于远程连接到其他服务器传送文件或执行命令(如果不需要在Jenkins服务器外的其他服务器上发送文件或者执行命令,则不需要安装这个插件)

5.Jenkins工具配置

配置maven,用于java程序打包

配置jdk,Jenkins依赖jdk运行(jdk版本需要大于等于17)

配置maven安装路径,用于java程序打包

配置nodejs,用于vue程序打包

6.Jenkins系统配置

打包完成后,需要把要发布的文件推送到远程服务器上或者需要在远程服务器上执行命令,这些操作需要依靠SSH

配置完成,点击test,出现success,表示SSH通了。 

如果填写远程目录地址后,test提示失败,那就先把远程目录地址去掉,有时候Jenkins与SSH的兼容性不好,会导致远程目录访问不到的情况。如果发生这种情况,解决办法就是Remote Directory配置为空,然后在pipeline命令中再去写对应的目录,具体可以参考下文中的popeline语法示例。

远程服务器的防火墙需要放行22端口。

远程服务器需要安装有SSH服务,Windows安装SSH参考下面文章:

Windows安装SSH-CSDN博客

7.创建一个pipline工程

只保留最近两次的构建信息,之前的自动删除(非必须,这个步骤为了释放硬盘存储)

配置参数化构建,将来在构建时可以选择要构建的版本,URL路径填写分支代码版本库的地址。

编写流水线脚本,这个就是整个工程的最核心内容,里面定义了本工程要做的事情。

这里面要配置的内容是根据自己项目的实际情况,进行配置的。下面列出我的配置完整内容,供参考,不能照搬照抄,一定是根据自己的情况来写这个脚本的。

pipeline {agent anytools {nodejs 'node'}stages {stage('拉取源码') {steps {checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: 'xxxxxx-126f-4227-814c-736657c6e2de', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'https://192.168.xxx.xxx:80/xxxx/branches/$SvnBranch/01CODE']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])}}stage('前端项目安装依赖') {steps {dir('Sunland_SettleCenter_Web') {bat 'npm install'}}}stage('打包前端项目') {steps {dir('Sunland_SettleCenter_Web') {bat 'npm run build:test'}}}stage('打包后端程序') {steps {dir('Sunland_SettleCenter_Service') {bat 'mvn clean package -Dmaven.test.skip=true -P test'}}}stage('停止WinSW服务') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'windows154', // 这里填写你在Jenkins里配置的SSH主机名transfers: [sshTransfer(execCommand: 'C:\\Users\\Administrator\\Sunland_SettleCenter\\winSW\\sa-service.exe stop')],verbose: true)])}}stage('发送dist文件夹到远程服务器') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'windows154', // 你的SSH主机配置名transfers: [sshTransfer(sourceFiles: 'Sunland_SettleCenter_Web/dist/**', // 递归发送dist下所有内容removePrefix: 'Sunland_SettleCenter_Web/dist',   // 去除前缀,保持目录结构remoteDirectory: 'Sunland_SettleCenter/dist',   // 远程目标目录cleanRemote: true                                // 发送前清空远程dist目录(覆盖))],verbose: true)])}}stage('发送jar文件夹到远程服务器') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'windows154', // 你的SSH主机配置名transfers: [sshTransfer(sourceFiles: 'Sunland_SettleCenter_Service/sa-admin/target/sa-admin-test-3.0.0.jar',removePrefix: 'Sunland_SettleCenter_Service/sa-admin/target',remoteDirectory: 'Sunland_SettleCenter',cleanRemote: false)],verbose: true)])}}stage('启动WinSW服务') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'windows154', // 这里填写你在Jenkins里配置的SSH主机名transfers: [sshTransfer(execCommand: 'C:\\Users\\Administrator\\Sunland_SettleCenter\\winSW\\sa-service.exe start')],verbose: true)])}}}
}

上面的内容是怎么来的,下面进行一个解释说明:

Jenkins提供了语法生成工具,通过工具自动生成对应操作的命令

拉取源码的配置,就是通过下面这样的参数,填充之后,点击下方的生成流水线脚本,然后把生成好的脚本,放到页面对应的位置。

上面的示例中启动WinSW服务和关闭WinSW服务,这个是用到了WinSW这个工具,将jar包启动和关闭服务化,方便jar的启动和关闭操作(避免命令窗口关闭,jar自动停止运行)。WinSW具体使用,参考文章:

WinSW将执行文件服务化-CSDN博客

其他的语法,从示例步骤中找到自己需要的操作,然后填写对应的参数,自动生成对应的语法。

如果这里面没有找到自己需要的操作,可以百度一下,搜索:Jenkins的pipeline语法实现XXX,类似这样去搜索,一般就可以知道类似的语法。

8.构建

项目创建好之后,点击参数化构建按钮,然后选择对应要构建的版本,点击构建,就自动进行构建操作。

构建日志,可以通过点击构建的序号,然后点击Console Output就可以看到整个构建的日志输出。

构建完成,没有问题,会输出success 

此时整个构建就成功了,完成整个版本的发布操作。

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

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

相关文章

Python设计模式深度解析:装饰器模式(Decorator Pattern)完全指南

Python设计模式深度解析:装饰器模式(Decorator Pattern)完全指南前言什么是装饰器模式?装饰器模式的核心思想Python函数装饰器:从基础到高级基础函数装饰器高级函数装饰器实现GUI装饰器模式:动态界面增强Tk…

JVM--虚拟线程

首先了解一个理念:线程与 OS 线程 1:1 绑定在传统 Java 线程(平台线程)模型中:每个 Java 线程直接对应一个操作系统级别的线程操作系统负责调度这些线程线程的创建、管理和调度都由操作系统内核处理这种模型称为 1:1 线程模型&…

掌握系统设计的精髓:12个核心设计模式的通俗解读

在构建复杂且高可用的软件系统时,仅仅了解编程语言和算法是不够的。真正的挑战在于如何设计出能够应对并发、故障、扩展等各种问题的健壮架构。系统设计模式正是前辈们在无数实践中提炼出的智慧结晶,它们是解决常见系统问题的“最佳实践”。 本文将深入浅…

概率论与数理统计(二)

事件的概率 概率:可能性的大小 古典概率模型: 1)有限个样本点 2)等可能性 P(A)A中包含的基本事件数基本事件总和 P(A) \frac{A中包含的基本事件数}{基本事件总和} P(A)基本事件总和A中包含的基本事件数​ 频率与概率 nnn 次实验…

新型eSIM攻击技术可克隆用户资料并劫持手机身份

eSIM技术存在重大安全漏洞研究人员发现eSIM技术中存在一个关键漏洞,攻击者可利用该漏洞克隆移动用户资料并劫持手机身份。AG安全研究团队宣布,他们成功攻破了采用GSMA消费者证书的Kigen eUICC(嵌入式通用集成电路卡)安全防护&…

langchain教程2:更加高级和灵活的Prompt模板

文章目录 prompt模板 对话Prompt模板 函数大师 使用jinja2与f-string实现提示词模板格式化 组合式提示词模板 prompt模板 from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template("你是一个{name},帮我起一个具有{country}特色的{gender}名…

UE5使用Motion Warping有什么用?

在 UE5 中,Motion Warping 是一套用于「动态调整根运动动画」的系统插件,它能让带有根运动(Root Motion)的动画根据游戏运行时的环境自动变形(Warp),以更精准地贴合目标位置或目标方向&#xff…

类模版的相关案例

案例实现:实现一个通用的数组类,要求如下:可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据存储到堆区构造函数中可以传入数组的容量提供对应的拷贝构造函数以及operator防止浅拷贝问题提供尾插法和尾删法对数组中的数据进…

服务器端安全检测与防御技术概述

一、服务器安全风险1.不必要的访问(如只提供HTTP服务)--应用识别控制2.公网发起IP或端口扫描、DDOS攻击等--防火墙3.漏洞攻击(针对服务器操作系统等)--IPS4.根据软件版本的已知漏洞进行攻击,口令暴力破解、获取用户权限…

前端性能与可靠性工程系列: 渲染、缓存与关键路径优化

前端性能与可靠性工程系列: 渲染、缓存与关键路径优化 第一部分:揭秘浏览器 - 关键渲染路径 (CRP) 关键渲染路径 (Critical Rendering Path - CRP) 是指浏览器从接收到最初的 HTML、CSS 和 JavaScript 字节,到最终将它们渲染成可见像素所必须经过的一系列步骤。我们的目标,…

基于CentOS的分布式GitLab+Jenkins+Docker架构:企业级CI/CD流水线实战全记录

引言:从单机到分布式容器架构的演进在传统Web应用部署中,我们常常面临环境不一致、部署效率低下等问题。我曾经维护过一个需要手动在5台服务器上重复部署的游戏项目,每次发布都如同走钢丝。本文将详细分享如何基于CentOS系统,构建…

JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?

Java8移除永久代并引入元空间,主要是为了解决 PermGen 固定大小、容易导致内存溢出、GC 效率低的问题。元空间使用本地内存,具备更灵活的内存分配能力,提升了垃圾收集和内存管理的效率。 PermGen 的局限性 ①固定大小:永久代的内存空间大小在…

3.正则化——新闻分类

影响结果出了最终的目标,还会有许多细节因素 在机器学习中,往往会面临很多过拟合和欠拟合的问题。 欠拟合是训练不到位,过拟合是训练过头,会导致泛化性差正则化是在损失函数中添加一个惩罚项,以简化模型对于惩罚项Pena…

HTML的重要知识

什么是HTMLHTML是Hyper Text Markup Language的缩写,意思是超文本标记语言。标签标题标签:————-h1,h2,h3.....段落标签 :————p换行标签: ————br列表标签:有序列表:——ol无序列表:—…

【C语言网络编程】HTTP 客户端请求(发送请求报文过程)

在 C 语言中,我们可以使用 socket 编程来手动实现一个简单的 HTTP 客户端,像浏览器一样请求网页数据。本文将结合实际代码,重点讲解如何通过 C 语言构造并发送一个 HTTP 请求报文,实现与服务器的基本通信。 文章目标 通过一个简单…

oracle2kingbase的字段长度问题

实验一: oracle中: create table testlen(c1 varchar2(2)); insert into testlen values(山); --成功 insert into testlen values(山西); --失败 ORA-12899: 列 "TESTK"."TESTLEN"."C1" 的值太大 (实际值: 4, 最大值: 2…

单链表的题目,咕咕咕

1.咕 203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 struct ListNode* removeElements(struct ListNode* head, int val) …

关于程序=数据结构+算法这句话最近的一些思考

最近看了很多单片机STM32的的相关程序,尤其是设计到ringbuff、buffer_manage、os_memory预计mem_manage等程序中间层的用法,我对这句话有了一些更深的思考,现在记录下来,希望对处于相同阶段的程序一些思想启迪。首先“数据结构”也…

Rust 错误处理

Rust 错误处理 引言 Rust 是一种系统编程语言,以其安全、并发和性能著称。在 Rust 中,错误处理是一个核心概念,它确保了程序在遇到异常情况时能够优雅地处理。本文将深入探讨 Rust 中的错误处理机制,包括错误类型、错误传播、错误…

17. 什么是 webSocket ?

总结 WebSocket 是 HTML5 引入的一种新协议,允许客户端和服务器之间进行双向实时通信。建立在 TCP 协议之上,默认端口是 80(ws) 和 443(wss),没有同源限制,客户端可以与任意服务器通…