文档章节

使用webhook实现代码自动化部署

阿dai学长
 阿dai学长
发布于 05/05 09:48
字数 921
阅读 130
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

需求背景

自己搭建的博客,代码托管到github,心想博客更新那么频繁,每次push代码后都到服务器上手动部署,实在是太麻烦, 于是想到自动化部署,开始的时候只是想通过一个简单的 shell +cron的方法来解决,但是这方法真的太笨了,一点都不 智能 。想到github的webhook,之前只是听说,明白其原理,并没有实操,这次刚好可以亲自体验一把了。具体如下:

webhook简介

webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的。

Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。

Webhook模式的主要优点是,当你的应用在等待变化时,无需周期性地调用APIs。

github webhook

工作原理

20190426155626442490073.png

  • vps启动一个nodejs进程(webhook),用来监听github仓库的状态;
  • 管理员本地修改代码,然后push到github代码仓库,master分支;
  • webhook监测到master分支的push操作;
  • 触发VPS上部署的脚本,代码到指定位置wwwroot。

构建webhook服务

下载脚本:webhook.js

说明:

  • 需要nodejs,部署node环境
  • 该脚本支持同时管理多个项目,只需要修改 var handler 配置即可;
  • handler:path名称和github中项目名称保持一致;
  • secret:和github中webhook密码保持一致;
  • listen:配置监听端口,之后再github中要用;

将webhook服务加入systemctl管理

# /usr/lib/systemd/system/webhook.service
[Unit]
Description=Github webhook
After=network.target

[Service]
Type=simple
User=nginx
Group=nginx
WorkingDirectory=/home/nginx/workspace/gitbook/scripts/
Environment=NODE_PORT=10080
ExecStart=/home/nginx/.nvm/versions/node/v10.15.3/bin/node /home/nginx/workspace/gitbook/scripts/webhook.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意事项: 声明WorkingDirectory。

代码发布脚本

#!/bin/bash

WEB_PATH='/home/nginx/workspace/gitbook/books/'$1
WEB_USER='nginx'
WEB_USERGROUP='nginx'
source /home/nginx/.bash_profile

t1=`date +'%Y-%m-%d %H:%M:%S'`
echo "$t1 Start deployment"  >> /home/nginx/workspace/gitbook/scripts/info.log
cd $WEB_PATH
pwd
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
sleep 2
echo "building..."
t2=`date +'%Y-%m-%d %H:%M:%S'`
gitbook build

if [ $? -eq 0 ];then
    echo "$t2 Finished."  >> /home/nginx/workspace/gitbook/scripts/info.log
else
    echo "$t2 Error!"  >> /home/nginx/workspace/gitbook/scripts/info.log
fi

注意事项: source /home/nginx/.bash_profile 其中加入/$HOME/.nvm/versions/node/v10.15.3/bin/,否则可能导致脚本运行时找不到gitbook命令,构建失败。

github配置webhook

  • 进入项目,Settings;

  • Webhook

  • Add webhook

  • Payload URL:ip或域名(解析到服务器)+上面脚本监听的端口+项目名称,如:http://domainname:7777/devops_docs

  • Content type:

    • application/json
    • application/x-www-from-urlencode
  • Secret:保持和webhook.js中一致

  • 选择要监测的github动态:默认只监听 push event 就好

  • Active!

测试

通过上面的配置,及完成了自动化部署的所有操作,此时可以通过向仓库中push代码来进行测试。

20190426155626436371687.png

开启Active后每次推送都会有详细日志,如果推送失败,根据日志调试即可。

© 著作权归作者所有

阿dai学长
粉丝 76
博文 263
码字总数 337363
作品 0
朝阳
运维
私信 提问
前后端项目在服务端持续集成部署【Docker自动化部署】

前言 自动化服务端持续集成部署的好处有哪些? 当我们修改一个需求完成后,将最新的代码push到github的时候,我们线上的版本会自动化完成拉取代码,打包构建,重启服务等流程。 通过这种技术...

cometang
11/29
0
0
使用 Jenkins 构建 Coding 项目 (资源)

Jenkins简介 Jenkins是一种跨平台的持续集成和交付的应用软件,它便于不断稳定地交付新的软件版本,并提高你的工作效率。这款开发运维工具还让开发人员更容易把项目的变化整合起来,并使用大...

寰宇01
2018/04/23
642
0
利用Jenkins + nginx 实现前端项目自动构建与持续集成

本文将以我之前的一篇基于vue-cli3.0构建移动端架子的前端代码自动化部署到目标服务器为🌰。 实现目标 本地push代码到GitHub,Webhook自动触发jenkins上的构建动作,完成安装node插件并且打...

web_zhou
05/17
0
0
Git WebHook:用于迅速搭建并使用 WebHook 进行自动化部署和运维系统( Python)

一个使用 Python Flask + SQLAchemy + Celery + Redis + React 开发的用于迅速搭建并使用 WebHook 进行自动化部署和运维系统,支持: Github / GitLab / GitOsc 。 技术栈简单,部署容易; ...

小薇
2016/10/26
208
0
WebHook 自动化部署和运维工具--git-webhook

Git WebHook 一个使用 Python Flask + SQLAchemy + Celery + Redis + React 开发的用于迅速搭建并使用 WebHook 进行自动化部署和运维系统,支持:Github / GitLab / GitOsc。 技术栈简单,部...

匿名
2016/10/23
13.2K
9

没有更多内容

加载失败,请刷新页面

加载更多

交换机switch 的shutdown 与 no shutdown

shutdown是关闭接口(端口),接口状态会变为DOWN,no shutdown是激活接口(端口),状态变为UP,一般在给vlan或者端口配置管理ip或者端口ip后使用。 有时候我们配置某个端口前会需要把端口关闭到...

刘日辉
37分钟前
5
0
AOP底层源码分析

思维导图 AOP AOP: 面向切面编程[底层就是动态代理] 指程序在运行期间动态的将某段代码切入到指定方法位置进行运行的编程方式。 AOP通知方式 前置通知: logStart(),在目标方法(div)运行之前运...

volc1612
50分钟前
5
0
OSChina 周六乱弹 —— 别听他们的,你不胖你只是毛茸茸的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @且无需多言 :分享Rise Against的单曲《Audience Of One (Ghost Note Symphonies)》: 硬核朋克不插电版本,隐藏在喧嚣下的柔情! 《Audienc...

小小编辑
今天
34
2
apache httpClient实现代理发送Post请求

CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope("host", port), new UsernamePasswordCredentials(username, password......

huangkejie
今天
6
0
SpringCloud

单体应用存在的问题 ● 随着业务的发展,开发变得越来越复杂。 ● 修改、新增某个功能,需要对整个系统进行测试,重新部署。 ● 一个模块出现问题,很可能导致整个系统崩溃。 ● 多个开发团队...

Star永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部