如何创建一个 GitLab Web Hooks?

发布于 2021-06-15 13:06:36 字数 4635 浏览 1271 评论 0

Git Hooks

Git 能在特定的重要动作发生时触发自定义的脚本。

这些脚本都被存储在 Git 目录下的 hooks 子目录中 .git/hooks。当 git init 初始化一个仓库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本一般都是 shell 脚本。不过自定义的可执行脚本可以使用你喜欢的脚本语言,如 Ruby、Python 等。

这些示例的名字都是以 .sample 结尾,如果需要启用它们,首先要移除这个后缀:

cd.git/hooks
ls
applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-push.sample
pre-rebase.sample
prepare-commit-msg.sample
update.sample
cp applypatch-msg.sample applypatch-msg

钩子按功能分来两类:客户端和和服务器端的。

客户端钩子由诸如提交(commit)和合并(merge)这样的操作所调用,而服务器端钩子作用于诸如接收被推送(push)的提交这样的联网操作。

GitLab Web Hooks

顾名思义,Web Hooks 的含义是将本地脚本接口化。GitLab 能在特定的重要动作发生时调用自定义的接口。接口的内部逻辑实现自动化部署或自动化测试的代码。

搭建接口服务

以 nginx + supervisor 部署 flask 应用作为我们的接口服务。

基于 flask 框架搭建接口服务

创建 python 文件:

vi web_hooks_flask.py

写入以下代码:

#! /usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask, request
import json
import os

app = Flask(__name__)

@app.route('/', methods=['POST'])
def index():
  path = '/home/www/test/'  # 项目目录
  return _hooks(path, request.data)

def _hooks(path, data):
  post_data = json.loads(data)
  ref = post_data['ref']
  branch_name = ref.split('/')[-1]
  status = os.system("cd %s && git checkout %s && git pull --rebase" % (path, branch_name,))
  if status == 0:
    return 'success'
  else:
    return 'error'

if __name__ == '__main__':
  app.run(threaded=True, debug=True)

保存后,启动服务:

python web_hooks_flask.py

启动成功:

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 569-323-263

supervisor 管理进程

supervisor 是一个进程管理程序,能将一个普通的命令行进程变为守护进程,并监控进程状态,异常退出时能自动重启。

在 supervisor 的配置文件中追加:

[program:web_hooks_flask]
command=python /path/web_hooks_flask.py  # path 改为具体部署的绝对路径
redirect_stderr=true
stdout_logfile=/path/web_hooks_flask.log  # path 改为具体部署的绝对路径

更新配置文件:

supervisorctl update

启动进程:

supervisorctl start web_hooks_flask

查看进程:

supervisorctl
web_hooks_flask   RUNNING   pid 29526, uptime 2 days, 20:58:51

nginx 作为反向代理服务器

向 nginx 配置文件中追加配置:

server {
  listen       80;
  server_name hooks.test.com;  # 修改为服务器的ip或域名
  location / {
    proxy_pass http://127.0.0.1:5000;  # 反向代理
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

重启 nginx 服务。

在 GitLab 中配置 web hooks

在上图的URL中,填入 hooks.test.com 保存即可。

参考

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

文章
评论
84963 人气
更多

推荐作者

夢野间

文章 0 评论 0

doggiejohn

文章 0 评论 0

就此别过

文章 0 评论 0

初见终念

文章 0 评论 0

qq_rvKjBH

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文