一、安装插件
通过ssh 访问远程主机,需要为Windows 系统的主机安装Open SSH ,防火墙开放22 端口,本地Jenkins 安装插件安装publish over ssh 插件,安装后重启Jenkins 服务。

查看任务中构建后操作 ,可以看到多出选项Send build artifacts over SSH 选项,则表明安装成功。

需要的配置相关配置,如果用户为首次使用,则需要转到首页,选择 系统配置添加对应的 SSH 发布配置,首页如下:

二、系统配置
2.1、配置远程SSH 服务端
在System Configuration -Configure System -Publish over SSH 中,配置一个远程ssh 连接配置,

各个输入框,用途如下:
Passphtase 对应用户私钥的文件加密秘钥,默认可以是空,依据实际情况考虑是否填写。
Path to key 用户实际私钥所在文件的绝对或者相对路径,与 Key 考虑二者选择一个即可。
Key 用户私钥对应的实际内容,与 Path to key 二者选择一个即可。
配置 SSH 服务地址:

输入框内容用途如下:
Name 当前 SSH 服务端配置记录的名称,用于做为记录的唯一辨识,尽量不要重名。
Hostname 一般为服务端所属的 IP,其他端口需要通过 高级配置级进行指定。
Username 远程访问服务器时,提供的访问用户名,一般为服务端提前配置好的用户名。
Remote Directory 远程访问时,非默认访问路径时,需要用户依据实际需求进行指定(Windows仅仅适用于当前盘符)。
确认配置无误后,点击 Test Configuration 按钮进行测试。配置成功,测如上图返回结果为 Success 字样。
2.2、高级配置
高级配置中,支持通过用户名和密码进行远程访问,同时包含,需要访问的服务端ssh 端口为非22端口时的相关配置,以及代理相关配置操作输入项,此处不一一展开讨论。

SSH Server 配置无误后,点击保存即可。
三、项目添加配置
回到目标项目中,点击构建后项目,选择Send build artifacts over SSH 选项,效果如下:

上述转换 Transfers 输入内容用途如下:
Source files 需要上传的文件,可以使用匹配符号,具体查看官方文档。
Remove prefix 上传是需要移除的文件前缀,避免拷贝文件时,在服务端生成同样目录层级。
Remote directory 上传到远程服务器对应文件目录。
Exec command 用于在执行转换后,进行后续的指令操作,方便后续构建的处理操作。
其中可以使用,Jenkins environment variables ,具体可以查看本地地址 http://localhost:8060/env-vars.html/ ,读者依据实际的部署端口,进行相关环境变量的查看。参考链接:https://plugins.jenkins.io/publish-over-ssh/
高级配置中,可以添加需要排除的文件,用于在转换过程中,排除上传的文件,** 表示全文本匹配。

笔者案例,填写如下:

确认无后,点击保存。回到项目页面,进行立即构建,查看项目控制台输出如下:
C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\ynkenginemap\JenkinsDemo>exit 0
SSH: Connecting from host [LAPTOP-86GF4FKI]
SSH: Connecting with configuration [localserver] ...
SSH: Disconnecting configuration [localserver] ...
SSH: Transferred 7 file(s)
Finished: SUCCESS
通过 xshell 可以看到对应工作目录中,已经生成一个 jenkins 的文件目录,文件目录中,包含对应本地发布的项目文件。
C:\Users\ggcyuser>dir jenkins
驱动器 C 中的卷是 Windows
卷的序列号是 22DB-1BE1
C:\Users\ggcyuser\jenkins 的目录
2021/10/06 20:35 <DIR> .
2021/10/06 20:35 <DIR> ..
2021/10/06 20:35 168 appsettings.Development.json
2021/10/06 20:35 106,809 JenkinsDemo.deps.json
2021/10/06 20:35 9,216 JenkinsDemo.dll
2021/10/06 20:35 174,592 JenkinsDemo.exe
2021/10/06 20:35 20,016 JenkinsDemo.pdb
2021/10/06 20:35 311 JenkinsDemo.runtimeconfig.json
2021/10/06 20:35 555 web.config
7 个文件 311,667 字节
2 个目录 34,109,632,512 可用字节
此时,可能读者就会问,那如果需要远程访问的文件目录,并不是当前账户所在的根目录如何处理?
其实对于这个问题,分情况处理,主要针对远程账户默认用户目录与非默认目录。
3.1、默认用户目录
默认空间下的子级目录切换可以通过配置的 SSH Servers 进行处理,在配置 SSH Servers 就提到过如下输入字段:
Remote Directory 远程访问时,非默认访问路径时,需要用户依据实际需求进行指定(Windows仅仅适用于当前盘符)。
如果用户有实际需求,可以在当前字段中进行特定目录的目录配置,需要注意的是,目前笔者测试结果为通过 SSH Server 方式仅仅适用于当前Windows 服务端的所在盘符,跨盘符操作不支持。
此处为了方便,笔者选择非默认目录,设置为服务器中的目录 jenkins ,配置一个新的 SSH Severs ,具体内容如下:

项目配置中对应的 SSH Server 修改为当前配置好的 directoryserver :

保存后,进行构建,控制台输出如下:
C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\ynkenginemap\JenkinsDemo>exit 0
SSH: Connecting from host [LAPTOP-86GF4FKI]
SSH: Connecting with configuration [directoryserver] ...
SSH: Disconnecting configuration [directoryserver] ...
SSH: Transferred 7 file(s)
Finished: SUCCESS
3.2、非默认目录
虽然无法直接切换目录,但是可以考虑在文件上传后,通过指令方式,将上传的文件进行指定目录的拷贝,此时需要使用的到 Exec command 输入框,进行输入转换之后的文件其他处理操作。

当前指令xcopy /s /y jenkins "E:\Study\Servers\jenkins" ,表示拷贝并在目标文件夹文件存在时进行强制覆盖操作,在 xshell 中能够正常使用,保存后,进行 Build Now ,查看控制台输出结果如下:
C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\ynkenginemap\JenkinsDemo>exit 0
SSH: Connecting from host [LAPTOP-86GF4FKI]
SSH: Connecting with configuration [localserver] ...
SSH: EXEC: completed after 201 ms
SSH: Disconnecting configuration [localserver] ...
SSH: Transferred 7 file(s)
Finished: SUCCESS
SSH 远程可以直接执行指令,而不考虑文件转换和拷贝,上述操作可以将文件转换和指令执行进行拆分,操作如下:
  上述为笔者对自定义构建项目的操作与技巧说明。
四、参考链接
[1]官方文档:
https://www.jenkins.io/zh/doc/
[2] 文件目录拷贝:
https://blog.csdn.net/ak47007tiger/article/details/95749419
[3] 远程OpenSSH 配置:
https://blog.csdn.net/qq_28806349/article/details/120624802
https://blog.csdn.net/qq_28806349/article/details/120626333
|