利用github的webhook进行自动部署

摘要:
利用github的webhook进行自动部署github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url。比如个人博客写文章的时候,提交了github应该马上把服务器的版本也更新一下,这时候webhook就可以很方便的处理这件事情了。后面又发现一个开源的好东西https://github.com/rvagg/github-webhook-handler,这个可以帮我们来解析github推给我们的数据,并且可以自动分包处理,比如push啊issues啊等等。按照rvagg/github-webhook-handler提供的示例我简单的改了下;如果是创建多个handler作者在issues中也给出了说明。
利用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方式

  1. 先查看是否存在sshkey
cd ~/.ssh
ls

如果存在,你可以直接用,或者在创建一个都可以。如果创建一个新的,那么在~/.gitconfig文件中,多配置一句就可以了。

  1. 创建sshkey
ssh-keygen -t rsa -C "your_email@example.com"

回车后会要求输入密码,根据安全需要输入,也可以不输入。如果输入了密码,在使用此秘钥的时候会要求验证密码。

代码参数含义:

  • -t 指定密钥类型,默认是 rsa ,可以省略。
  • -C 设置注释文字,比如邮箱。
  • -f 指定密钥文件存储文件名。可省略,运行上面的命令会提示你输入一个文件名,不输入则默认为id

最后会生成id_rsaid_rsa.pub两个文件,一个是私钥,一个是公钥,公钥用于配置到github中。

如果指定了文件名,那么需要在~/.ssh路径下创建一个config文件,并输入一下内容

Host github.com www.github.com
  IdentityFile ~/.ssh/othername
  1. 设置公钥信息的内容
    id_rsa.pub中的内容,全部复制,然后进行入到github中进行设置,在settingsSSH and GPG keys中进行配置ssh key即可

  2. 验证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 odego等都是很合适的。

这里我是采用的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。主要进行以下操作:

  1. 设定shell及工作目录
  2. 开始拉取代码
  3. 编译及生成,在进行打包的时候需要注意使用npm install --unsafe-perm,不然会报node-sass权限问题
  4. 压缩备份现有项目,养成备份好习惯
  5. 复制打包路径到项目发布路径

完整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'

免责声明:文章转载自《利用github的webhook进行自动部署》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设置NPM 源DevExpress控件之GridControl控件(代码篇)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转载--redis密码管理

源地址:http://blog.csdn.net/lxpbs8851/article/details/8136126 ps -ef 查看正在活动的进程 ps -ef |grep abc 查看含有"abc"的活动进程 ps -ef |grep -v abc 查看不含abc的活动进程 一.如何初始化redis的密码? 总共2个步骤: a.在配置文件中有个参数:...

android WIFI的一些属性

package com.example.wifitest; import java.util.List; import android.content.Context; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android....

jedis 和 redisson 有哪些区别?

  Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更...

【问题记录】IIS配置项

起因: 由于之前项目中出现过内存占用较高情况,为了保障业务不因程序问题导致停止;需要实现对进程资源占用限制。 需要利用IIS相关功能实现,所以对IIS相关配置多一些了解。 主要对以下高级设置重点项了解:包含: 网站高级配置: 进程池高级设置: 一、IIS重点配置项目: 连接数 连接数概念:[1] 浏览者访问站点,必需与站点通过TCP协议,建立连接。这个...

NodeJS使用npm和cnpm高速下载

Npm配置 //设置registry npm config set registry https://registry.npm.taobao.org //查看registry npm config get registry //查看配置列表 npm config list //查看所有的默认配置 npm config ls -l //查看安装的module...

百度UEditor上传图片-再再总结一次

本周,CSDN有个网友遇到了百度UEditor上传问题,最后商定付50元钱,我帮他解决这个问题。    他最初想自己搞定这个问题,结果搞了好多次,好几天,还是没能解决。    2015年1月17日8:25~2015年1月18日00:24,4个小时终于搞定了这个问题。 1.总的感悟    本来预计1个小时,就能解决的,结果硬是花费了4个小时,挺无奈的。 虽说...