[FEATURE] 增加 webhook 功能
1Panel 版本
v1.0.3
请描述您的需求或者改进建议
类似 portainer 对 docker 容器增加 webhook 功能,能结合到 devops 中
请描述你建议的实现方案
No response
附加信息
No response
感谢反馈,后续版本我们会考虑增加容器 webhook 功能。
所以说,增加了webhook了嘛?
我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。
location /.githook.sh {
content_by_lua_block {
local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
local result = handle:read("*a")
handle:close()
ngx.say(result)
}
}
然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。
牛逼,感谢了
考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新
考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新
这个通过 webhook 来做的话是怎么个流程呀?webhook 被调用后触发什么操作呢?
考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新
这个通过 webhook 来做的话是怎么个流程呀?webhook 被调用后触发什么操作呢?
比如gitlab提交后会通过webhook访问面板某个对外的端口,提供accesskey后服务器执行git pull命令,命令内容固化在本地,安全性高,可以参考宝塔webhook,这样只有在代码更新后才会触发这个操作,是否触发可以在git服务器中配置
如果没有webhook,更新依然可以使用ssh模拟登录服务器完成,这也是我目前更新的方式,但是这样始终不太好
再者没有webhook又要安全性依然可以通过本地脚本轮询的方式完成,但是这样就会有一个脚本一直再pull又或者访问更新接口,这样总之是没有webhook来的干净的
又因为1panel目录结构设计,这就导致如果要更新代码需要进入很深的层级,抛开方便性,如果不写脚本,就需要进入很深的路径,如果写脚本手动执行更新,也不是不行,但是,网站多了管理起来就不是很方便,而我的应用场景又是一个服务器上有众多项目众多网站的,这就会提高人治的下限
对了这一点对PHP网站来说会显得很重要,因为我在做go和java项目的时候都是编译好二进制传服务器的所以反而不会有需要webhook的地方~~,所以我一度认为1panel的官方可能不太能理解到phper的这个诉求,所以搁置了这么久~~
那么如果有webhook的情况下,甚至是golang二进制项目的部署也可以设定成在发布release后触发hook,再让hook下载这个文件替代本地的,这样安全性也一定程度上提高了
这个场景看起来用上面评论里的方案还挺合适的,当然 1Panel 能直接提供类似功能的话肯定更好。
https://github.com/1Panel-dev/1Panel/issues/410#issuecomment-2256258671
我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。
location /.githook.sh { content_by_lua_block { local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh") local result = handle:read("*a") handle:close() ngx.say(result) } }然后在 .githook.sh中 放入
git pull命令,请求example.com/.githook.sh就会更新最新的代码了。
这个场景看起来用上面评论里的方案还挺合适的,当然 1Panel 能直接提供类似功能的话肯定更好。
我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。
location /.githook.sh { content_by_lua_block { local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh") local result = handle:read("*a") handle:close() ngx.say(result) } }然后在 .githook.sh中 放入
git pull命令,请求example.com/.githook.sh就会更新最新的代码了。
这我看见了,是一个临时的解决方案,但是真的网站数量多起来有些狼狈
我现在的临时解决方案是写了一个类似aapanel的webhook功能,用supervisor跑起来挂后台,代码很简单,就是在当前执行的文件夹中找到access_key在exec文件夹下对应的.sh文件,如果有就执行,如果没有就返回错误。能用,也解决了我随时添加sh随时删除sh的期待,而且不会影响到nginx,但这样我觉的还是不如坐在1panel里面来的优雅,但是也解决了,多网站多目录单独配置的问题以及集中鉴权的问题
主要还是降低了脑子迷糊的时候犯大错的可能
package app
import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
"main.go/tuuz/Input"
"main.go/tuuz/RET"
"net/url"
"os"
"os/exec"
"strings"
)
func WebhookController(c *gin.Context) {
//http://127.0.0.1:888/hook?access_key=123¶m=aaa
access_key, ok := Input.Get("access_key", c, false)
if !ok {
return
}
re, err := ExecFile(access_key)
if err != nil {
RET.Fail(c, 500, re, err.Error())
} else {
RET.Success(c, 0, re, re)
}
}
func ExecFile(filename string) (string, error) {
filename = url.QueryEscape(filename)
filename = strings.ReplaceAll(filename, ".", "")
filename = strings.ReplaceAll(filename, "%", "")
filename = strings.ReplaceAll(filename, "&", "")
fmt.Println("./exec/" + filename + ".sh")
if _, err := os.Stat("./exec/" + filename + ".sh"); os.IsNotExist(err) {
return "未找到文件", errors.New("未找到文件")
}
// 文件存在,执行.sh脚本
out, err := exec.Command("/bin/bash", "./exec/"+filename+".sh").Output()
if err != nil {
return "", err
}
// 返回执行结果
return string(out), nil
}
主要作者这块是怎么考虑的,会不会觉得合进面板不合适,还是单纯没有人提PR所以一直没加
希望增加 webhook,方便自动 git pull
https://github.com/1Panel-dev/1Panel/issues/410#issuecomment-2301196351
和这个有些类似,感觉还不错 https://github.com/ncarlier/webhookd/
请问这个问题有进展吗?
有下文了吗?需要部署的还是很频繁的,希望尽快能加上
我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。
location /.githook.sh { content_by_lua_block { local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh") local result = handle:read("*a") handle:close() ngx.say(result) } }然后在 .githook.sh中 放入
git pull命令,请求example.com/.githook.sh就会更新最新的代码了。
这个只能更新openresty底下的网站,无法跳出docker的虚拟路径,是否有其他方法
我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。
location /.githook.sh { content_by_lua_block { local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh") local result = handle:read("*a") handle:close() ngx.say(result) } }然后在 .githook.sh中 放入
git pull命令,请求example.com/.githook.sh就会更新最新的代码了。
要是有人对着这网址狂按F5......