webhook 部署革命: 使用 fish-hook 自动部署多个应用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
dcalsky

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

  •  
  •   dcalsky 2017 年 2 月 21 日 2515 次点击
    这是一个创建于 3350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 年 2 月 21 日
    github 地址可能贴的不明显: https://github.com/dcalsky/fish-hook

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


    @app.route('/.secret_update')
    def secret_update():
    import subprocess
    subprocess.Popen('git pull')
    # 再让进程自己重启一下就行了。
    wobuhuicode
        6
    wobuhuicode  
       2017 年 2 月 21 日
    为了安全,麻烦点还是必须的……
    dcalsky
        7
    dcalsky  
    OP
       2017 年 2 月 21 日
    @est 能少写一点是一点,程序员不都是这样的么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2838 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86