前言最早的方法:前端代码写好后,在本地构建,通过服务器xftp或ftp上传文件到服务器进行更新使用Git后:服务器在根目录下执行gitpullorigin[branch]项目通过gitclone项目拉取自动部署仓库最新代码:配置WebHook和服务端后:项目打包提交到代码库,服务端自动拉取git中最新代码仓库。每次push代码到github,github都会向webhook中的url发送一个请求。服务端收到请求后,验证通过后会执行本地的bash脚本,并在脚本中写入从github拉取代码的命令。使用环境:Centos7.*,Node,Git代码库平台:Gitee/GithubTips:不同的运行环境配置不同,都可以实现过程描述1.在github项目中配置WebHook2.配置服务器,添加Node项目,运行项目1.配置WebHook1.1进入代码库配置webhook界面这里以github为例登录github->进入仓库-> 找到设置->进入webhook,这是已经配置好webhook点击添加webhook现在github中的webhook已经配置成功,接下来就是配置服务器2.配置服务器配置环境下载git,在Node环境下创建一个Node项目。最好保存在代码库中。可以参考web-hook,它是一个服务端的Node项目Demo,使用Node编写自动化部署脚本。参考web-hook1。创建server.js监听一个端口server.jsconsthttp=require('http')//http模块const{spawn}=require('child_process')//子进程,用于执行脚本const{PORT,SECRET}=require('./src/config')//配置文件const{sign}=require('./src/utils')//工具文件const{resultString}=require('./src/resModel')//服务器返回JSONconstserver=http.createServer((req,res)=>{//打印传入请求console.log(`---${req.method}---${req.url}---`)//设置header为json格式res.setHeader('Content-Type','application/json')if(req.method==='POST'&&req.url==='/webhook'){//post/webhook都是来自github的请求console.log('---hitwebhook---')//getbodyletbuffers=[]req.on('data',buffer=>{buffers.push(buffer)})req.on('end',()=>{letbody=Buffer.concat(buffers)//获取header中的事件字段,github为push,gitee为PushHookletevent=req.headers['x-github-event']||req.headers['x-gitee-event']console.log(`---事件名称:${event}---`)if(req.headers['user-agent']==='git-oschina-hook'){//giteeconsole.log('---Giteeplatform---')//SECRET在config.js中配置if(req.headers['x-gitee-token']===SECRET){if(event==='PushHook'){console.log('---推送任务命中---')letpayload=JSON.parse(body)console.log(`---任务名称:${payload.repository.name},路径:${payload.repository.path}---`)//启动子进程执行相应的脚本//payload.repository.path是repofromgitee/github的路径//通过值执行sh目录下的相应脚本path//例如项目名为web_hook,path的值为web_hook//执行的脚本为./sh/web_hook.shletchild=spawn('sh',[`./sh/${payload.repository.path}.sh`])//从子进程接收数据letbuffers=[]child.stdout.on('data',buffer=>{console.log(`---接受数据${buffer.toString()}---`)buffers.push(buffer)})child.stdout.on('end',()=>{letlog=Buffer.concat(buffers)console.log(log.toString())控制台.log('自动拉取完成')})}//返回的json配置在./src/resModelres.end(resultString('success',0))}else{//不允许其他请求返回returnres.end(resultString('NotAllowed',1))}}else{//github//和上面的gitee基本一样,一个moreStepstoverifyidentityconsole.log('---Githubplatform---')letsignature=req.headers['x-hub-signature']//sign方法在utils.js中配置if(signature!==sign(body,SECRET)){returnres.end(resultString('NotAllowed',1))}if(event==='push'){console.log('---推送任务命中---')让payload=JSON.parse(body)console.log(payload.repository.name)让child=spawn('sh',[`./sh/${payload.repository.name}.sh`])让buffers=[]child.stdout.on('data',buffer=>{buffers.push(buffer)})child.stdout.on('end',()=>{letlog=Buffer.concat(buffers)console.log(log.toString())console.log('自动拉取完成')})}res.end(resultString('success',0))}})}res.end(resultString('NotFound',1))})//监听端口,PORT在config.js中配置server.listen(PORT,()=>{console.log(`web-hooklistenonhttp://localhost:${PORT}`)})Tips:接收github发送的post参数:Webhooks|GitHubDeveloperGuide推荐阅读gitee平台的使用说明(中文,参数类似)Gitee2。写入sh文件./sh/*.sh#!/bin/bashWORK_PATH="/home/wwwroot/tools/vue-back"echo"------进入工程目录------"cd$WORK_PATHecho》------已经进入项目目录------》echo》------开始清理代码防止冲突------》gitreset--hardorigin/mastergitclean-fecho"------清理代码------"echo"------拉取master分支代码------"gitpulloriginmasterecho"------vue-back持续集成完成------》部署到服务器将写好的Node项目部署到服务器阿里云服务器需要手动配置开放自定义端口号Node项目推荐使用pm2自动部署效果图:
