前言

最近在开发一套管理系统,做了前后端分离。

后台使用的是Asp.Net Core 3.1

前端使用的是Vue+Ant Design

自己搞了一台云服务器,打算把系统部署到云服务器上。以供外网访问。

服务器OS是WinServer2016

所以打算通过IIS平台来发部与部署系统。

后台部署

后台部署很好办。因为可以通过Visual Studio,使用IIS的Web Deploy组件一健发布到服务器

前端部署-手动

因为项目还小。要部署的也就一个前端,一个后端。也没有什么分布式部署。

显然现还用不到到通过工具自动从GIT拿代码,然后通过流水线自动构建这种大炮。

在没有使用PowerShell自己部署前,前端部署流程是:

1。通过npm run build:live编译,然后会把编译好的文件生成在dist目录

2。通过Windows远程桌面,连接到远程服务器。然后Ctrl+C,Ctrl+V把文件复制到服务器指定目录

因为dist目录文件数量太多,但是大小都比较小,直接复制可能比较慢。

一般是先用WinRAR把dist目录压缩一下。然后手动复制到服务器,然后解压到服务器目录。

这样速度上来说比直接复制快一点。

但是一想到后端可以通过VS一键发布到服务器,而前端就要通过手动的方式复制到服务器

这样的差距有点大。所以自己想通过写一些脚本达到自动部署的目的。

自动部署方案

虽然说要设计一个自动部署方案,还不如说是通过机器模拟手工部署的流程。

达到把手工的工作机器自动完成。从而解放双手。

那么流程其实还是和手工差不多。

1。编译前端代码

2。把编译后dist目录压缩成一个RAR文件

3。远程连接到服务器

4。把压缩文件传输到服务器

5。把压缩文件解压到指定目录(先把原目录所有文件删除,再把压缩文件解压)

6。断开远程服务器连接,删除本地压缩文件

自动部署PowerShell脚本

基本上把上面的6个动作都用脚本实现,基本上就实现了自动部署的流程。

接下来就是一步步的实现过程

1。编译前端代码

这个很好办。基本就是执行一下npm run build:live脚本

Write-Host 'Build Starting' -ForegroundColor Yellow
$BuildScript={npm run build:live}
Invoke-Command -ScriptBlock $BuildScript
Write-Host 'Build Completed' -ForegroundColor Green

Write-Host就是在控制台输出信息,-ForegroundColor就是指定以什么颜色输出

Invoke-Command就是执行一段脚本 -ScriptBlock就是脚本内容,这里我们定义了npm run build:live

2。把编译后dist目录压缩成一个RAR文件

因为我们电脑一般都会安装WinRAR,所以我们通过运行WinRAR来压缩文件。

WinRAR也可以使用Command的方式来压缩和解压文件

Write-Host 'RAR Starting' -ForegroundColor Yellow
$WinRARPath="C:\Program Files\WinRAR\WinRAR.exe"
$CurDateString=Get-Date -Format "yyyyMMddHHmmss"
$RARFileName="WMSWeb"+$CurDateString+".rar"
$CurPath=(Resolve-Path .).Path
Start-Process -FilePath $WinRARPath -ArgumentList "a","-r","-ep1",$RARFileName,"-cfg-",".\dist\*.*" -WorkingDirectory $CurPath -NoNewWindow -Wait
Write-Host 'RAR Completed' -ForegroundColor Green

WinRAR压缩命令,如果我们在CMD里运行的话。可以输入以下命令

WinRAR.exe a -r -ep1 -cfg- 压缩文件名 压缩目录

a是压缩 -r是包括字目录 -ep1是排除要目录文件夹 -cfg-是不使用自定义压缩配置(使用默认)

所以我们指定好WinRAR.exe的路径,

然后压缩文件名是通过字符串+日期的格式来生成文件,这样也就知道我们部署文件的时间了。

通过Start-Process的PowerShell来执行一个压缩命令

-FilePath 是指定要运行的程序

-ArgumentList是指定参数列表。多个参数之间用豆号隔开

-WorkingDirectory是当前工作目录,一般就是我们前端代码的要目录了

-NoNewWindow 不用一个新的窗口执行

-Wait 等待命令执行完成

完成以上命令,那么就会在前端代码根目录生成一个对应的压缩文件了

3。远程连接到服务器

通过PowerShell远程连接到服务器这一步是比较难的。

因为他要在服务器和本机做一定的配置才可以实现

首先在服务器里面

通过PowerShell运行Enable-PSRemoting

来开启可以使用PowerShell远程连接

然后打开PowerShell远程连接对应的防火墙端口

开启防火墙"Windows 远程管理“项,端口:5985

然后在服务器和本机都执行:winrm quickconfig

来快速配置WinRM

然后在本机通过PowerShell执行

Set-Item wsman:localhost\Client\TrustedHosts -value 服务器IP

来允许本机可以远程连接到服务器

至此。环境配置方面就都已经完成。可以通过PowerShell来连接到服务器了

然后我们通过写PowerShell脚本,来实现远程连接到服务器

Write-Host 'Deploy Starting' -ForegroundColor Yellow
$User = "登录帐号"
$Password = Read-Host -Prompt "Please enter the server password" -AsSecureString
Write-Host 'Start connecting to the server' -ForegroundColor Yellow
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Password
$Session = New-PSSession -ComputerName 服务器IP -Credential $Credential
Write-Host 'Successfully connected to the server' -ForegroundColor Green

我这里把登录服务器帐号写死了。但是密码要在每次执行的时候输入。以达到保密的目的。

因为我们这个脚本是要上传到Git的。要是被人看到了还是不好,所以密码就没有写死在这里了。要每次输入

Read-Host -AsSecureString就是指要在控制台输入一串密码。密码是以*显示出来。

New-PSSession就是打开一个远程的会话 -Credential是以指定凭据的方式打开远程会话

到这里没有报错的话。基本上就表示连接到服务器了

4。把压缩文件复制到服务器

这个步骤还是比较简单。基本上就一个命令

Copy-Item $RARFilePath -Destination $RemotePath -ToSession $Session

Copy-Item 复制一个对像 -Destination 复制的目标地址(服务器目录) -ToSession 哪个远程会话连接

基本上这样一个命令就可以把本地的一个文件复制到远程服务器目录了

5。把压缩文件解压

这个步骤基本上和压缩是一样的。也是调用WinRAR.exe来执行解压。

有区别的是压缩是在本机执行。解压是在远程会话执行

Invoke-Command -Session $Session -ScriptBlock {param($p) Remove-Item -Path $p -Recurse -Force} -ArgumentList $RemoteRemovePath
Invoke-Command -Session $Session -ScriptBlock {param($p,$n,$rp) Start-Process -FilePath $p -ArgumentList "x",$n,"*",".\WMSWeb\" -WorkingDirectory $rp -NoNewWindow -PassThru -Wait} -ArgumentList $WinRARPath,$RARFileName,$RemotePath

Invoke-Command -Session就是在指定远程会话里执行一个命令

第一个脚本是先把服务器上的目标目录文件清除,所以Invoke-Command -ScriptBlock是调用远程的Remove-Item

第二个脚本是在远程会话里开启一个进程来执行文件解压

我们知道用WinRAR在本地解压是WinRAR.exe x RAR文件名 解压哪些文件 解压到哪个目录

所以通过第二个命令来调用远程服务器的WinRAR来解压刚刚上传的文件到指定目录

6。断开远程连接,删除本的压缩文件

这个步就比较简单了,基本上就调用两个命令就OK

Disconnect-PSSession -Session $Session
Remove-Item -Path $RARFilePath

Disconnect-PSSession 断开一个远程会话

Remove-Item移除一个文件

到此,一个自动部署的脚本就完成了。把脚本保存在一个文件里。

要部署的时候。直接在VSCode的终端里运行这个PowerShell脚本文件。

就可以自动把编译好的前端部署到服务器了

本PowerShell完整的脚本

 $WinRARPath="C:\Program Files\WinRAR\WinRAR.exe"
Write-Host 'Build Starting' -ForegroundColor Yellow
$BuildScript={npm run build:live}
Invoke-Command -ScriptBlock $BuildScript
Write-Host 'Build Completed' -ForegroundColor Green
Write-Host 'RAR Starting' -ForegroundColor Yellow
$CurDateString=Get-Date -Format "yyyyMMddHHmmss"
$RARFileName="Deploy"+$CurDateString+".rar"
$CurPath=(Resolve-Path .).Path
Start-Process -FilePath $WinRARPath -ArgumentList "a","-r","-ep1",$RARFileName,"-cfg-",".\dist\*.*" -WorkingDirectory $CurPath -NoNewWindow -Wait
Write-Host 'RAR Completed' -ForegroundColor Green
$RARFilePath=$CurPath+"\"+$RARFileName
Write-Host 'Deploy Starting' -ForegroundColor Yellow
$User = "登录帐号"
$Password = Read-Host -Prompt "Please enter the server password" -AsSecureString
Write-Host 'Start connecting to the server' -ForegroundColor Yellow
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Password
$Session = New-PSSession -ComputerName 服务器IP -Credential $Credential
Write-Host 'Successfully connected to the server' -ForegroundColor Green
Write-Host 'Start deploying files to the server' -ForegroundColor Yellow
$RemotePath="D:\Deploy\"
Copy-Item $RARFilePath -Destination $RemotePath -ToSession $Session
$RemoteRemovePath=$RemotePath+"Web\*"
Invoke-Command -Session $Session -ScriptBlock {param($p) Remove-Item -Path $p -Recurse -Force} -ArgumentList $RemoteRemovePath
Invoke-Command -Session $Session -ScriptBlock {param($p,$n,$rp) Start-Process -FilePath $p -ArgumentList "x",$n,"*",".\Web\" -WorkingDirectory $rp -NoNewWindow -PassThru -Wait} -ArgumentList $WinRARPath,$RARFileName,$RemotePath
Disconnect-PSSession -Session $Session
Remove-Item -Path $RARFilePath
Write-Host 'Disconnected from server' -ForegroundColor Yellow
Write-Host 'Deploy Completed' -ForegroundColor Green

使用PowerShell自动编译部署前端的更多相关文章

  1. Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

    标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...

  2. [CI] 使用Jenkins自动编译部署web应用

    写在前面 初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程 持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作 ...

  3. 使用GitHub Actions自动编译部署hexo博客

    前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...

  4. 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等

    本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...

  5. idea开启springboot的devtools自动热部署功能

    1.先在pom文件中添加下面代码段 <!-- 热部署 --> <dependency> <groupId>org.springframework.boot</ ...

  6. Java web项目在linux环境下自动编译和部署脚本

    自动编译脚本 build.sh, 放置在项目根目录下. #!/bin/bash # check args # init path CURRPATH=`pwd` LIBDIR="$CURRPA ...

  7. Tomcat 设置自动编译,自动发布,自动部署

    Tomcat服务器 具有一个常用的功能: 即自动编译,自动发布,自动部署功能. 问题: 当我们第一次发布程序以后,我们增删改Servelt,Java,.xml等文件,都必须重启Tomcat,如果项目巨 ...

  8. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  9. idea实现热部署并且开启自动编译

    [注]本文转自https://blog.csdn.net/z15732621582/article/details/79439359博文,如有冒犯,请联系博主: 问题描述: 最近在调试代码并进行本地测 ...

随机推荐

  1. express 框架的使用方法

    express  框架的使用方法: 第一步: 生成一个 (express)项目工程 命令提示框的指令是: express    (文件名) express    -e      (文件名) 两段指令的 ...

  2. Project Loom:Reactive模型和协程进行时(翻译)

    Java 15将发布Project Loom的第一个版本.我相信这将改变JVM.在这篇文章中,我想深入探讨一下导致我相信这一点的原因. 首先,我们需要了解核心问题.然后,我将尝试描述以前的技术如何解决 ...

  3. Oracle调用Java方法(下)复杂Jar包封装成Oracle方法以及ORA-29521错误

    上一篇随笔中已经说了简单的Jar是如何封装的,但是我的需求是根据TIPTOP的查询条件产生XML文件并上传到FTP主机中,那么就要涉及到XML生成的方法和FTP上传的方法 所以在Eclipse写的时候 ...

  4. Code Walkthroughs Table API

    上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Table API Table api 有批量的api和流实时的api.通常很容易进行 ...

  5. Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 项目背景 2018年,被称为互联网的寒冬之年.无论大小公司,纷纷走上了裁员 ...

  6. 鹅厂车联网探索:5G下边缘云计算的车路协同实践

    5G网络下,多接入边缘计算(MEC)应运而生.结合TKEStack强大的集群管理能力和异构计算资源管理能力,腾讯打造了一个功能完备的边缘计算PaaS平台TMEC,提供了高精确度定位.视频处理.无线网络 ...

  7. django 类视图的使用

    使用django框架也有挺长时间了,但是一直都没有用过django的类视图,因为之前跟着网上教程学习时,觉得类视图是进阶的知识,可能目前还达不到吧 但今天在做项目的时候用到了,感觉真的太方便了吧,而且 ...

  8. scrapy框架结构与工作原理

    组件: ENGINE:引擎,框架的核心,其他组件在其控制下协同工作. SCHEDULER:调度器,负责对SPIDER提交的下载请求进行调度 DOWNLOADER:下载器,负责下载页面,发送HTTP请求 ...

  9. Cache写策略(Cache一致性问题与骚操作)

    写命中 写直达(Write Through) 信息会被同时写到cache的块和主存中.这样做虽然比较慢,但缺少代价小,不需要把整个块都写回主存.也不会发生一致性问题. 对于写直达,多出来%10向主存写 ...

  10. Docker可视化工具Portainer

    1 前言 从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的.无聊搜了一下,原来已经有很多Docker可视化工具了.如DockerUI.Shipyard.Rancher.Portai ...