目录

写在前面

首先声明,除非万不得已,千万不要在Windows环境做这个事情,否则就等着各种坑吧。

本人一贯的立场都是坚持用正确的方法做事,显然在Windows搭建Jenkins这个事情本身并不那么正确。

之所以有这篇随笔,也是因为经历了各种吐血踩坑之后希望留个备忘。当然,如果此文能给阅读者带来帮助,那不胜荣幸。

故事背景

最近在做一个简单的数据采集项目,一开始只有一台远程主机,所以每次更新都是本地打包之后直接scp过去,然后再到目标主机上执行脚本。因为机器只有一台,做这些动作到也没觉得不妥,因为就是简单的几步操作也犯不着还需要持续集成工具什么的。但是最近的数据量有所增加,所以必须增加新的远程主机,所以现在有了2台机器,每次都是执行文件上传,然后再依次登录到每台主机上执行脚本。总是频繁打包更新时花费在这些重复性步骤上的时间累加起来也挺可观的,于是乎就想搭建一个Jenkins系统做一键发布。

之所以在Windows10环境折腾,是因为公司电脑就只有Windows10,其实在Linux环境操作的话也不会遇到如下这些问题了。

踩坑详情

第一步:安装Jekins。

这一步没有问题,直接到官网下载安装包:jenkins.msi。

然后一步一步点击安装完成,由于安装的是Windows服务包,可以在Windows服务管理窗口中找到Jenkin后执行启动/停止操作。当然,也可以通过Jenkins自带的可执行程序来操作。

在Windows控制台进入到Jenkins安装目录,执行如下命令:

jenkins.exe stop | start | restart

第二步:配置项目发布流程

主要的踩坑都是在这里遇到的。

踩坑1 shell环境

为了能在Windows环境使用一些Unix/Linux命令,所以需要安装Cygwin,并添加到Windows环境变量Path中:Path=%Path%:C:\cygwin64\bin\

然后执行如下命令打包程序:tar czvf xxx.tar.gz xxx,该命令在Cygwin命令行界面执行是没有任何问题的,但是到Jenkin中执行时就会报错:

Caused: java.io.IOException: Cannot run program "sh"

显然,Windows下的shell环境是cmd.exe,而上述打包命令并不能直接运行。

解决办法:

在Jenkins中明确指定shell环境,设置路径:【Manage Jenkins】->【Configure System】-> 【Shell】,明确指定“Shell executable”,如下图所示:

注意: 虽然安装Cygwin后也带了“sh.exe”,但是在Jenkins中设置为“C:\cygwin64\bin\sh.exe”时依然不能执行命令,所以设置为Git客户端自带的sh.exe。

踩坑2: 文件上传

程序打包完毕之后,需要上传到远程主机。

在Linux主机之间传输文件通常通过scp命令实现,于是我也想在Windows上使用scp来做这个事情。

但遗憾的是通过Cygwin并不能安装scp命令,而微软PowerShell团队提供的Win32-OpenSSH项目正好带了scp命令。

到这里还算顺利,在安装了Win32-OpenSSH之后可以通过scp命令将文件传输到远程主机。

但是在执行scp命令时必须输入密码,显然在Jenkins中要实现一键部署时是无法执行输入密码这个动作的,因此就需要实现本地Windows主机与远程Linux主机之间的免密传输。

我们知道,在Linux主机之间要实现免密传输文件,比如主机L1向主机L2传输文件,只需要将L1主机的公钥信息写在L2的~/.ssh/authorized_keys文件中即可,具体操作步骤如下:

首先,在主机L1上执行:ssh-keygen -t rsa,然后将L1主机的~/.ssh/id_rsa.pub文件上传到L2主机上,并命名为id_rsa_L1.pub

其次,在主机L2上执行:cat id_rsa_L1.pub >> ~/.ssh/authorized_keys

完成上述设置之后,在主机L1上通过scp命令向主机L2传输文件时就可以不用每次都输入密码了,这大大简化了主机之间文件传输的流程,也是在Jenkins中可以实现一键部署的关键。

但非常遗憾的是,在我的实践中,这一步并没有成功!我尝试了很多次将本地Windows主机的ssh公钥写到远程Linux主机的~/.ssh/authorized_keys文件中,每次执行scp命令时依然需要手动输入密码。

另外,使用Cygwin提供的sshpass命令明确指定密码也同样不能成功!

显然,如果无法避开手动输入密码这个步骤,是无法在Jenkins中实现一键部署的。

经过一番搜索后知道:在Windows环境要实现类似于scp命令的功能,还可以通过一个叫做pscp的命令实现,并且pscp命令有一个-pw选项参数可以指定远程主机的登录密码,这样就可以实现不用手动输入密码的效果了。

pscp命令有以下2种方式获取:

(1)Putty安装包默认已经带了pscp.exe程序,所以只需要安装Putty即可,注意一定要选择“Windows Installer”安装包默认才带pscp.exe。

(2)Gow工具包也默认带有pscp.exe程序:前面我们说过,在Windows环境要执行一些Unix/Linux命令可以通过安装Cygwin来实现,但遗憾的是Cygwin中却不带pscp.exe,而Gow是另一个包含了大量Unix/Linux命令的工具集,可以作为Cygwin的轻量级替代品来使用。

我选择了通过安装Putty来使用pscp命令。

安装好Putty之后,需要将Putty的安装路径添加到Jenkins中,设置路径:【Manage Jenkins】->【Configure System】-> 【Global properties】-> 【Environment variables】,设置Name为“Path”的变量值,如下图所示:

注意: Putty的安装路径只能通过在Jenkins中设置Path变量的方式添加才能生效,而设置在主机的Path变量中并不能生效。

此时,似乎准备工作都已经就绪,可以通过pscp命令传输文件了,于是在Jekins中执行如下命令:

pscp -pw xxx xxxx.tar.gz root@192.168.56.101:/root

但是!却意外地报错了:

ssh_init: Network error: Cannot assign requested address
Build step 'Execute shell' marked build as failure
Finished: FAILURE

于是继续搜索解决办法,看到Stack Overflow上有人提过ssh_init: Network error: Cannot assign requested address的问题,需要指定端口。

于是明确指定端口再次执行:

pscp -P 22 -pw xxx xxxx.tar.gz root@192.168.56.101:/root

继续报错:

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) Connection abandoned.
Lost connection
Build step 'Execute shell' marked build as failure
Finished: FAILURE

根据提示信息可以知道,大概是无法确保目标主机是可信任的,需要手动确认(有点类似于在使用scp命令时需要手动输入密码的意思)。

由于在Jenkins中执行命令是无法手动参与的,所以继续寻找解决办法,同样在Stack Overflow上看到有人提出相同的疑问:getting-the-servers-host-key-is-not-cached-in-the-registry-when-using-pscp-ex

解决办法是通过pscp的选项参数-hostkey明确指定远程主机的指纹信息(这个指纹信息就是上述错误信息中提示一段十六进制串:74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a),再次执行命令如下:

pscp -P 22 -pw xxx -hostkey 74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a xxxx.tar.gz root@192.168.56.101:/root

终于成功了!!!

到这里,无需手动输入密码的文件传输终于解决了,于是后续的其他配置也都可以顺利进行。

最后总结

如下,对在Windows环境执行Unix/Linux命令做一下小小的总结。

第一,在Windows环境中执行Unix/Liunx命令可以通过安装工具集Cygwin或Gow来实现,当然,也有可能还需要安装OpenSSH。

第二,在Windows环境下的Jenkins执行Unix/Linux命令需要使用Git客户端提供的sh.exe环境。

第三,在Windows环境下要实现免输入密码方式的文件传输,只能使用pscp.exe来实现,并且在Jenkins中执行时还必须明确指定端口(-P 22)和远程主机的指纹信息(-hotkey xx:...)。

最后的最后,还是要再次告诫大家,除非万不得已,千万不要在Windows环境折腾Unix/Linux命令的事情,坑太多了!

【参考】

https://stackoverflow.com/questions/62817854/ssh-init-network-error-cannot-assign-requested-address

https://stackoverflow.com/questions/42841923/getting-the-servers-host-key-is-not-cached-in-the-registry-when-using-pscp-ex

记一次在Windows10桌面环境搭建Jekins的吐血经历的更多相关文章

  1. Windows10开发环境搭建

    开发环境基本介绍:(是以刚重装过系统的电脑进行介绍的,电脑刚装完的操作见其他的文档) Eclipse环境搭建: 1. 下载JDK (本例以JDK13.0.1为例) 2. 配置环境变量(主要是JAVA_ ...

  2. Windows10 WSL下 龙芯3A 交叉编译环境搭建

    记个流水账避免事后忘记怎么搭建的 - - 环境 Key Value 系统 Windows10 WSL系统 Ubuntu 下载工具链 http://www.loongnix.org/index.php/ ...

  3. Python3+PyQt5+PyCharm 桌面GUI开发环境搭建

    Python3+PyQt5+PyCharm 桌面GUI开发环境搭建 一.安装python PyQt5所支持的python版本是不低于3.5版本 python3.5以上的版本安装:https://www ...

  4. 记一次搬迁到 OpenShift 并搭建 PHP5.5 环境等

    http://blog.laobubu.net/archives/move-to-openshift/ 记一次搬迁到 OpenShift 并搭建 PHP5.5 环境等 Nov 24, 2014 十一月 ...

  5. Windows10的Ubuntu子系统开启桌面环境

    原文:Windows10的Ubuntu子系统开启桌面环境 Ubuntu 优势之一就是桌面环境比较好,所以咱们的子系统当然也不能少了这一环节,本小结开始安装Ubuntu 桌面系统. 安装环境 使用下面指 ...

  6. Windows10访问Ubuntu子系统(WSL)的桌面环境

    原文地址:https://blog.csdn.net/xmh19936688/article/details/90212960 Windows10访问Ubuntu子系统(WSL)的桌面环境文章目录Wi ...

  7. 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子

      本文介绍了如何使用技术栈PyCharm+Qt Designer+PyQt5来开发桌面软件,从环境搭建.例子演示到对容易混淆概念的解释.文中用到的全部软件+代码下载链接为:https://url39 ...

  8. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...

  9. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(1)- 环境搭建(Python2.7.14 + pySerial3.4 + wxPython4.0.3)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之环境搭建. 在写Jays-PyCOM时需要先搭好开发和调试环境,下表列出了开发过程中会用到的所有软 ...

随机推荐

  1. 12、关于系统cpu的计算

    1.cpu核数和逻辑cpu: CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数: 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 2.查看linux的cpu相关信 ...

  2. vue cli3 创建项目

    1.确认是否由安装由vue 命令提示符 执行 vue -V 如果没有则执行 npm uninstall vue-cli 2.创建项目 vue create demo1 具体操作如下: (1)执行以上命 ...

  3. 『心善渊』Selenium3.0基础 — 18、使用Selenium操作浏览器的弹窗

    目录 1.操作浏览器自带弹窗 2.操作浏览器页面自定义弹窗 1.操作浏览器自带弹窗 (1)说明: webdriver中处理JavaScript所生成的alert.confirm 以及prompt 弹窗 ...

  4. CRM客户管理系统哪个好用

    当企业管理者在进行CRM系统的选型时,面对搜索引擎上五花八门的结果和各式各样的广告,一定会有这样的疑惑:CRM客户管理系统到底哪个好用?抛开网上那些为了广告效果而"夸张"出的优点, ...

  5. mongodb数据的导出导入

    1.[导出]mongoexport -h (主机名) -d (库) -c (集合名) -o (路径) -u (账号) -p (密码)示例:mongoexport -h localhost -d jav ...

  6. Java实验项目三——职工类对象数组按照职工生日排序

    Program: 修改项目三(1)中的第3题,实现比较方法,将对象数组的数据按照生日的大小给职工排序. Description:令日期类MyDate和员工类Worker类实现接口Comparable, ...

  7. 全彩LED灯

    1.全彩 LED 灯,实质上是一种把红.绿.蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致.例如, ...

  8. 入门Kubernetes-minikube本地k8s环境

    前言: 在上一篇 结尾中使用到了minikube方式来做k8s本地环境来学习k8s. 那么这篇先了解下minikube及使用 一.Minikube 简介 minikube 在 macOS.Linux ...

  9. Luogu P2754 星际转移问题

    Luogu P2754 星际转移问题 思路 首先,对于地球能否到达月球的问题,考虑使用并查集维护. 对于每艘飞船能够到达的站点,放进一个集合里,若两艘飞船的集合有交集,那么就合并两个集合,最后只要地球 ...

  10. asp.net c# 保存图片到sql2008

    //图像数据表:tx//字段id (nvarchar(50) ,image(image)//tgav为图片ID,实质为上传前的主名 (省略了.jpg)private void kkkkk(byte[] ...