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,到时候再发下文章。感兴趣的可以去试试。

相关推荐
web147862107237 分钟前
C# .Net Web 路由相关配置
前端·c#·.net
m0_748247808 分钟前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
飞的肖11 分钟前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
青灯文案119 分钟前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
m0_7482548823 分钟前
DataX3.0+DataX-Web部署分布式可视化ETL系统
前端·分布式·etl
ZJ_.35 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营39 分钟前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端1 小时前
0基础学前端-----CSS DAY9
前端·css
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui