记录一次cicd发布到windows环境配置踩坑过程

背景

我们公司内部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 ,也不保证一直可以访问

github.com/PowerShell/...

解压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...

相关推荐
四喜花露水几秒前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
前端Hardy10 分钟前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
web Rookie40 分钟前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust1 小时前
css:基础
前端·css
帅帅哥的兜兜1 小时前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
yi碗汤园1 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
就是个名称1 小时前
购物车-多元素组合动画css
前端·css
编程一生1 小时前
回调数据丢了?
运维·服务器·前端
丶21362 小时前
【鉴权】深入了解 Cookie:Web 开发中的客户端存储小数据
前端·安全·web
Missmiaomiao3 小时前
npm install慢
前端·npm·node.js