Skip to main content

One post tagged with "expect"

View All Tags

· 4 min read
石晓波

CI&CD基础介绍

CI:持续集成,CD:持续交付和持续部署。现代软件开发的需求加上部署到不同基础设施的复杂性使得创建应⽤程序成为⼀个繁琐的过程。当应⽤程序出现规模性增⻓,开发团队⼈员变得更分散时,快速且不断地⽣产和发布软件的流程将会变得更加困难。为了解决这些问题,开发团队开始探索新的策略来使他们的构建、测试和发布流程⾃动化,以帮助其更快地部署新的⽣产。这就是持续交付和持续集成发展的由来。

持续集成(CI)是⼀个让开发⼈员将⼯作集成到共享分⽀中的过程,从⽽增强了协作开发。频繁的集成有助于解决隔离,减少每次提交的⼤⼩,以降低合并冲突的可能性。

手动实现一个简单的CI/CD

为了了解CI/CD的工作原理,让我们来实现一个简单的CI/CD。实现CI/CD需要借助于几个库chokidar 监听文件变化,shelljs执行shell命令。

index.js
const shell = require('shelljs');
const path = require('path');
const chokidar = require('chokidar')

const form = "./profile1.html*";
const to = "root@106.52.73.93";
const password = "1234567890";
const expectPath = path.join(__dirname, './expect.exp');

//const test = shell.exec('npm run test')
//if(test !== 0){
// process.exit(1);
//}

//const status = shell.exec('npm run build')
//if(status !== 0){
// process.exit(1);
//}

const watch = chokidar.watch(process.cwd())

//shell.exec(`scp ${form} ${to}`);


//加入expect.ecp
watcher.on('change', function(filePath){
shell.exec(`expect ${expectPath} ${filePath} ${to} ${password}`);
})

如上实现了基础的自动测试,自动编译打包和部署到服务器。但是在本机配置了免密登录的基础上才能正常运行否则执行scp命令的时候需要输入用户密码,阻塞自动化流程,并且所有的机器我们不一定有所有的控制权不可能给每台机器都配置免密登录,所以加入expect.exp可以监听到命令行密码的输入,可以命令的方式填入密码实现自动交互。

expect.exp
#!/usr/bin/expect
set from [lindex $argv 0]
set to [lindex $argv 1]
set password [lindex $argv 2]

set timeout 30
spawn bash -c "scp $from $to"

expect{
"*password:" {send "$password\r"}
}

interact

思考和优化点

如果有多台机器,如何实现动态部署到多台机器上?

答:可以使用数组保存from和to,循环遍历,将生产的结果文件使用scp命令部署到不同的机器。密码需要写入配置文件中,对密码配置文件使用加密保存。

如何读取超大日志文件?

答:使用stream+多线程处理