利用GitHook构建持续交付和部署

转载 2015年11月17日 17:08:49

1、为什么要打造可持续交付和部署

软件发布是一个令人头痛的过程,非常耗时且风险很高。对于小团队来说一般分为两种:“签入时交付”和“定时交付”。

“签入时交付”策略的优势在于马上产生的满足感。根据代码库的规模,从签入新功能代码到能够在交付准备服务器上测试,一两分钟就够了。

这种方式的主要问题在于:交付准备服务器会被蹂躏得不稳定。很多时候,我见到有人试图测试某个功能,突然新的版本推到交付准备服务器上了,破坏了正在运行的测试。更糟糕的是:交付准备服务器常常作为演示服务器使用,在某些重要的演示时,很可能出现严重的后果。

定期交付策略更易于预测。所有人都知道交付何时启动,并可以规划自己的代码签入是在交付之前还是之后进行。典型做法是一天构建/交付一次或两次。

由于架构的特殊性,服务器将会越来越多。试想一下你要在几十台服务器上更新代码是一件多么繁琐的事情。对于我们公司来说面临着严重的如何更快交付和部署代码的问题。

我们需要将经历过测试的代码能够迅速部署到服务器上,本来考虑过jekins,但jekins对我们来说又太过繁琐。

2、交付与部署过程

目前我们使用的是阿里云服务,阿里云服务有个很方便的地方就是镜像,一次制作整个集群都可以使用。

工程师将代码上传到开发环境的库中,通过GitHook自动让测试用的服务器更新代码,测试完成后只要将相关的代码稍稍修改为生产环境的配置并上传到生产环境的Git库,通过GitHook所有与这个库有关的服务器都会自动更新代码。

测试的具体过程就不在此论述了。

3、GitHook

我们来看下官方解释:

钩子(hooks)是一些在"$GIT-DIR/hooks"目录的脚本, 在被特定的事件(certain points)触发后被调用。当"git init"命令被调用后, 一些非常有用的示例钩子文件(hooks)被拷到新仓库的hooks目录中; 但是在默认情况下这些钩子(hooks)是不生效的。 把这些钩子文件(hooks)的".sample"文件名后缀去掉就可以使它们生效了。

简单地来说有点类似回调,就是特定事情完成后回调执行事件。

4、如何搭建

我们公司使用的是coding、服务器上是已经装好jetty的ubuntu,不过github、gitlab跟这个的配置方法类似。

****Git-SSH****

首先现在coding上建立一个代码库,然后在生产环境上的代码部署的地方git clone刚刚新建的代码库。

没有git的要安装git,ubuntu下是apt-get install git

为了让git能够自动更新代码库而不需要输入账号密码,这时候就需要用到git-ssh了。

如果是第一次使用要先设置git的名字和邮箱(自己随便取个名字和邮箱就行):

git config --global user.name "test"

git config --global user.email "test@zomake.com"

然后通过上一个命令输入的邮箱来生成密钥

ssh-keygen -t rsa -C "test@zomake.com"

如果不需要设置密钥的密码的话,直接三个回车。然后你就在命令行上看到生成了两个文件:id_rsa和id_rsa.pub。

(如果不是第一次的话执行命令会提示overwrite,输入y就行。)

然后我们把密钥交给ssh-agent来管理,可以通过eval "$(ssh-agent -s)" 看看是不是正常运行,是的话会输出它的pid。

ssh-add ~/.ssh/id_rsa

用上面这个命令将刚刚生成的私钥交给ssh-agent。路径填你在终端上看到的。

登录coding,点击账户-SSH公钥-添加。将之前生成的id_rsa.pub里的内容复制进去。

最后进到之前clone下来的代码库中修改.git文件夹下config中的url,改为远端仓库的SSH访问地址,如git@git.coding.net:t-baby/test.git

这样一来在服务器上git就无需输入账号密码了。

****准备update.sh****

cd /

vi git_update.sh

然后将下面的东西复制进去并保存:

#!/bin/bash

cd /opt/jetty/webapps

git remote update -p

git checkout -f origin/master

git submodule update --init

service jetty restart

第二行和最后一行根据需要自行更换,因为我们的代码是Java的,放在jetty中运行。将第二行的cd改成你自己的代码所在目录。而最后一行代码是用来重启jetty服务器的,你可以去掉或加上自己服务器的重启代码。

保存后给这个脚本文件777的权限。

****准备githook.php****

由于一些原因,为了方便我们使用了php作为GitHook回调的地址。

先装好PHP环境并修改端口为8080,apache默认文件夹为/var/www(80已经被jetty占了,具体安装方法见我另一篇文章

在/var/www/中新建一个叫githook.php,然后放入以下代码:

<?php
// 用于认证
$valid_token = 'test';
$client_token = $_GET['token'];
$fs = fopen('./git_hook.log', 'a');
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
// 认真token
if ($client_token !== $valid_token)
{
  echo "error 10001";
  fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
  exit(0);
}


$json = file_get_contents('php://input');
$data = json_decode($json, true);
fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
fwrite($fs,         '======================================================================='.PHP_EOL);
$fs and fclose($fs);

exec('sudo sh /git_update.sh');

这段代码就是先获取访问这个网页所附带的token是否与php文件里写的一致,如果一致则执行git_update.sh并记录日志到git_hook.log文件中。

****填入回调地址****

紧接着我们在coding中打开部署用的代码库,左侧点击设置-WebHook。填入自己服务器的地址并附带和php文件中token一致的参数,比如我们刚刚的是

http://111.111.111.111:8080/githook.php?token=test

(ps:直接填写IP可以减少域名解析所耗费的时间)

****给apache权限****

聪明的朋友们测试的时候肯定发现了问题,exec里面的代码并不执行怎么办?其实很简单是因为apache的权限不够,只要给予权限就行。

我们可以先通过lsof -i:80看看apache的执行用户是谁。

9.pic.jpg

比如我这里是www-data用户,然后执行visudo

10.pic.jpg

然后找到图片上的位置修改成图片上那样,后面那行www-data是要自己添加的。接着保存。保存的话就是ctrl+x然后回车。

这样就可以让apache不需要密码就可以用管理员权限执行了。

赶紧测试下看看是不是成功了!

如何部署代码以及结论

现在只要你一更新仓库的代码,就会自动回调到githook.php从而让服务器自动更新代码。即使多几台服务器也是一样的,最简单的方法就是利用公有云服务的镜像功能做成镜像装在集群中的其它机器,然后在coding的WebHook那里加上这些服务器的IP就行。

这应该是全网最完善的相关教程了吧。自己靠着百度到很多不完整的资料琢磨了一天然后写下此教程。找教程。。。最后别太相信百度到的,血的教训~。

相关文章推荐

Nginx搭建反向代理服务器过程详解

一、反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服...

passwd 文件格式和含义

 通常在Linux系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。 示例  下面是一个passwd...

GitHook+JGit实现最新代码的自动克隆或者项目的自动部署

需求 思路 开工 设置webhook 响应webhook的服务器 http接口 clone和checkout操作 遍历本地仓库 IO流读取内容 运行结果需求 分析师写的sql需要映射到另外一个后台...

GitHook实现Django自动化部署

前言项目中Django自动化部署的要求是:master分支,push了新的commit,需要自动拉去最新的代码,重启uwsgi,直接部署新版本上线。通过日志文件远程监控部署状态。原来一直寄托与gith...

有容云:实战总结之 利用Docker、Docker Compose &Rancher构建持续部署

前言: 本文由John Patterson 、 Chris Lunsford写于2016年4月4日,译者有容云张向波,转载请注明出处。(原文链接见文末)   作者John Patte...

如何让GIS公有云持续部署、高效交付?来看SuperMap Online的DevOps实践!

备选: 从持续集成到持续交付,SuperMap Online的DevOps实践 基于DevOps的持续交付,SuperMap Online运维管理实践 高效交付不是梦,SuperMap Onli...

CI Weekly #5 | 微服务架构下的持续部署与交付

CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Ti...
  • FIRim
  • FIRim
  • 2016年12月06日 11:10
  • 445

如何将GitHub上的项目用jenkins进行持续的集成构建部署

最近公司新来的架构师把公司的项目用jenkins持续构建部署,第一次接触这种自动构建工具的我内心十分的动,再也不用我来把项目打包部署了,简直嗨的不行!于是到网上收集了一些资料,自己琢磨了一阵子,现在把...

jenkins + maven + svn + tomcat 搭建自动构建,自动部署,持续集成环境

***学习视频:http://www.maiziedu.com/course/369/ 一。使用jenkins进行持续集成的一般流程: 1.第一步:上传项目。 我使用的是Intellij idea ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用GitHook构建持续交付和部署
举报原因:
原因补充:

(最多只允许输入30个字)