前言
在博客中常常都能听到项目CI/CD
,很高大上样子但是并不知道是什么。CI/CD
是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的缩写。
- 持续集成(CI):是一种软件开发实践,开发人员将会频繁地(一天多次)将代码集成到主干。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
- 持续部署(CD):是一种软件开发实践,通过自动化的步骤,软件在被合并到主干后,就会被部署到生产环境。这意味着软件的新版本总是可以供用户使用。
翻译成简单的来说,你只管提交代码,对应环境的代码就会自动更新打包发布。(我们公司是develop和test环境代码只要有合代码就拉取最新代码并打包发布。生产环境发版的话,是先合代码再手动点击发布。不知道大家是怎么样的。我们之前用的发版系统是jenkins
现在用的是JPOM
,后面也会去试一下)。
但是,今天先从简单的CI/CD
入手,万变不离其宗。都是hook
监听到代码的推送、合并等,触发事件,然后拉取最新代码,最后打包发布。
事先准备好服务器和域名。
正文
准备一个接口
先准备一个POST
接口,为下面hook
的触发做准备
使用koa
起一个服务,并编写一个POST
接口,根据条件判断是否执行shell
脚本,脚本的内容就是拉取代码并打包,下面会讲
js
let Koa = require('koa');
let app = new Koa();
var bodyParser = require('koa-bodyparser')
app.use(bodyParser());
const { spawn, exec } = require('child_process');
const path = require('path');
let Router = require('koa-router')();
let koaStatic = require('koa-static');
//到public目录下找,返回资源链接
app.use(koaStatic(path.join(__dirname, 'public')))
app.use(async (ctx, next) => {
ctx.set('Access-Control-Allow-Origin', '*');
ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With');
ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
if (ctx.method == 'OPTIONS') {
ctx.body = 200;
} else {
await next();
}
});
Router.get('/api', async (ctx) => {
ctx.body = "服务器1"
})
Router.post('/api/build', async (ctx) => {
const payload = ctx.request.body;
const branch = payload.ref.split('/').pop();
if (branch === 'master') {
const scriptPath = path.join(__dirname, 'todoList.sh');
const args = [`${branch}`];
//执行一个shell脚本
const child = spawn(scriptPath, args);
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
})
ctx.body = "master分支打包"
} else {
ctx.body = "非master分支,不打包"
}
})
app
.use(Router.routes()) //启动路由
.use(Router.allowedMethods());
app.listen(4000);
先看一下服务起成功了没有,成功
将准备好的接口填入,点击一下测试。
可以看到返回数据就代表成功了。接下来就只配置好就可以了
安装必要的包
- 查看服务器是否有安装
git
,不然脚本执行git pull
会报错。没有安装的话使用系统包管理工具安装就可以了
- 查看项目是使用
npm
、yarn
还是什么别的,确保服务器上也有安装,我的项目是使用npm
的,没有安装的安装下就可以了。
配置SSH
- 终端输入
ssh-keygen
,在当前用户的主目录下会生成.ssh
文件夹,里面放着公钥和秘钥。 - 查看公钥,执行命令
cat ~/.ssh/id_rsa.pub
,获取公钥 - 添加公钥
完成第一次项目搭建和配置生产环境路径
- 使用
git clone
克隆项目到目标文件夹下 - 根据项目情况执行对应的安装依赖命令
- 根据项目情况执行对应的打包命令
- 配置生产环境页面地址,看打包生成文件夹是什么,通常是
build
或者dist
对应上就行
编写shell脚本
sh
# todoList.sh
#到项目的目标文件夹下
cd /www/wwwroot/xxxxxxxxx
# 拉取代码
git pull 'xxxxxxxxxxxxxx' master
# 安装依赖
npm install
# 打包
npm run build
到这里就结束了,可以去push
一下master
分支试一下。
结尾
WebHooks
来实现项目CI/CD
的过程基本就是这样的,还有很多地方可以改进,这里只是演示一下就没有那么细,可以自己补充。后面的话会去试一下JPOM
,到时候再发下文章。感兴趣的可以去试试。