背景
我们公司内部CICD运行在内网服务器centos 7.4版本,之前部署的项目都是在linux系统,直接通过ssh部署就行。
这次有点不一样,我们外部公司的项目运行需要运行在windows上,因为对方提供的服务器是windows,而且他们这个服务器上还不能重装。
所以,文章记录在windows上配置好docker和ssh,让我们公司内部的CICD能直接发布项目到外面公司windows服务器上。
本文章内容有这些:
-
windows上安装ssh,docker的过程
-
centos设置ssh免密登录windows服务器
搞了大半天才弄完,期间遇到一些问题:
-
docker 版本与 windows server 2016 不匹配,服务启动不了,又改为docker 20.10.9重新来
-
windows服务器重启了,等了很久没启动起来,又联系对面看原因
-
ssh-copy-id 设置免密登录windows报错,改为收到拷贝公钥
-
jenkins发布时ssh报错 Permission denied (publickey,keyboard-interactive)
-
jenkins流水线中是支持linux服务器是root账号,同时支持windows的administrator账号
-
ssh 远程命令中有 xargs ,在windows下不支持
windows 安装docker环境
下载离线包
download.docker.com/win/static/...
我选择的是 20.10.9版本下载 zip文件
注意:最开始我用的24.0.6版本,结果后面服务器启动不起来,在windows事件查看器中找到原因,就是我服务器windows server 2016用不了这么高版本的docker,又来改低的。
解压
C:\Program Files\docker
创建 daemon.json
ruby
{
"registry-mirrors": [
"https://ung2thfc.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries":[],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
新建环境变量
添加容器服务功能,重启服务器
服务器配置器 -> 添加角色和功能 -> 功能 -> 容器 -> 重启服务器
将docker注册为服务
arduino
dockerd --register-service
手动重启下docker engine 服务
服务启动失败的话,在windows事件查看器中可以看到报错原因,我遇到过 docker版本不匹配原因
windows 安装openssh
windows 新版一些系统已经内置ssh安装方法,直接在设置里面勾选即可,可以看官网。
要求是:
在开始之前,计算机必须满足以下要求:
- 至少运行 Windows Server 2019 或 Windows 10(内部版本 1809)的设备。
- PowerShell 5.1 或更高版本。
- 作为内置管理员组成员的帐户。
我们这个系统是windows server 2016 没法自动安装,于是需要手动下载包来安装。
自动安装
官网上有说明安装方法 learn.microsoft.com/zh-cn/windo...
手动安装
下载openssh压缩包
github会被墙,随缘打开,我查了国内镜像地址,把域名换成 kkgithub.com ,也不保证一直可以访问
解压openssh
解压到 C:\Program Files\OpenSSH
执行安装命令
我开始以为没有 install-sshd.ps1 这个文件,把文件扩展名勾选上,就看到这个全名字了,所以直接执行下面这句就行
arduino
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
防火墙开放端口
ini
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
启动ssh服务
sql
net start sshd
设置服务开机自启动
-
把
OpenSSH Authentication Agent
服务启动起来 -
在windows服务里面,把OpenSSH这两个服务启动属性设置为自动
windows设置免密登录
我们CICD服务器是centos,根据以前做法是直接在jenkins里面执行 ssh-copy-id
,以前centos是直接通过的,这次连接windows报错了,于是不能用 ssh-copy-id
,通过手动执行拷贝公钥方式
另外我试了在centos上执行 ssh administrator@10.xx.xx.xx
成功登录,手动输入登录密码能登录到windows服务器,但是我们需要设置免密登录,因为jenkins发布项目不用输入密码的。
手动设置公钥
进入 windows 服务器,进入C:\Users\Administrator\
,先创建文件夹 .ssh
(系统不允许直接文件夹命名.ssh,我是先叫其他名称,再改为.ssh成功了),再创建创建authorized_keys文件
从centos服务器上把公钥拷过来
没有公钥的先用ssh-keygen
生成
bash
cat ~/.ssh/id_rsa.pub
把公钥复制到windows的authorized_keys文件里面
确认authorized_keys用户权限
如果你不是administrator,要检查权限
修改sshd_config配置
进入C:\ProgramData\ssh找到sshd_config文件,这些是ssh启动后自动生成的,注意C:\ProgramData是隐藏文件夹,注意勾选显示隐藏文件夹
安装下面修改,我这边改了是PubkeyAuthentication注释掉,PasswordAuthentication改为no,后面两条注释掉
yaml
确保以下4条没有被注释改为一样
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
确保以下2条有注释掉
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
重启两个ssh服务
把两个OpenSSH服务重启下
centos上直接ssh登录成功
回到我们centos上,我们jenkins是docker安装的,我进到jenkins容器里面,这次直接ssh登录windows服务器,成功了,相当于我们刚才手动操作就是做了copy-ssh-id
的事情
linux命令支持
因为我们jenkins流水线代码中有些linux特殊的命令,在windows上是不存在的,所以需要让windows支持我们用到的 awk
,grep
,xargs
,rm
等
xargs 支持
我们在jenkins下打包报错了,因为我们上图中用到了xargs命令,所以要给windows命令行里面支持这个命令才行
在github上找到个命令 github.com/aaronater10...
过程是在 C:\Program Files\docker 创建文件 xargs.bat,因为这个目录我们前面已经加到 PATH系统变量里面了,所以这里建个 xargs.bat 文件就能被命令行直接识别到,把下面内容拷贝进去保存即可。
perl
:: CONFIG
@echo off
setlocal EnableDelayedExpansion
setlocal EnableExtensions
:: Default Variable and shift for next argument
set args=%1
shift
:: Evaluate how many user arguments
:blank_check
if not "%1"=="" (
set args=!args! %1
shift
goto :blank_check
)
:: Execute full arguments and read STDOUT as STDIN
for /f "tokens=*" %%g in ('more') do (
!args! %%g
)
goto :eof
grep 支持
下载 gnuwin32.sourceforge.net/packages/gr...
下载下来是一个exe:
grep-2.5.4-setup.exe
安装后,将安装地址bin目录C:\Program Files (x86)\GnuWin32\bin目录添加到PATH变量中
awk 支持
下载 sourceforge.net/projects/gn...
下载后是 zip文件,解压,同样把bin目录添加到PATH环境变量中
后记
既然能登录windows,在jenkins流水线中配置项目即可,CICD内容可以看之前文章 【一次公司内网CICD搭建过程】juejin.cn/post/729347...