当前位置: 首页 > news >正文

前后端分离项目的完整部署(Jenkins自动化部署)

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

前后端分离项目的完整部署(人工部署)-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.xdnf.cn/news/1108639.html

相关文章:

  • 【从零开始编写数据库:基于Python语言实现数据库ToyDB的ACID特性】
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • Android下一个简单的定时器,每隔一秒输出一个数字
  • Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)
  • vue3 canvas 选择器 Canvas 增加页面性能
  • Kimi K2万亿参数开源模型原理介绍
  • 【论文阅读】HCCF:Hypergraph Contrastive Collaborative Filtering
  • 缓存三剑客解决方案
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • 利用docker部署前后端分离项目
  • 敏捷开发方法全景解析
  • SQL server之版本的初认知
  • C#枚举:从基础到高级的全方位解析
  • 《通信原理》学习笔记——第一章
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
  • 基于MCP的CI/CD流水线:自动化部署到云平台的实践
  • Vue Vue-route (5)
  • Adobe Illustrator关于图标创建的问题
  • 【跟我学运维】chkconfig jenkins on的含义
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • 回归(多项式回归)
  • 电网通俗解析术语2:一二次设备关联
  • 【PycharmPyqt designer桌面程序设计】
  • Effective Modern C++ 条款9:优先考虑别名声明而非typedef
  • Socket到底是什么(简单来说)
  • 【Elasticsearch】昂贵算法与廉价算法
  • 史上最全 MySQL 锁详解:从理论到实战,一篇搞定所有锁机制
  • 网络编程员工管理系统
  • 【数据分析】03 - Matplotlib
  • 【Elasticsearch 】search_throttled