利用github的webhook进行自动部署
利用github的webhook进行自动部署
github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url。
这个功能有什么用了?比如个人博客写文章的时候,提交了github应该马上把服务器的版本也更新一下,这时候webhook就可以很方便的处理这件事情了。
这篇文章主要讲解整套流程如何设置
设置github拉取权限#
设置github
的访问权限有两种方式,一种是直接将github
的账号密码配置配置到服务器的全局配置文件中,一种是通过sshkey
的方式
配置账号密码#
在服务器的根目录
touch .git-credentials
vi .git-credentials
# 输入
http(s)://{你的用户名}:{你的密码}@你的服务器地址
终端输入
git config --global credential.helper store
查看~/.gitconfig
会多出一行
vi .gitconfig
[credential]
helper = store
如果是邮箱账号的话,@
要转义为%40
,这里不转义也没关系,在你git
第一次拉取的时候,会在输入一次,这次输入的就会被写入到~/.git-credentials
sshkey方式#
- 先查看是否存在sshkey
cd ~/.ssh
ls
如果存在,你可以直接用,或者在创建一个都可以。如果创建一个新的,那么在~/.gitconfig
文件中,多配置一句就可以了。
- 创建
sshkey
ssh-keygen -t rsa -C "your_email@example.com"
回车后会要求输入密码,根据安全需要输入,也可以不输入。如果输入了密码,在使用此秘钥的时候会要求验证密码。
代码参数含义:
-t
指定密钥类型,默认是rsa
,可以省略。-C
设置注释文字,比如邮箱。-f
指定密钥文件存储文件名。可省略,运行上面的命令会提示你输入一个文件名,不输入则默认为id
最后会生成id_rsa
和id_rsa.pub
两个文件,一个是私钥,一个是公钥,公钥用于配置到github
中。
如果指定了文件名,那么需要在~/.ssh路径下创建一个config文件,并输入一下内容
Host github.com www.github.com
IdentityFile ~/.ssh/othername
-
设置公钥信息的内容
将id_rsa.pub
中的内容,全部复制,然后进行入到github
中进行设置,在settings
、SSH and GPG keys
中进行配置ssh key
即可 -
验证sshkey
ssh -T git@github.com
会有一段警告,输入yes即可,如果在生成rsa的秘钥时,输入了密码,此时会被要求验证密码.
最后你会看到下面的这段话,即表示成功。如果是access denied
则表示拒绝访问。
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
现在可以取拉取一下代码,试试,就不用验证账号密码了。
但是如果有可能还是会出现验证账号密码的可能。此时你要确定你用的地址是不是ssh的地址,如果是https的那是没法走sshkey的了。对于已经用git clone https的方式拉取到本地的项目,在进行pull的时候,还是会被提示,这时候需要修改项目下面的git配置即可。
修改.git/config
url = https://github.com/Name/project.git
一行改为
url = git@github.com:Name/project.git
即可。
建议设置一下git
的账号和邮箱
git config --global user.name "name"
git config --global user.email "email@mail.com"
编写webhook服务#
在尝试使用开源项目adnanh/webhook
运行webhook
服务失败后,觉得尝试自己编写,用java
这种太鲁莽了点,一个监听服务而已,没必要上java
这种东西,像python\node\go
等都是很合适的。
这里我是采用的node来编写,比较简单方便,刚开始考虑用express
来做服务监听,也基本测试成功,但解析github发过来的请求时,发现解析Payload
这个挺麻烦。后面又发现一个开源的好东西https://github.com/rvagg/github-webhook-handler,这个可以帮我们来解析github推给我们的数据,并且可以自动分包处理,比如push啊issues啊等等。
按照rvagg/github-webhook-handler
提供的示例我简单的改了下;如果是创建多个handler作者在issues中也给出了说明。我在这个示例上进行了简单的封装。
var handlerOption = [
{
path: '/hooks/publish_tennetcn',
secret: 'yoursecret',
shell: 'sh /home/publish/tennetcn/publish.sh'
}
]
const currOption = handlerOption.filter(item => item.path === url) || []
if(currOption.length <= 0){
console.log('current url is not matchs')
}else{
exec(currOption[0].shell, function(err,stdout,stderr){
if(!err) {
console.log(stdout);
}
})
}
这样在你使用的时候,你只用关注handlerOption即可,非常方便。项目已经开源,开源地址https://github.com/chfree/think-webhook觉得可以加个小星星
使用项目非常简单
git pull
npm install
sh run.sh &
如有需要修改run.sh
中的log
路径和index.js
中的端口和handleOption
编写脚本#
编写脚本,比较简单,就是简单的shell。主要进行以下操作:
- 设定shell及工作目录
- 开始拉取代码
- 编译及生成,在进行打包的时候需要注意使用
npm install --unsafe-perm
,不然会报node-sass
权限问题 - 压缩备份现有项目,养成备份好习惯
- 复制打包路径到项目发布路径
完整shell如下:
#!/bin/bash
PRJ_WORK_DIR=/home/proj_source/think-vp-tennetcn
cd $PRJ_WORK_DIR
echo 'start think-vp-tennetcn update and publish'
echo 'git pull ......'
git pull
echo 'npm install ......'
#npm install --production --unsafe-perm=true --allow-root
npm install --unsafe-perm
echo 'npm run docs:build'
npm run docs:build
echo 'dist success'
echo 'copy starter'
BAK_DIR=/home/project/tennetcn/clientbak
PUB_DIR=/home/project/tennetcn/client
DATE=$(date +%Y-%m-%d-%H-%M-%S)
echo 'bak start '
zip -r $BAK_DIR/backup-tennetcn-$DATE.zip $PUB_DIR/*
rm -rf $PUB_DIR/*
echo 'bak end delete end'
cp -r $PRJ_WORK_DIR/docs/.vuepress/dist/* $PUB_DIR
echo 'cp end'
echo 'publish success'
作者: RegicideGod
出处:https://www.cnblogs.com/RegicideGod/p/12834794.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?