使用 Git Hooks 实现自动项目部署

最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式。

关于部署,奇迹上是自动部署,起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码,后来记得 Git 带有 Hooks,索性在 ProGit 一书翻了翻:

Git 本身可以调用自定义的挂钩脚本,其中有两组:客户端和服务器端。客户端挂钩用于客户端的操作,如提交和合并。服务器端挂钩用于 Git 服务器端的操作,如接收被推送的提交。详情请查看 ProGit 相关章节

如果这样就简单了,利用服务器端调用想要的挂钩(Hook),即可实现自动部署的方案,为了保证不被肆意部署,特加了一个对需要部署 commit 的判断,利用读取 commit subject 并匹配想要的字符串才去部署,这样我认为是一个比较安装的部署方案。

Git的挂钩(Hook)主要包含:

  • applypatch-msg
  • post-update
  • pre-rebase
  • commit-msg
  • pre-applypatch
  • update
  • post-commit
  • pre-commit
  • post-receive
  • prepare-commit-msg

这里我们只需要使用 post-receive 这个 Hook:在接收 post(push) 请求之后执行。其他大部分我也没有大多研究,不过看名字不算难理解,我觉得其中大部分包含 commit 的属于客户端。

好了,部署开始:

1. 在服务器 git 仓库(注意是 bare 仓库,不是代码仓库)的 Hooks,编辑 post-receive(如果没有自行创建),贴入下面代码(Feed 用户请看这里):

这里会先判断脚本所在目录是否是 bare git 仓库,然后获取最新 commit 的 subject,并匹配是否包含 [deploy] 字样,如果包含,则继续检查产品代码仓库路径是否存在,如果存在则执行 git pull 操作。

2. 对刚才编辑的 post-receive 执行下面命令以保证脚本可执行:

$ chmod +x post-receive

3. 完成!

-------------------------------------

对于自定义脚本,其实不仅限于 bash shell,你可以使用你熟悉的语言,然后把你的脚本路径在 hooks 脚本中加载即可。

脚本还会继续更新,下面需要增加关于测试部分的相关判断和部署。 bash shell 还需要进一步学习,上面脚本是我第一次写,如有不妥之处,请指教,感谢!

Posted in How-To | Tagged , , | Leave a comment

如何保持在 Git Submodule 代码的开放和私有共存

假设我在 github 有一个开源的版本库 x 供大家使用,该库里面又包含了好些个 submodules,其中有一个 submodule 名为 a 是自己在 github 又创建的:

$ git submodule add  http://github.com/icyleaf/a.git modules/a

现在问题是,由于代码需要更新,同时涉及到了 a 这个 submodule,但是它的添加 url 是 read-only,由于 x 这个库是供大家使用,因此 a 又不能设为 private:

$ git clone git@github.com:icyleaf/a.git modules/a

目前想到的方法是在 x 库以外 clone 下来 a,进行私有的写入和 push 到 github 上面,然后在 x 库的 a 里 git pull 下来获得最新的代码。

如何解决这样的问题,能够当大家全部 clone 下来,而自己开发也能避免麻烦?

在一篇文章上面找到了灵感,折腾了一番搞定了

该文章有一节讲到,开发者如果经常需要更新 submodule ,即可更换 submodule 的 remote url:

$ cd commonlib
$ git remote rm origin
$ git remote add origin ssh://mark@git.mysociety.org/data/git/public/commonlib.git
$ git remote -v
origin    ssh://mark@git.mysociety.org/data/git/public/commonlib.git
 
 
However, you’ll find that two helpful config options will have been deleted when removing and adding back origin, so you’ll want to add these back.
 
 
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

首先我也先对 a 进行 git remote -v,结果显示:

origin	http://github.com/icyleaf/a.git (fetch)
origin	http://github.com/icyleaf/a.git (push)

发现和文章里面的显示的结果不一样,于是我就在想能不能在 remote 上面做些手脚,首先看下 git remote 的 help,发现有一条是可以单独设置 remote push 的 url ,也就是更换上面 git remote -v 中 push 的 url,尝试:

$ git remote set-url --push origin git@github.com:icyleaf/a.git

再次执行 remote -v:

origin	http://github.com/icyleaf/a.git (fetch)
origin	git@github.com:icyleaf/a.git (push)

执行成功!然后随意 commit 并 push orgin master,成功!

搞定!

Posted in 网络开发 | Tagged | Leave a comment

Nginx+FastCGI 环境搭建 Kohana

Kohana 默认仅对 Apache 环境提供的部署支持,其实对于 Nginx+FastCGI 也是很容易支持的。本文搭建环境是 Ubuntu 10.4 并采用 apt-get 方式安装,喜爱编译的朋友可以自行解决 :)

1. 安装 MySQL

sudo apt-get install mysql-server mysql-client

安装过程在会提示设置 root 账户的密码,如果是本机测试开发可以留空后稍候设置。

2. 安装 Nginx

# 安装 Nginx
sudo apt-get install nginx
# 启动 Nginx
sudo /etc/init.d/nginx start

完成上面两步之后,打开浏览器,输入 localhost 或 127.0.0.1 如果看到 Welcome to Nginx! 字样就说明安装成功了,是不是很简单 :)

注意,如果你的机器上面如果安装了其他 web 容器(比如 Apache,Lighttd等),启动 ngnix 的时候肯定会报错,因为这些 web 容器启动均占用的 80 端口,更改的方法如下:
编辑 /etc/nginx/sites-available/default 文件,修改 server 段中的 listen 为 localhost:8080,其中 8080 是更改的监听端口:

server {
	listen   localhost:8080;
	server_name  localhost;
 
# [...]

保存后重启Nginx:

sudo /etc/init.d/nginx restart

Continue reading

Posted in Kohana | Tagged , , | Leave a comment

如何获取 Element 的 XPath [PHP/Javascript]

这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径,由于使用的是 PHP Simple HTML DOM Parser 开源库,这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢,依稀记得 Firebug 有一个功能,选择某个元素在它的控制台可以显示 XPath。嗯,着手实践一下发现不仅可以显示而且还可以复制 XPath,如下图所示:

于是想,如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的,结果在 Google 的新家搜索找到了...

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var elt = document.getElementById('table');
var xpath = getElementXPath(elt);
alert(xpath);
 
// Get full XPath of an element
function getElementXPath(elt)
{
	var path = "";
	for (; elt && elt.nodeType == 1; elt = elt.parentNode)
	{
		idx = getElementIdx(elt);
		xname = elt.tagName;
		if (idx > 1) xname += "[" + idx + "]";
		path = "/" + xname + path;
	}
 
	return path;	
}
 
// Get Idx of an element
function getElementIdx(elt)
{
    var count = 1;
    for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling)
    {
        if(sib.nodeType == 1 && sib.tagName == elt.tagName)	count++
    }
 
    return count;
}

PHP 改进版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Use it before import PHP Simple HTML DOM Parser
$html = file_get_html('http://www.google.com/');
// find a sample element by id
$elt1 = $html->find('#footer', 0);
// find a sample element by tag name
$elt2= $html->find('div', 10);
 
// it will return if found it: //*[@id="footer"] 
$xpath = getElementXPath($elt1);
 
// it will return if found it: html/body/div[10] 
$xpath = getElementXPath($elt2);
 
function getElementXPath($elt)
{
	$path = '';
	$first = TRUE;
	for(; ($elt AND $elt->nodetype == 1); $elt = $elt->parent())
	{
		$xname = $elt->tag;
		$idx = getElementIdx($elt);
 
		if ($first AND isset($elt->attr['id']))
		{
			$path = '//*[@id="' . $elt->attr['id'] . '"]';
			break;
		}
 
		if ($idx > 1)
		{
			$xname .= '[' . $idx . ']';
		}
 
		$path = '/'.$xname.$path;
 
		$first = FALSE;
	}
 
	return $path;
}
 
function getElementIdx($elt)
{
    $count = 1;
    for($sib = $elt->prev_sibling(); $sib ; $sib = $sib->prev_sibling())
    {
        if($sib->nodetype == 1 && $sib->tag == $elt->tag)
        {
        	$count++;
        }
    }
 
    return $count;
}

大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。

Posted in How-To, 网络开发 | Tagged , , | Leave a comment

StarCraftII

昨天在 GReader 看到了 CNBorn 同学分享的一篇文章:Shellex的星际2试玩报告 。文章有提到安装和破解 StarCraftII Beta 版本,同时我也知道了“玻璃渣”就是  Blizzard 暴雪公司的英文名。说来惭愧,我真正开始玩星际是在 2009 年初,大多都是和朋友几个在闲暇之余玩上一玩,星际其实并不是很熟悉,人族可能是我比较熟悉的种族,Lost Template 是我最熟悉的地图(高中时代经常玩魔兽争霸)。

StarCraftII 破解安装

上面提到的文章中之说明了 StarCraftII Beta 版本是从玻璃渣下载,当初没明白这个是什么东西,就随便找了一个国内的资源站下载的,客户端一个 1.6G+ 大小,花了一下午的时间下载完毕,晚上回家在自己的笔记本上面安装后准备要破解才发现,破解程序只在 0.3.0.14093 版本测试成功(如果不是那个版本运行破解程序会报错),而其他版本没有测试。我又花了一点时间用手机查找了下如何看 StarCraftII 的版本号:

在 StarCraftII 安装目录有一个 Versions 文件夹,里面会有很多Base13891,Base14093,Base14133这样的文件夹。这就是版本号,数字最大的是Base14133,也就是你的当前版本了!

当时我一看就傻眼了,从国内下载的版本是 Base13891 也就是 0.3.0.13891。这可怎么办啊,突然灵机一现,我把 Versions 文件夹下的 Base13891 文件夹名改成了 Base14093,然后运行破解程序,成功破解,选择地图开始玩咯!(建议从官网下载原版客户端或正确的版本,我的方法可以解决燃眉之急,并不知道会不会有什么功能缺失)

由于破解文件包含了人族的补丁,借上面的文章说是人族的能力从猴变成了猿...说回游戏,选择地图后(可以和AI对战,AI 的数量跟文件有关系,大家可以看破解的说明文件),玩家的种族是随机分配的(今天早上看昨天的推说已经有了种族选择的补丁,大家可以关注下)。几回对战并选择不同的难度(需要手动覆盖某个文件)的战斗发现,人族在打了补丁之后确实蛮厉害的,机枪兵+升级后的坦克(火力+扎架)配合护士MM运输机,直取深入比较无敌 XDD。幸亏之前看过辰音奈奈讲解了三期战报。对于兽族和神族也是可以快速上手(图标变化太大,有些适应不过来)。

嗯,以上是昨天小玩的一天心得,感谢大家的欣赏

------------------得意的分割线--------------------------

没想到我的笔记本还是可以玩得起来 StarCraftII,虽然我在看 Options 的时候发现 图像 的各个参数不是 None 就是 Low,但是画面还是可以的(或许我对画面不挑剔= =)

最后献上我的机器配置:HP 6520s(054)

CPU: Intel(R) Core(TM)2 Duo CPU T5870 @ 2.00GHz
显卡: ATI X1350 mobile
内存: 2x1G
硬盘: 160G
系统: Windows 7 Pro

更新补充:添加了试玩操作系统平台,为什么我一定要写明是 Win7 系统呢,由于此系统的内存管理机制进行了重写,直接影响了系统的性能和效率,我曾经偶然间测试过,同一个游戏 COD4,在 Win7 和 WinXP 下的性能是差别很大的,在读取每关任务和介绍的时候,WinXP 总是没加载完毕就已经介绍完毕了而 Win7则是在介绍没结束之前很早就已经加载完毕。

Posted in 影音娱乐 | Tagged , | 4 Comments