- Published on
自动化构建部署github仓库到国内的服务器
背景
最近在部署nodejs的项目时遇到一个问题,这个项目本身规模较小,没有采用标准的CICD流程,也没有K8S或者docker的容器化,因此只是在一个云服务器上简单的执行一下启动命令。
原初,就是简单的登录服务器,从github仓库拉取代码,然后执行构建,最后启动服务。
但是后来发现有两个问题:
一是github连接经常不稳定,当然这个可以通过代理地址解决。 第二个问题是这个项目在执行node的构建命令时候cpu占用非常高,而这个某云厂商的边角料轻量云服务器,cpu占用一高之后居然无响应了,无法登录终端,停止不了构建进程。只能重启机器。
基于以上问题,我决定把构建流程从服务器中抽离出来。这件事最简单的办法就是本地构建,然后把构建后的文件上传到服务器。不过我因为一些原因不想要本地做构建,于是便有了这个方案。
方案
本篇文章只描述一些重点的环节内容,并非零基础的手把手教学,如果有什么这里没提到的问题需要询问,可以在公众号
奕象派私信询问。
首先要找一个免费的持续部署的服务,我选择了使用https://coding.net/。整体流程分三步:
1:github仓库关联,持续部署脚本可以直接连接github仓库,而不需要迁移仓库到coding自身来。 2:配置构建脚本 3:配置部署脚本
关联github仓库
登录coding,创建一个项目,进入项目后选择代码仓库-关联仓库,点击“关联代码仓库”,授权github后把需要部署的仓库关联过来即可。(关联的github仓库可以像本地仓库一样直接在构建计划中读取使用,并且可以很好的触发更新动作,非常方便)

配置构建脚本
切换到持续集成-构建计划,新建一个自定义构建过程,并选择刚才关联的github的仓库。

因为我想使用node V20的版本进行构建,但是coding默认提供的不是这个版本的node,因此这里需要自己选择一个构建环境的镜像,点击开始节点修改为需要的docker镜像即可。

然后就是增加一个新的阶段,配置执行构建需要的shell命令即可。
这里注意的是,代码默认会fetch到
/root/workspace目录,执行shell脚本默认也是这个目录,
配置部署脚本
因为项目是单服务实例运行的,所以无法实现滚动升级,因此为了避免服务升级耽误过多的时间,这里我们先把构建后的文件打包成压缩包,然后通过scp命令上传到服务器,再从服务器上进行解压缩覆盖文件,最后重启服务即可。
这里重点说一下免密码的scp的方法。
首先进入项目设置-开发者选项,打开凭据管理的tab页,进入录入凭据操作,把免密登录的ssh密钥配置在这里。

然后回到构建计划配置页面继续配置,我们添加一个新的阶段,并增加一个withCredentials 凭据的操作,在这里选择刚才添加的密钥(需要授权给这个计划才可以看到),并且在子步骤中增加一个shell命令的步骤

shell脚本的核心内容如下:
scp -o StrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY_PATH} build.tar.gz root@server.com:/root/build/
-o StrictHostKeyChecking=no: 这个参数是为了忽略未知的host主机警告,因为每次构建都是一个新的容器环境,因此要跳过警告-i ${SSH_PRIVATE_KEY_PATH}: 是为了指定ssh的密钥文件,SSH_PRIVATE_KEY_PATH是withCredentials 凭据中给出的变量地址
至此我们便完成了文件上传到目标服务器的配置,后面只要在服务器上解压构建的制品包,并重启服务即可。这个操作可以通过远程ssh执行,也可以手动进入服务器执行。这部分不是这篇文章的重点,不再详细描述。
配置自动触发
在构建计划的触发规则配置里,启用代码更新时自动执行即可。

