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

相关推荐
风尚云网6 分钟前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
木子02048 分钟前
前端VUE项目启动方式
前端·javascript·vue.js
GISer_Jing10 分钟前
React核心功能详解(一)
前端·react.js·前端框架
捂月14 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
深度混淆21 分钟前
实用功能,觊觎(Edge)浏览器的内置截(长)图功能
前端·edge
Smartdaili China22 分钟前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
秦老师Q23 分钟前
「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
前端·chrome·edge
滴水可藏海24 分钟前
Chrome离线安装包下载
前端·chrome
m512734 分钟前
LinuxC语言
java·服务器·前端
Myli_ing1 小时前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html