利用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\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。主要进行以下操作:

  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进行自动部署的更多相关文章

  1. 服务器(三):利用github的webhooks实现自动部署

    实现自动部署的关键就是利用github的webhooks,我们在github建立一个项目之后,在项目主页点击Settings,看到Webhooks点击打开可以添加一个链接,这里的意思是,github可 ...

  2. centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本

    1.宿主机中创建目录 mkdir -p /jenkins_home 2.编辑compose文件,文件名jenkins.yml version: '3.4' services: jenkins-upgr ...

  3. Webhook 实践 —— 自动部署

    https://segmentfault.com/a/1190000007892407 安装nodejs 安装nodejs建议直接下载二进制包,把官网上的64位二进制版本下载地址复制下来,执行 wge ...

  4. 利用 Github 网络钩子实现自动化部署

    GitHub 的网络钩子(webhook)功能,可以很方便的实现自动化部署.本文记录了使用 Node.js 的开发部署过程,当项目的 master 分支被推时,将在服务器进行自动部署 添加网路钩子 在 ...

  5. 使用码云,GitHub进行版本控制,并通过WebHook进行自动部署

    我们通常需要在 PUSH 代码到远程仓库时,线上环境会自动进行代码同步,这时候就需要用到WebHook,它会自动回调我们设定的http地址. 通过请求我们自已编写的脚本,来拉取代码,实现与远程仓库代码 ...

  6. 利用Python和webhook实现自动提交代码

    最近在为公司书写项目的api文档,计划利用码云的wiki管理整个项目,公司自有git作为项目内容依托,这样全员都可参与,而我定期向码云推送就可以了. 问题 根据需求遇见了这样一个问题:我每次从git上 ...

  7. 利用github webhook 结合openresty自动更新静态博客

    使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上. 对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就 ...

  8. 使用 Github Actions 自动部署 Angular 应用到 Github Pages

    前言 最近在学习 Angular,一些基础的语法也学习的差不多了,就在 github 上新建了一个代码仓库,准备用 ng-zorro 搭个后台应用的模板,方便自己以后写些小东西时可以直接使用.前端项目 ...

  9. gitlab之gitlab-runner自动部署(二)

    转载自:https://blog.csdn.net/hxpjava1/article/details/78514999 简介 gitlab-ci全称是gitlab continuous integra ...

随机推荐

  1. python3(十四) filter

    # 和map()类似,filter()也接收一个函数和一个序列. # 和map()不同的是,filter()把传入的函数依次作用于每个元素, # 然后根据返回值是True还是False决定保留还是丢弃 ...

  2. Maybatis的一些总结(三:增删改查)

    回顾一个点 之前不懂这句: UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 现在理解了一点点,相当于实现了userMap ...

  3. EOS基础全家桶(七)合约表操作

    简介 本篇我们开始来为后续合约开发做准备了,先来说说EOS内置的系统合约的功能吧,本篇将侧重于合约表数据的查询,这将有利于我们理解EOS的功能,并可以进行必要的数据查询. EOS基础全家桶(七)合约表 ...

  4. c++存储区

    全局变量与静态变量区.常量区.局部变量区(栈).动态存储区(堆).自由存储区 1.全局变量与静态变量区->存放全局变量.静态变量,程序运行结束后释放 2.常量区->存放常量 3.局部变量区 ...

  5. mysql 主键和默认 设为索引的规则

    一.mysql 表中如果是单主键的话,那这个主键也会被 系统默认建为 索引 二.mysql 表中如果是复合主键的话,那系统会遵循左对齐原则,即如复合主键 a 和 b字段和c字段..., 默认建的主键索 ...

  6. python圆周率计算小程序(非常慢)

    源码: from math import fabs #导入数学模块 from time import perf_counter #导入时间模块 from numba import jit @jit d ...

  7. 详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常

    (请关注 本人"Collection集合"博文--<详解 Collection集合>) Iterator接口(迭代器): 概述: 对 collection 进行迭代的迭 ...

  8. PHP代码审计理解(一)----Metinfo5.0变量覆盖

    0x01 漏洞简介 这个漏洞是metinfo5.0变量覆盖漏洞,并且需要结合文件包含.我使用的cms版本是5.3,事实上已经修复了这个漏洞(5.0的cms源码已经找不到了哈),但是我们可以借他来学习理 ...

  9. [linux] 小问题:管道符,换行问题等;[nginx]启动,重启,关闭命令;以及升级nginx切换命令

    Lniux换行问题 后面回车不会马上执行本条命令而是换行继续. : 是运行完前面就继续后面的, && 同样是前面正确就运行后面, || 是前面运行不正确就运行后面. | 管道符“|”将 ...

  10. 散列表和JAVA中的hash

    引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...