使用 Jenkins 可以完成整个 CI/CD 的操作,之前关于源码下载、镜像构建、镜像推送等操作都只能算是 CI 的步骤, Jenkins 完成一系列包括构建和部署的操作,属于CD操作

安装插件: public over ssh

Publish Over SSH 是 Jenkins 的一个插件,可以使用 SSH 的方式远程连接服务器,并进行文件的传输和命令执行。
由主节点不具备环境,只进行分配任务,执行构建操作。配置从节点,web服务器,从节点构建完成之后,把镜像和部署代码一并传到服务器节点上面,然后在服务器节点执行部署命令,这几个步骤都是 Publish Over SSH 可以完成的。

全局配置:ssh server

点击【高级】配置密码
ssh的配置可使用密钥,也可以使用密码,
image.png
image.png
测试连接,并应用保存

构建后操作

在任务配置中增加【构建后操作】

send build artifacts over ssh

在SSH Server Name字段选择你的预先配置好的服务器(创建过程: Jenkins -> 系统管理 -> 系统设置 -> Publish over SSH -> SSH Servers,点击新增)

   Transfers 配置说明:

   Source files 表示上传到服务器的文件的路径,我这里写的当前项目根目录下dist目录下的所有文件,包括static文件夹和index.html,具体的匹配规则请自行查询有关资料

   Remove prefix 表示上传到服务器需要删除的本地路径前缀,这里表示将dist前缀移除,上传到服务器的只有static文件夹和index.html

   Remote directory 表示要删除的服务器上的目录路径,这里是每次上传时将之前的文件全部删除,用新的文件来替换

   Exec command 表示执行的shell脚本

    按照上边配置完成后,构建完成后会自动将文件更新到服务器上…
image.png
点击【立即构建】
image.png
需求场景
一般情况下,通过 Jenkins 完成一个项目的上线,至少应该包括三台虚拟机,一台用来运行 Jenkins 服务,作为主节点,第二台(正常情况可能不止一台)是一个从节点,由主节点分配任务,执行构建操作,之所以从节点会很多是因为每个从节点可能配置的不同的环境,可以完成特定的构建任务,比如某个从节点配置了 nodejs 环境,所以可以执行前端项目构建,而另一个配置了 Java 环境所以可以构建 Java 项目;第三台虚拟机就是项目部署的服务器了(有时候可能也不止一台),可以通过 Jenkins 远程控制服务器完成构建后的部署。

现在我就有3个虚拟机,1个 Jenkins 主机点,使用容器运行的,1个 Jenkins 从节点,配置了 nodejs 环境和 Java 环境,所以可以完成 vue 项目的构建,最后一个是一台仅仅配置了 docker 环境的虚拟机,只能运行容器。这个场景很服务实际的项目场景。
解决方案
Jenkins 主节点由于是在容器中运行的,所以根本不具备任何其他环境,所以只做任务分配;从节点需要完成的事情是从 GitHub 拉取代码,并打包 vue 项目,最后构建成镜像,构建完成之后可以推送到远程仓库,也可以打包成 tar 包(这里为了使用 Publish Over SSH 的文件传输功能,所以使用 tar 包镜像);从节点构建完成之后,把镜像和部署代码一并传到服务器节点上面,然后在服务器节点执行部署命令,这几个步骤都是 Publish Over SSH 可以完成的。
image.png