V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
dcalsky
V2EX  ›  分享创造

webhook 部署革命: 使用 fish-hook 自动部署多个应用

  •  
  •   dcalsky · 2017-02-21 14:33:31 +08:00 · 2080 次点击
    这是一个创建于 2620 天前的主题,其中的信息可能已经有所发展或是发生改变。

    fish-hook

    一站式高效管理你多个 github webhook.

    背景

    等你辛苦建立好了静态博客,却依然要忍受每次本地更新后,还要 ssh 到远程重新 git pull 一遍的痛苦。

    当你终于用 webhook handler 写了一堆代码来解决这个应用的部署问题后,你依然发现,还有许许多多的项目等着你为它们写部署代码。

    要是有一个集成化的工具,在一个目录里帮我管理所有的 webhook 就好了! fish-hook 就是为此诞生的,它最大的特色就是:极力缩短开发者花在配置上的时间,约定大于配置。

    开始使用

    安装

    安装 python3.5 或更高版本,再用 pip 包管理工具安装 fish-hook

    $ pip3 install fish-hook
    

    新建 fish-hook 目录

    $ fish-hook init
    

    ssh 进入远程主机后,运行该命令,并且设置一个通用的端口,例如: 2333 。这样就创建了名为fish的目录,这是控制所有 webhook 的总目录。$ cd fish进入该目录。

    接收端: 为一个仓库创建 webhook

    $ fish-hook new
    

    假如你在 github 上开通了一个名为blog的仓库,并且打算为其开通 webhook 来实现自动部署。那么就输入blog以及你要为此 webhook 设定的密钥。 完成后,blog的 webhook 接收端就部署好了。

    发送端: 在 github 上创建 webhook

    首先打开仓库的 github 设置页面,然后创建 github webhook ,填入基本信息。 可以注意到Payload URL这一栏,前面的 IP 地址就是你远程主机的外网 IP 地址,之后是你刚刚设置的端口,斜杆后就是blog目录,与接收端的名字相同。 密钥一栏当然也要与在 fish-hook 上设置的相同。

    webhook

    设置接受 push 事件后的动作

    假设你使用git push推送了新的内容到 blog 仓库,如何执行特定的 shell 脚本呢? 此时的 fish-hook 目录是这样的:

    fish/
    	config.json
    	blog/
    		app_config.json
    		push.sh
    

    为什么有一个 push.sh 文件呢?就这意味着,当你仓库接受新的 push 事件后, fish-hook 就会运行push.sh这个 shell 脚本,里面的内容完全可以自己设置。

    这就是所谓的约定大于配置, webhook 接受到什么样的命令,就会运行相同名字的 shell 脚本,当然前提是你的目录里要存在这个脚本。

    上线

    $ fish-hook server
    

    fish-hook 为你封装了部署所需的 web server 。一条命令即可启动,此时所有的 webhook 都会被启用。

    开启 2333 端口

    centos 默认开启了端口防火墙,如果你使用了一些具备安全组的云主机服务,也需要开放所有安全组哦。

    $ sudo firewall-cmd --zone=public --add-port=2333/tcp --permanent
    

    生产环境

    使用 Screen

    screen -d -m fish-hook server
    

    fish-hook主目录运行该命令,即可使 fish-hook server 持久运行下去。

    webhook 事件们

    events

    更多帮助

    请查看 github 仓库fish-hook

    7 条回复    2017-02-21 21:31:13 +08:00
    dcalsky
        1
    dcalsky  
    OP
       2017-02-21 15:15:12 +08:00
    github 地址可能贴的不明显: https://github.com/dcalsky/fish-hook

    感恩 star
    kslr
        2
    kslr  
       2017-02-21 16:27:28 +08:00 via Android
    需要开外网端口是很严肃一件事。
    dcalsky
        3
    dcalsky  
    OP
       2017-02-21 16:28:59 +08:00
    @kslr 也可以使用 nginx 进行反代呀,这个看自己需要
    kslr
        4
    kslr  
       2017-02-21 16:35:27 +08:00 via Android
    @dcalsky 如果基于 webhook 看起来只能这么办了,如果是内部基于特定 tag 呢?
    est
        5
    est  
       2017-02-21 16:41:45 +08:00
    有那么麻烦么。。。


    @app.route('/.secret_update')
    def secret_update():
    import subprocess
    subprocess.Popen('git pull')
    # 再让进程自己重启一下就行了。
    wobuhuicode
        6
    wobuhuicode  
       2017-02-21 17:57:55 +08:00
    为了安全,麻烦点还是必须的……
    dcalsky
        7
    dcalsky  
    OP
       2017-02-21 21:31:13 +08:00
    @est 能少写一点是一点,程序员不都是这样的么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1711 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:44 · PVG 00:44 · LAX 09:44 · JFK 12:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.