https://segmentfault.com/a/1190000007892407

安装nodejs

安装nodejs建议直接下载二进制包,把官网上的64位二进制版本下载地址复制下来,执行

wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz

xz格式的文件按照以下命令解压:

  1. xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar

  2. tar xvf xxx.tar来解包

解压之后把目录拷贝到/usr/local/node目录下

cp ~/node_v**** /usr/local/node

为了方便全局启动需要在/usr/local/bin下创建文件软连接

ln -s /usr/local/node/bin/npm /usr/local/bin

ln -s /usr/local/node/bin/node /usr/local/bin

执行完毕之后就可以全局使用npmnode命令了。

由于网络问题,国内可以使用阿里NPM镜像cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

然后通常/usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变/usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件.如果两个目录下有相同的可执行程序,谁优先执行受到PATH环境变量的影响.

编写webhook代码

部署脚本

这里我们要实现远程http调用之后可以启动shell脚本,所以我们先编写部署脚本,由于这个项目我的开发环境和测试环境的配置文件不一样,所以将git目录和部署目录分开了。这样就需要两个目录之间的单向同步,这里我采用的方案是rsync,虽然diff也能实现文件夹比对,但是同步过程复杂,需要手动分析目录变动。

这个项目的框架是laravelxxx_git是源码目录,xxx是部署目录,具体情况可以调整。

这里我们对于目录采用rsync单向同步,对单文件采用cp直接覆盖方式。

#!/bin/bash
cd /home/wwwroot/xxx_git
git pull origin master
cp /home/wwwroot/xxx_git/composer.json /home/wwwroot/xxx/composer.json
cp /home/wwwroot/xxx_git/composer.lock /home/wwwroot/xxx/composer.lock
cp /home/wwwroot/xxx_git/_ide_helper.php /home/wwwroot/xxx/_ide_helper.php
rsync --delete -avzp /home/wwwroot/xxx_git/app /home/wwwroot/xxx/
rsync --delete -avzp /home/wwwroot/xxx_git/public /home/wwwroot/xxx/
rsync --delete -avzp /home/wwwroot/xxx_git/resources/lang /home/wwwroot/xxx/resources
rsync --delete -avzp /home/wwwroot/xxx_git/resources/views /home/wwwroot/xxx/resources

脚本编写完毕之后执行下面的命令赋予执行能力

chmod +x ./my_sync.sh.sh

rsync参数:
-a:表示归档模式,用递归方式传输文件
-v:详细输出
-z:传输时对文件进行压缩处理
-r:对子目录进行递归
-t:保持文件的时间信息
-p:保持文件的权限
-o:保持文件的属主信息
-g:保持文件的属组信息
--delete:表示以服务端为基准进行同步,保持服务端的目录文件和客户端的完全一致
--progress:用于显示数据同步的过程
--exclude:排除不需要同步的目录或者文件

webhook接口编写

这里我采用了gitos上面的webhoos,其他的gitlab、github大同小异。
OSChina的webhook可见这里

这里我采用了express + child_process解决调用问题,这个过程就比较简单了,这里面需要注意的是检测提交push操作的是不是master分之,其他分之的提交使不处理的。

这里execreq.send()是没有回调关系的,所以服务器webhook时候不会超时。另外这里还实现了脚本运行的日志记录,可以针对每次部署来查看具体文件变更情况。

var express = require('express');
var app = express();
var cp = require('child_process');
var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();
var moment = require('moment'); app.post('/git' , jsonParser ,function(req , res){
var json = req.body;
if(json.password == 'xxxx'){
if (json.ref == 'refs/heads/master'){
var logName = (moment().format('YYYY-MM-DD_HH:m:s'))+'.log';
var command = '/home/nodejs/git_puber/my_sync.sh >> /home/nodejs/git_puber/' + logName;
cp.exec(command, function(err, out, code) {
if (err instanceof Error) {
// res.writeHead(500)
// res.end('Server Internal Error.')
// throw err
console.log(err + new Date());
}else{
console.log(out + new Date());
}
});
}else{
console.log('not master branch');
}
}else{
console.log('no auth pass');
}
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.send({result:('ok' + new Date()) , msg: 'your message has been delievered'});
// res.send();
}); app.listen(3000 , function(){
console.log('Server Is Running' + new Date());
});

参考延伸
《exec与spawn方法的区别与陷阱》

运行监控程序

nodejs是异步单线程,在一些情况下会出现异常退出的情况,为了保证服务常可用,我们需要一个pm2来保证程序的运行。

npm install pm2 -g

这里如果安装速度慢的话可以使用cnpm安装。

执行pm2 start node app.js即可以后台维护运行node程序。

pm2一些命令
pm2 list
pm2 stop all/[name]
pm2 start all/[name]

自动部署

git checkout dev

切换到dev分支后修改文件

git commit

切换到主分支然后将dev分之合并过来

git checkout dev && git merge dev

提交之后服务器自动部署

git push

Webhook 实践 —— 自动部署的更多相关文章

  1. 利用github的webhook进行自动部署

    利用github的webhook进行自动部署 github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url. 这个功能有什么用了?比如 ...

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

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

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

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

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

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

  5. gitlab之gitlab-ci自动部署

    简介 gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成.中心思想是当每一次push到gitlab的时候,都会触发一次脚本执行,然后脚本的内容包括 ...

  6. [后端]gitlab之gitlab-ci自动部署

    转发:https://www.jianshu.com/p/df433633816b 简介 gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成.中心 ...

  7. 利用WebHook实现PHP自动部署Git代码

    平时项目代码都托管在Coding,然后每次提交了代码之后都要SSH到服务器上去git pull一次,很是繁琐,在看了OverTrue的<使用PHP脚本远程部署git项目>后就尝试在自己服务 ...

  8. Jenkins+Gitlab配置Webhook实现提交自动部署

    一.概述 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 已经实现了 Jenkins+harbor+gitlab+ ...

  9. 使用gitlab的webhook进行前端自动部署

    gitlab有个功能叫webhook,比较适合前端代码的自动部署.其中的逻辑在  http://172.30.83.152:30080/help/user/project/integrations/w ...

随机推荐

  1. JAXB在Java 9/10并且使用Tomcat 9的问题

    Implementation of JAXB-API has not been found on module path or classpath. JAXB API是java EE 的API,jav ...

  2. P1156 垃圾陷阱 DP

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D≤100)英尺. 卡门 ...

  3. 20165235 祁瑛 Java第四周考试总结

    20165235 祁瑛 Java第四周考试总结 课后习题p29 p45 代码编写 import java.util.*; class Example2_5{ public static void ma ...

  4. 关于cin的缓存区影响效果

    1. 当缓冲区中有残留数据时,cin函数会直接去读取这些残留数据而不会请求键盘输入.而且,回车符也会被存入输入缓冲区中. int num{}; while(cin>>num) cout&l ...

  5. 深度学习中的batch_size,iterations,epochs等概念的理解

    在自己完成的几个有关深度学习的Demo中,几乎都出现了batch_size,iterations,epochs这些字眼,刚开始我也没在意,觉得Demo能运行就OK了,但随着学习的深入,我就觉得不弄懂这 ...

  6. 从零搭建 ES 搜索服务(二)基础搜索

    一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...

  7. Spring boot中自定义Json参数解析器

    转载请注明出处... 一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0. ...

  8. eslint那些事儿

    eslint是一个插件化的javascript和jsx代码检测工具,eslint使用Node.js编写.全局安装的eslint只能使用全局安装的插件,本地安装的eslint不仅可以使用本地安装的插件还 ...

  9. BZOJ.2679.Balanced Cow Subsets(meet in the middle)

    BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \ ...

  10. 数学——Euler方法求解微分方程详解(python3)

    算法的数学描述图解 实例 用Euler算法求解初值问题 \[ \frac{dy}{dx}=y+\frac{2x}{y^2}\] 初始条件\(y(0)=1\),自变量的取值范围\(x \in [0, 2 ...