NodeJS Webhooks 实现代码自动部署

3,249 阅读4分钟
原文链接: chenghuiyong.com

​在我的Github中有两个关于Gitlab代码自动部署的项目,一个是PHP版本的Gitlab Webhooks,另外一个是NodeJS版本的Gitlab Webhooks。之前我在社区分享过PHP版本的Gitlab Webhooks,可能大部分浏览过的同学会照着这篇教程亲自尝试安装部署。在这篇文章里,我会推荐使用NodeJS版本的Gitlab Webhooks并解释为什么会建议去使用它。

​PHP版本Gitlab Webhooks 主要检查当前提交Git版本分支并执行不同Linux Shell脚本,实现项目代码的自动部署,了解PHP知识的同学很容易理解它的思想和逻辑,为什么我不推荐使用它呢?

第一、克隆https://github.com/bravist/gitlab-webhook-php后,需要多次修改项目配置信息和依赖运行主机目录

#查看 gitlab.php
$access_token = 'MmNmMGRmMGI2Y2EyYjY3NzFjMzRjODkzZTQ3NjY5M2Y=';
##这里需要设置访问令牌,避免非法服务器访问Webhooks地址
$access_ip = array('{server}');
##允许访问IP地址,必须修改此地址,否则无法访问
exec("/mnt/www/{project}/public/gitlab-webhook-php/master_deploy.sh");
##这里的project需要设置为服务器当前运行项目的路径地址
#查看 develop_deploy.sh
cd /mnt/www/{project}
##同样的,在Shell脚本中,也需要配置项目的路径地址

亲身实践的同学应该清楚,配置信息依赖很其他项目运行环境,非常不灵活。

第二,运行PHP Webhooks需要Linux服务器提供Web与PHP服务,当服务器采用Docker运行环境构建时,PHP Webhooks就无法继续使用

最近几年,Docker大行其道,在DevOps领域已经是风生水起。我们自己编排了一套Docker运行资源,感兴趣的同学可以在5分钟内完成一个完整的PHP Web环境。推荐个人用户去DigitalOcean 购买一台VPS安装CentOS7并尝试使用Docker。这里简要地描述一下编排资源:

docker-ps

# docker ps
NAMES
lnmpdocker_nginx_1 ## Nginx: Web 服务容器
lnmpdocker_php-fpm_1 ## PHP-FPM: PHP脚本语言解释器,用于处理Web中的PHP脚本请求
lnmpdocker_mariadb_1 ## MariaDB: Mysql另一个版本,数据库管理系统容器
lnmpdocker_www_1 ## www: 虚拟主机目录,也即是CentOS宿主机上项目源码目录
lnmpdocker_redis_1 ## Redis: Redis缓存服务容器

这里的每个容器都是一个独立的虚拟服务器,用于提供不同的服务。我们在CentOS 7宿主机(相对于Docker容器)上并未安装PHP脚本解释器,此时就无法运行PHP版本的Gitlab Webhooks。

为提高Gitlab源码自动部署的灵活性和可用性,推荐使用NodeJS版本的Gitlab Webhooks。下面详细说明在CentOS 7中利用NodeJS版本的Gitlab Webhooks完成源码自动部署。

1. 安装Node环境

推荐使用Node版本管理工具nvm

## 使用curl工具下载安装
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
## 在当前窗口使用nvm
$ source ~/.bash_profile
## 查看远程仓库Node版本
$ nvm ls-remote
## 选择Node版本执行安装
$ nvm install v7.8.0
## 查看已安装Node环境
$ node -v

最新版本Node已经自动安装了包管理工具npm,国内用户推荐使用淘宝的镜像工具cnpm

## 使用cnpm替换npm
$ npm install -g cnpm --registry=https://registry.npm.taobao.org

2. 安装NodeJS Gitlabhook扩展包

进入NodeJS包管理在线仓库npmjs,搜索gitlabhook,可以查看相关配置信息。

## 全局安装gitlabhook
$ npm install --global gitlabhook
##查看gitlabhook安装路径
$ npm

配置gitlabhook.conf

##进入 ~/.nvm/versions/node/v7.8.0/lib/node_modules
$ cd ~/.nvm/versions/node/v7.8.0/lib/node_modules/gitlabhook
##复制gitlabhook.conf至/etc/gitlabhook.conf
$ cp gitlabhook.conf /etc/gitlabhook.conf
## 编辑/etc/gitlabhook.conf
$ vi /etc/gitlabhook.conf
{
  "tasks": {
    "*": [
      "echo 'GitLab Server: %s' > /tmp/gitlabhook.tmp",
      "echo 'Repository: %r' >> /tmp/gitlabhook.tmp",
      "echo 'Repository branch: %b' >> /tmp/gitlabhook.tmp",
      "echo 'Repository remote url: %g' >> /tmp/gitlabhook.tmp",
      "echo $(date) >> /tmp/gitlabhook.tmp",
      "cd /mnt/www/%r >> /tmp/gitlabhook.tmp",
      "sudo -u www git checkout develop >> /tmp/gitlabhook.tmp",
      "sudo -u www git pull origin develop >> /tmp/gitlabhook.tmp"
    ]
  },
  "keep":false
}

这里特别提醒:

  • CentOS 宿主机上需要安装git版本管理工具yum install -y git
  • CentOS 宿主机上默认还是需要通过git命令去远程克隆仓库,CentOS宿主机需要配置SSH-Key并在gitlab中进行配置,否则会报错:“无权限克隆仓库”
  • 需要使用CentOS 宿主机上的虚拟主机目录的拥有者去使用git命令,比如配置文件中使用www用户去克隆仓库
  • 注意在你的CentOS 宿主机上确认克隆仓库的版本,如果是测试环境建议使用develop分支,如果是生产环境建议使用master分支

3. 安装NodeJS 进程管理工具PM2

使用NodeJS 的进程管理工具PM2方便监控并管理NodeJS进程。

## 全局安装PM2
$ npm install --global pm2
## 查看正在运行的进程
$ pm2 list
## 监控当前运行的进程
$ pm2 monit

4. 运行NodeJS Gitlabhook

## 执行gitlab-server.js
$ pm2 start ~/.nvm/versions/node/v7.8.0/lib/node_modules/gitlabhook/gitlabhook-server.js
## 查看gitlab-server端口是否开启
$ netstat -tunlp | grep 3420
## 在本地确认远程3420端口是否可访问
$ telnet 138.68.24.82 3420
Trying 138.68.24.82...
Connected to 138.68.24.82.
Escape character is '^]'.
##如果看到上面的信息,表示Gitlab Server已经开始运行,如果没有,可以查看CentOS防火墙是否允许3420端口访问

5. 在Gitlab仓库中配置Webhooks

登录你的Gitlab项目管理后台,搜索Webhooks并添加Push events(不同版本的Gitlab配置Webhooks可能不一样)。

webhooks-1

webhooks

6. 提交版本并测试

在你的本地开发仓库中,执行git push,进入CentOS服务器检查代码是否自动同步。

使用NodeJS版本的Gitlab Webhooks解除了与Web服务器强依赖关系,同时服务器运行环境源码保持干净灵活,非常适合Docker的运行环境。另外,此项目不仅仅可以运行在Gitlab版本仓库中,同样也可以运行在Github、Coding等运行环境中。