WebHooks实现项目CI/CD

前言

在博客中常常都能听到项目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);

先看一下服务起成功了没有,成功

将准备好的接口填入,点击一下测试。

可以看到返回数据就代表成功了。接下来就只配置好就可以了

安装必要的包

  1. 查看服务器是否有安装git,不然脚本执行git pull 会报错。没有安装的话使用系统包管理工具安装就可以了
  1. 查看项目是使用npmyarn还是什么别的,确保服务器上也有安装,我的项目是使用npm的,没有安装的安装下就可以了。

配置SSH

  1. 终端输入ssh-keygen,在当前用户的主目录下会生成.ssh文件夹,里面放着公钥和秘钥。
  2. 查看公钥,执行命令cat ~/.ssh/id_rsa.pub,获取公钥
  3. 添加公钥

完成第一次项目搭建和配置生产环境路径

  1. 使用git clone克隆项目到目标文件夹下
  2. 根据项目情况执行对应的安装依赖命令
  3. 根据项目情况执行对应的打包命令
  4. 配置生产环境页面地址,看打包生成文件夹是什么,通常是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,到时候再发下文章。感兴趣的可以去试试。

相关推荐
m0_4648323621 分钟前
Linux服务器上安装git lfs命令
git
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦4 小时前
JavaScript substring() 方法
前端
无心使然云中漫步5 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者5 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_5 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋6 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120536 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢6 小时前
【Vue】VueRouter路由
前端·javascript·vue.js
随笔写8 小时前
vue使用关于speak-tss插件的详细介绍
前端·javascript·vue.js