喜闻乐见的背景故事时间--承接[prerender-spa-plugin]--微型Vue项目的静态化利器,官网上线之后,就开始琢磨,每次改动都得上服务器部署一下,是不是有点麻烦了,是时候该整个自动化部署惹:)然后就开始自己挖坑自己填啦。

本文将会涉及的内容--

  • Webhook是啥?什么时候该使用它?
  • 该怎么利用Webhook解放我们的双手?
  • 小结

Webhook是啥?什么时候该使用它?

以我司为例,我们团队内部使用Gitlab作为代码仓库,所以以下内容都是在Gitlab中进行实践的,当然在Github上其实也是大同小异的。

Webhook顾名思义,其实就是一钩子。当我们在Gitlab上做出某些特定操作时,可以触发钩子,去进行一些我们事先设定好的脚本,以达到某些特定功能(例如--前端项目自动发布)。

也许熟悉Gitlab的同学会说了,这不就是CI吗,为什么好好的CI放着不用要去搞webhook呢?确实,CI也能完成一样的功能,但是也要结合业务实际状况而言。该项目并非公司核心项目,跑CI的runner需要有Gitlab控制权限的同事帮忙配置,本着不骚扰同事的原则,个人认为应该自己动手丰衣足食,既然有简单便捷的webhook为什么不用呢?

什么时候才应该去使用它呢?个人认为至少要有这几点:

  • 项目不是一成不变的
  • 你是项目的负责人
  • 你有权限进入部署项目的服务器
  • 你能挤得出时间来踩坑

该怎么利用Webhook解放我们的双手?

上图是Gitlab中有关webhook的配置页面,当我们成功进行了[Trigger]内部的某些或某些操作时,比如Push events--成功push了一次代码,无论是向哪个分支push,都可以触发hook......

之后Gitlab将会自动的替我们向URL中的链接发去POST请求,这里可以是脚本也可以是服务,只要能够成功接收来自Gitlab的请求即可。在本次实践中,我起了一个node服务来帮助完成自动化部署。

那么就有一个问题了,请求那个URL就会触发node服务中的部署流程,那么万一有人一直在玩那个接口,会不会把服务搞挂或是把网站搞挂呢?还真有可能...所以Gitlab给了我们设置Secret Token的机会,我们检测到请求有带有这段特殊的token才能认为本次请求是安全可接受的。

It will be sent with the request in the X-Gitlab-Token HTTP header.

这里需要注意一下的是,实际上我们并不会找到X-Gitlab-Token这个请求头,我们只会匹配到x-gitlab-token这个字段,别问我为什么知道的,大家注意避坑就好:)

下面讲讲在服务器上我们是怎么接收Gitlab的请求并且执行部署的--

const exec = require('child_process').exec
const express = require('express')
const app = express()let isLocking = falseapp.post('/deploy', function (req, res) {let headers = req.headerslet cmdStr = 'cd ... && git fetch origin && ...'if (!isLocking && headers['x-gitlab-token'] === 'xxx') {isLocking = trueexec(cmdStr, function (err, stdout, stderr) {if (err) {// ...console.log('error:' + stderr);} else {// ...console.log(stdout)isLocking = false}})}// ......
})app.listen(1234, '0.0.0.0', function () {console.log(`listening on port 1234`)
})
复制代码

在项目部署的机器上,跑了这个简单的node服务,大意是当Gitlab POST一个请求过来时,我们进行鉴权,随后通过node去执行一段命令行语句,根据执行的结果调用不同的方法。这里有几个坑点--

node服务搭建

贪图方便,依赖了一下express,当然我们是可以用http模块来完成这些操作的,另外监听端口的时候需要确认当前端口是否可被外网访问。

node执行服务器命令行

我们可以使用node中'child_process'模块的exec方法来执行命令行语句,将定义好的命令行语句字符串传入exec方法作为第一个参数即可,后面一个参数则是执行结果的回调,依照业务需要设计即可。

发布鉴权&&发布状态

通过Gitlab请求中带来的token来鉴定本次请求是否能够触发下面的部署,并且需要设定一个"发布中"的状态,防止多次请求带来的各种无法预知的后果。

上面的代码只是最基本的发布服务,在里面可以做任何事,发布完成或失败的各种通知,甚至还可以对提交的代码进行检测,倘若不符合规范还可以拒绝本次自动部署......只要想踩坑,一切皆有可能~这样反映出webhook的灵活,只需对git做一个简单的操作,就可以推倒多米诺骨牌,完成一些意想不到的操作。

小结

本切图仔第一次踩这方面的坑,希望对萌新们有所帮助,也希望大大们轻拍。接下来,可能会有一个基于python的自动部署完成后微信通知脚本,敬请期待,当然也可能没有:)毕竟只是个切图仔,搬完该搬的砖就到睡点了> <

[Gitlab]使用Webhook实现前端项目自动发布相关推荐

  1. Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...

  2. Jenkins进阶-Gitlab使用Webhook实现Push代码自动部署(3)

    2019独角兽企业重金招聘Python工程师标准>>> Jenkins进阶-Gitlab使用Webhook实现Push代码自动部署(3) 博客分类: 运维 1.Jenkins 安装完 ...

  3. Jenkins+Github+Nginx实现前端项目自动部署

    Jenkins+Github+Nginx实现前端项目自动部署 前言 最近在搭建一个自己的网站,网站框架搭好了要把项目放到服务器运行,但是每次更新网站内容就要手动部署一次,实在很麻烦,于是就想搭建一套自 ...

  4. Jenkins+Gitlab+Nginx+SonarQube+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    环境拓扑:  Jenkins -192.168.1.30  Gitlab -192.168.1.31  LB -192.168.1.32  Web1 -192.168.1.33  Web2 -192. ...

  5. 【项目自动发布】基于Docker/单节点Rancher/GitLab搭建简易的CI/CD流水线(备忘+补充完善)

    前言 最近面试好像也经常问到一个问题: 你们项目是怎么发布的 传统的Java项目都是本地打包成 jar包 或者 war包, 上传到服务器, 然后通过shell脚本的方式启动的 要求我们具备一定的she ...

  6. ubuntu php 无法执行exec_利用webhook使php项目自动部署

    php中文网最新课程 每日17点准时技术干货分享 1.先来讲一下自动部署的原理,一般在我们push代码的时候,可以自动请求webhook中设置的url,完成一次请求与响应. 那么只要我们设置的url地 ...

  7. jenkins + gitlab实现自动化打包前端项目

    参考文档:https://zhuanlan.zhihu.com/p/29254427 https://www.pianshen.com/article/84401360275/ 安装java jdk运 ...

  8. 前端项目自动生成i18n国际化语言文件插件

    好久没上掘金了,之前一直在忙着新业务,没时间(其实自己清楚这些都只是借口,就是犯懒了),今天又带来了一个小插件,用于提取项目中所有的i18n语言文本并且翻译生成所有语种文件,如果觉得翻译接口翻的不好的 ...

  9. tomcat项目自动发布脚本.脚本运行效果

    ./update +--------------------------------------------------------------+ | === 确定特定用户执行,否则退出  === | ...

最新文章

  1. Error in ** : incorrect number of dimensions
  2. 1032:大象喝水查
  3. 机器学习用于金融市场预测难在哪?
  4. VS2010+Opencv-2.4.0的配置攻略
  5. H5 存储数据sessionStorage
  6. 幸福的源泉:Life is about choices 幸福可以选择
  7. C++ boost::upgrade_lock upgrade_to_unique_lock 升级锁 是什么 怎么用
  8. python取整数部分语句_pythonlogi中不使用条件语句的整数取整
  9. Webstorm 2021 开启内存显示设置
  10. RuntimeError: Exporting the operator prim_DictConstruct to ONNX opset version 11 is not supported.
  11. 超级右键-Mac右键扩展工具
  12. Spring事务如何集成到Mybatis之Mybatis事务
  13. 【用户画像】从0到1掌握用户画像知识体系
  14. 魔百和CM201-1 线机教程 救砖(大部分情况能用)
  15. 上门洗车小程序/APP功能介绍
  16. Linux DTS中和中断相关属性的解释和用法
  17. 触摸屏 服务器系统,IP网络触摸屏服务器 SK1606
  18. 信号与系统 - 卷积运算
  19. Intel NUC10i7FHN安装Ubuntu16.04
  20. python爬虫获取拉钩网在线搜索招聘信息(超实用!)

热门文章

  1. Bzoj2555 SubString
  2. 创建 Monitor 并测试 - 每天5分钟玩转 OpenStack(124)
  3. linux的core文件认识
  4. win10 中redis client提示 ERR Client sent AUTH,but no password is set
  5. PHPExcel对于Excel中日期和时间类型的处理
  6. [转]EXP-00056: 遇到 ORACLE 错误 31600
  7. javascript中的事件问题的总结
  8. Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上
  9. oracle错误:ORA-12545
  10. java获取随机值的方法