# 胖模式自动打包替换环境代码

# 背景

胖模式由于项目老旧,使用的node版本也是很多年前的,每次需要替换后台环境代码时十分麻烦

需要切换到node5版本,删除本地运行的node_modules,解压流水线的node_modules包,再npm run build,打包完后,需要登录后台,复制文件夹、替换代码、重启服务,一套流程下来基本20分钟过去了,十分影响开发体验及效率

# 优化

# 打包与开发环境统一

通过查看流水线的node_modules包,获取需要的三方包为:

"del": "1.2.0",
"fs": "0.0.2",
"gulp": "^3.8.11",
"gulp-concat": "2.5.2",
"gulp-minify-css": "1.1.1",
"gulp-rename": "1.2.2",
"gulp-uglify": "1.2.0",
"through2": "0.6.5"

全部按指定版本安装好,这样开发环境和打包就不用两套了

# 上传方案一

由于拓扑图、控制器之前都弄过打包后自动上传,可以参考实现思路

使用node-ssh,连接后台后,执行修改、复制、上传、重启的操作。

但是试了很多个版本,发现连接后execCommand执行命令都没反应,而同样的代码却可以在控制器环境成功执行,怀疑是胖模式限制了远程执行命令。

# 上传方案二

参考了后台使用Python写的远程执行命令的脚本,发现胖模式需要先aadmin登录才能执行命令。

于是查看nodejs有什么办法可以实现

发现ssh2可以开启shell的交互式对话,然后通过代码执行登录逻辑后就可以执行命令了。

具体逻辑:

conn.connect({
  host: config.host,
  username: config.username,
  password: config.password,
  port: config.port,
});

conn.on("ready", () => {
    conn.shell((err, stream) => {
        stream.write("aadmin" + "\n");
        
        stream.on("data", async (data) => {
            if (res === "Password: ") {
                // 执行二次登录
                stream.write("xxx")
            } else if (xxx) {
                // 处理其它各种命令
            }
        })
    })
});

能执行命令后一切就好办了,参照以前的手动流程

通过ssh的方法修改配置、复制代码、上传代码、重启,即可实现自动上传代码

最后在package.json中添加执行命令:

"upload": "npm run build && node ./build/upload/index.js"

后续只需要一键即可实现打包上传代码的效果。