V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
quietjosen
V2EX  ›  程序员

[自个开开源] 响应 GitHub Webhooks 实现自动部署的 Web 服务

  •  
  •   quietjosen ·
    atjason · 2019-03-22 19:45:59 +08:00 · 4741 次点击
    这是一个创建于 2074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天研究并实现一个响应 GitHub Webhooks 实现自动部署的 Web 服务。

    简单收拾了下代码和文档(写文档比写代码累…),开源至此

    前提条件

    这并不是一个 Hello Word 教学示例,而是我自己在用的实际项目。假设你已经知道下列技术或满足其条件:

    • 有一台自己的服务器
    • 会配置域名
    • 会配置 nginx 或者其他 Web 服务器,实现 Web 服务至 node 服务的转发
    • 了解 node、koa
    • 了解 Webhooks
    • 了解 SMTP
    • 会编辑 shell 脚本

    主要功能

    • node lib/index.js 运行后,在 3030 端口提供可响应 GitHub Webhook 的服务
    • 内部通过 exec 来调用实际工作的 shell 脚本(需要自己编写)
    • 发邮件告知运行结果

    更多的,看 README 吧。

    第 1 条附言  ·  2019-03-23 09:27:11 +08:00

    确实有重复造轮子的问题,也有维护的成本。如果有可能,还是建议大家用成熟的技术、第三方服务。

    一些选择及建议:

    • 比如,Travis CI,只是这家伙对 GitHub 私有项目收费价格太感人了。
    • GitHub 本身在测试 Actions 功能,应该覆盖包括 CI/CD 在内的需求。
    • GitLab 有全套的 CI/CD,几乎免费,可以尝试。

    其实,如果跳出来,直接上 Serverless,很多 CI/CD 的部分,压根就不存在了。

    第 2 条附言  ·  2019-03-23 09:54:25 +08:00
    来来来,说说你自动部署用的什么方案,手动也算😄
    28 条回复    2019-03-25 17:38:20 +08:00
    strugglexiang
        1
    strugglexiang  
       2019-03-22 21:30:45 +08:00 via Android
    heybuddy
        2
    heybuddy  
       2019-03-22 21:44:54 +08:00 via Android
    支持一下
    ericgui
        3
    ericgui  
       2019-03-23 00:18:54 +08:00
    "command": "/bin/bash ./deploy.sh",


    这个 config 里的 deploy.sh 怎么没找到?
    also24
        4
    also24  
       2019-03-23 01:13:38 +08:00
    @ericgui #3


    那里是留给你写部署用的脚本的
    ericgui
        5
    ericgui  
       2019-03-23 01:14:44 +08:00
    @also24 谢谢
    mritd
        6
    mritd  
       2019-03-23 01:32:49 +08:00
    你这个有点太硬核了吧...为啥不用 travis ci ?
    zzjas98
        7
    zzjas98  
       2019-03-23 02:03:32 +08:00   ❤️ 1
    支持,但是感觉重复造轮子了。之前写作业用过这个东西 https://github.com/adnanh/webhook,感觉和 lz 写的差不多
    xlui
        8
    xlui  
       2019-03-23 08:26:14 +08:00 via iPhone
    感觉像是超级简化版无图形界面版的 Jenkins
    AngryPanda
        9
    AngryPanda  
       2019-03-23 08:42:15 +08:00 via Android
    webhooks 还是不够稳定
    quietjosen
        10
    quietjosen  
    OP
       2019-03-23 09:28:16 +08:00
    @mritd
    免费的不支持私有项目,收费 $69 每月起步:

    quietjosen
        11
    quietjosen  
    OP
       2019-03-23 09:30:37 +08:00
    @zzjas98 哈哈,原来还可以做成付费服务啊:
    quietjosen
        12
    quietjosen  
    OP
       2019-03-23 09:31:20 +08:00
    @xlui 如果可能,还是建议用成熟的第三方服务。我这个东西,就折腾了好几个小时。不过也看吧,至少折腾过程中学到了东西。
    life1st
        13
    life1st  
       2019-03-23 09:44:47 +08:00 via Android
    Nowsh 基本没见人提过
    Cbdy
        14
    Cbdy  
       2019-03-23 09:59:02 +08:00 via Android
    quietjosen
        15
    quietjosen  
    OP
       2019-03-23 10:07:19 +08:00 via iPhone
    @Cbdy 嗯,本质上,就是提交后运行一个命令或脚本。真说的话,你这个不支持密码检验和配置仓库及分支。
    quietjosen
        16
    quietjosen  
    OP
       2019-03-23 10:10:22 +08:00 via iPhone
    @life1st 看着不错,瞧瞧去
    ifwangs
        17
    ifwangs  
       2019-03-23 10:24:52 +08:00 via Android
    caddy 好像就有 github 自动部署插件
    quietjosen
        18
    quietjosen  
    OP
       2019-03-23 10:34:47 +08:00
    @ifwangs 替换已有 Web 容器,侵入性太强,不适用已经成型的产品。
    azh7138m
        19
    azh7138m  
       2019-03-23 11:47:01 +08:00 via Android
    @life1st 我一直在用,其实免费额度只能自己开发用,1k 请求 /月的额度太低啦
    thet
        20
    thet  
       2019-03-23 11:54:34 +08:00 via Android
    用的 jenkins
    quietjosen
        21
    quietjosen  
    OP
       2019-03-23 12:15:47 +08:00 via iPhone
    @azh7138m
    @life1st 简单试了下,貌似 Now 必须拥有全部 GitHub 仓库权限才能干活?
    azh7138m
        22
    azh7138m  
       2019-03-23 12:18:51 +08:00 via Android
    @quietjosen 我记得是 read only 来着,那私有仓库要怎么自动部署?

    github app 不是必须的,那个是集成 CI,可以本地使用 now cli。
    v2dead
        23
    v2dead  
       2019-03-23 14:37:11 +08:00
    这个 github 的 webhook 接口我之前接了一下,openresty 的 lua 做的,前后 20 多行搞定,这还是因为 lua 库比较麻烦,验签不方便。
    这种东西都不需要上什么第三方吧?整的有点像之前 npm 那个 left-pad 一样。
    倒不是反对楼主开源这种项目,项目放出来倒是很好的,我只是觉得去用这类项目的咸鱼大概已经退化到忘记怎么写代码了。
    quietjosen
        24
    quietjosen  
    OP
       2019-03-23 14:45:52 +08:00
    @v2dead 术业有专攻,比如并不能要求 Vue 专家也是部署和运维专家。而且,如果需求深入的话,比如密码验证、邮件提醒、CI/CD,全部自己做,既不是 20 行代码能搞定,也不应该将本应用于开发的时间,分配到这方面。
    v2dead
        25
    v2dead  
       2019-03-23 14:51:41 +08:00
    确实没什么问题,所以本身项目还是很好的,尤其文档还很详细。
    但是对于一个普通后端人员来说,随手处理一个验签,执行一个外部脚本,再发送一封通知邮件的接口应该比去找一个这种项目并学习怎么配置部署花的时间少的多了。。。。
    ddiu8081
        26
    ddiu8081  
       2019-03-23 15:17:53 +08:00 via Android
    支持🌝
    以前也打算写个来着...然后后来换了 caddy server 就用不着了..
    Les1ie
        27
    Les1ie  
       2019-03-23 15:43:37 +08:00
    那我也分享一下现在正在用比较简易的 caddy 自动部署解决方案,可能没有 ci 之类的功能丰富,不过小项目,怎么快怎么来..(感觉非常方便,想给 caddy 10 个 star )
    1. 安装带 git 插件的 caddy: `curl getcaddy.com -sL |bash -s personal http.git`
    2. 配置 caddyfile,放到项目的父目录(如果有多个项目,只需要开这一个 caddy 即可)
    ```
    $ cat Caddyfile
    http://0.0.0.0:9009 {
    tls off
    log stdout

    # web 页面
    git {
    repo [email protected]:example/example.git
    path example
    hook /example
    key /root/.ssh/id_rsa
    hook_type generic
    branch master
    then docker exec container_name npm run build # 重新 build 源码
    then ./do-something-else.sh
    }
    git {
    repo [email protected]:example/example2.git
    path example2
    hook /example2
    key /root/.ssh/id_rsa
    hook_type generic
    branch master
    then docker exec container_name2 other command
    }
    }
    ```
    3. 到项目的父目录去运行去`caddy`
    4. github/gitlab 指定 webhook 地址 `example.com:9009/example``example.com:9009/example2`, 多个仓库以此类推
    5. 招开发,更多人选择 DevOps,一份工资,几个人的工作量
    haozes
        28
    haozes  
       2019-03-25 17:38:20 +08:00
    楼主写的,的确和 webhook handler 那个库差不多。 我就是用这个搭的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5634 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:13 · PVG 17:13 · LAX 01:13 · JFK 04:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.