Jenkins通过Publish Over SSH实现前端项目部署到远程服务全纪录

  • Post author:
  • Post category:其他


上篇

Jenkins通过Publish Over SSH实现前端项目部署到远程服务全纪录

聊了通过

Jenkins


Nginx

实现前端自动化部署的整个过程,不过上篇文章部署的场景是

Jenkins



Nginx

服务在一台机器上.

但是很多情况下,我们的

Jenkins

可能是单独在一台服务器,

Nginx

服务可能根据环境的不同在多台服务器上,这时就需要

Jenkins

远程推送前端代码到不同的服务器上.

这篇文章将带大家实践一下

Jenkins

自动化构建前端项目到远程服务器的过程.其中很多过程和上篇文章的内容是重叠的,所以我们这次将重点聊一下

Jenkins

推送前端代码到不同服务器的过程,其他步骤参考上篇文章.

以下步骤的前提是

Jenkins

已经部署好,目标机器的

Nginx

已部署

说一下

Jenkins

推送代码到其他服务器的大致步骤:

主要依赖

Jenkins

的一个插件

Publish Over SSH

,这个插件主要是通过SSH链接到其他Linux机器,远程传输文件以及执行Shell命令.

基于这个插件,整个过程大概如下:

  • 配置

    Linux

    系统的

    SSH

    服务免密登录.

    Jenkins

    服务可以免密访问目标服务器
  • 创建

    Jenkins

    任务,配置构建触发器,当

    Gitlab

    仓库

    push

    代码时,自动将代码更新到Jenkins服务上
  • 更新完代码后 进行代码的依赖包安装,打包
  • 通过脚本,打包前端代码,推送到目标机器的指定文件夹
  • 更新目标机器

    Nginx

    中前端代码,并重启

    Nginx

    服务



1. 安装插件Publish Over SSH



Jenkins

中找到 Manage Jenkins -> Manage Plgins->可选插件中搜索

Publish Over SSH

安装 重启

Jenkins

在这里插入图片描述



2. 配置SSH秘钥

这一步是为了

Jenkins

所在的服务器通过

SSH

访问目标机器时获得免密授权

登录

Jenkins

所在的服务器,执行

ssh-keygen


在这里插入图片描述


将公钥拷贝到authorized_keys文件

cat id_rsa.pub >> authorized_keys 

执行完 会生成一个

authorized_keys

文件,如下:

在这里插入图片描述


将生成的authorized_keys拷贝到要连接的linux机器上的对应用户或者直接root下的.ssh文件夹下

scp authorized_keys root@目标及其IP:/root/.ssh

执行上面命令 会提示你输入目标机器的密码 确定后 就会将存有

Jenkins

所在服务的公钥文件

authorized_keys

存在目标机器的

/root/.ssh

下了,并且在

Jenkins

所在服务器的

/root/.ssh

下也会新增一个

known_hosts

文件

请添加图片描述

在服务器中配置完秘钥之后,接下来需要在

Jenkins

中做配置:

Jenkins –>系统管理–>系统设置

找到

Publish over SSH


请添加图片描述


Publish over SSH

公共配置:

  • Passphrase 刚才在Jenkins服务生成秘钥时如果有输入密码 则填写 没有填写则空着
  • Path to key 秘钥的路径
  • Key 刚才生成的私钥 也就是生成的

    id_rsa

    文件 可以在服务器上通过命令

    cat id_rsa

    获取到


SSH Server

私有配置

  • SSH Server 服务名称 自定义 方便区分即可

  • Hostname 目标服务器的IP地址

  • Username 目标服务器的用户名

  • Remote Directory 目标服务器的目录名称

    Jenkins

    推送过来的包会放在这个位置(注:

    刚才填写的用户名需要有权限对此文件目录有读写权限

    )

    其他的不必配置

    配置完成后,点击

    Test Configuation

    测试一下

报错:

jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@ba77e81]]

请添加图片描述

当前秘钥首行

-----BEGIN OPENSSH PRIVATE KEY——

发现如上报错 原来是因为Jenkins当前版本不支持这种秘钥格式

解决报错:

我们需要在Jenkins服务上生成指定格式的秘钥

ssh-keygen -m PEM -t rsa -b 4096

说明: -m 参数指定密钥的格式,PEM是rsa之前使用的旧格式 -b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。

把之上的流程再走一遍

如果测试结果是

Success

,则配置成功了



3. Jenkins构建前端项目,并推送到目标机器

接下来我们来创建一个

Jenkins

任务,并关联

Gitlab

项目仓库.

具体步骤,可以参考上篇

centos+jenkins+nginx+gitlab前端自动化部署全记录

这篇文章,有详细过程.这里一笔带过.

假设在

Jenkins

任务中配置

git

权鉴,以及构建触发器已经配置完成.

截至到目前这一步 我们能实现的是 当我们

push

指定的分支后,

Jenkins

会自动更新代码到

Jenkins

服务器上

接下来我们要做的就是 将前端代码安装依赖 再进行构建

然后通过SSH将打包后的文件推送到目标机器上

再目标机器上重启

Nginx

服务来达到自动部署的目的

以下是我们刚创建的

jenkins

任务的部分配置:

请添加图片描述

请添加图片描述

如果以上配置没问题,接下来我们需要配置构建


Execute shell

里写脚本,对前端代码进行打包压缩具体代码如下:

# 默认在workspace目录 既仓库的根目录
# 安装依赖
npm install
# 删除旧的dist文件
rm -rf dist
# 重新build代码
npm run build
# 将build好的文件 打成tar包方便传送
cd dist
tar -zcvf teacher.tar.gz *
cd ..
echo '打包完毕'

至此,我们已经将前端构建好的代码打成

tar

包,放在了

dist

文件夹下,接下来我们需要把这个

tar

包推送到目标服务器上

请添加图片描述

选择 增加构建步骤–>

Send files or execute commands over SSH

请添加图片描述

SSH Server配置:

  • Name 选择服务名称 我们刚才在Jenkins –>系统管理–>系统设置中已经配置 选择即可
  • Source files 源文件目录 这个目录对应的是我们仓库代码的根目录 这个地址必须是基于根目录的相对路径 不可以放到根目录外面的曾经 不可以用

    ../../XXX

    这样的路径来访问 否则会出现

    SSH: Transferred 0 file(s)

    的问题 文件传送不过去!!! 大坑大坑大坑大坑
  • Remove prefix 要去除的前缀 把

    Source files

    文件目录地址去掉即可 否则会在目标机器上创建对应的目录
  • Remote directory 要传送文件到的目标机器的目录 即我们刚才在Jenkins –>系统管理–>系统设置中配置的目录 填写/即可
  • Exec command 传输代码完成后 执行的脚本 可以用来做对包的解压 重启

    Nginx

    等操作

    我们保存一下

    Jenkins

    配置, 我们构建一下

    jenkins

    任务,来验证一下是否能正常将代码推送到目标机器

    我们可以查看

    jenkis

    任务的控制台输出,如果是以下提示:

    请添加图片描述

    已经传输了1个文件 说明我们前面的工作都生效了!!

    我们也可以去目标机器 我们刚才配置的地址上去看一下 是否有文件
cd /usr/local/fe/smartmag/
ll

当我们看到有

teacher.tar.gz

包存在时 说明已经成功

接下来就剩下最后一步了 需要将我们的包解压 并且将代码移动到

Nginx

指定的文件下,并重启

Nginx


具体的

Nginx

服务配置,在上一篇文章中也有详细说明

接下来 我们需要在刚才未填写的

Exec command

中写脚本了

# 将teacher.tar.gz包解压到Nginx指定的目录下
tar -zxvf teacher.tar.gz -C '/usr/local/nginx/html/teacher'
# 删除tar包
rm -rf teacher.tar.gz
# 重启Nginx
cd /usr/local/nginx/sbin
./nginx -s reload
echo '重启完毕'

然后再次保存

jenkins

配置

重新构建一下

Jenkins

任务,来看一下我们的前端代码是否更新.



总结

至此,整个

Jenkins

自动化构建前端项目到远程服务器的整个流程已经走完.其中省略了一些步骤,可以在上一篇文章中查看. 这篇文章的核心就是

Jenkins


SSH

免密登录远程服务的配置,当我们首次做的时候,基本会一步一个坑,会碰到很多莫名其妙的问题,我们可以把这些过程记录下来,也是我们的积累.

文章可能会有一些瑕疵的地方,如果在实践中遇到问题,也欢迎大家留意讨论,一起学习进步.

另外,这两篇文章漏说了一点就是,对

Nginx

服务设置开机重启,我们的测试环境有可能还有后端的其他服务,有可能会有人对测试服务进行重启,这样我们的

Nginx

可能会挂掉,手动重启就太low了,下面的参考资料里有开机自动重启的设置.大家自行查阅.

#写在最后

欢迎大家访问我们的前端订阅号【前端面试题宝典】以及小程序【前端面试题宝典】,公众号会频繁更新前端相关的技术文章.我们的小程序【前端面试题宝典】目前也收录了大约将近600道前端面试题,并且包含详细的答案解析.包括HTML CSS TS JS React Vue Node 性能优化 网络安全 算法 数据结构等等各种分类的前端面试题.希望能为正在面试的小伙伴助一臂之力.

您也可以点这里访问

前端面试题宝典



参考资料


设置nginx开机自启动(centos7.x)



版权声明:本文为u010053703原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。