用 Git Hooks 进行自动部署

原文发表于 http://ourai.ws/posts/deployment-with-git-hooks/前端

昨天开始接手开发公司前端团队的主页,在稍微修改点东西后推送到远程仓库想看下线上结果时发现并无更改!询问一把手得知,竟然还须要链接到服务器执行一下 git pull 才行……对于我这种怕麻烦的人来讲,简直不能忍!git

通过一番查找资料以及一顿折腾,终于让它可以自动跑起来了,真是高兴得我手舞足蹈啊!虽然弄了较长时间,在实践的过程当中踩了点坑,但回过头来一看仍是挺简单的。总的来讲,就只是在服务器和本机都作一下配置。(这不废话么……)vim

因为公司的服务器是 CentOS,我所使用的电脑是 Mac OS X,故本文内容是基于这两个系统环境所写。GUI 在给用户带来不少便利的同时也隐藏了一些不便,如:须要下载应用软件及在操做界面交互。鉴于本文的中心是「自动化」,因此一切操做都采用命令行——segmentfault

远程链接服务器

在搭建环境的整个过程当中,有不少步骤是须要链接到服务器进行的,然而在每次访问的时候都须要输入用户名和密码,就像逢年过节回家聚会都会被亲戚朋友询问「何时结婚呀」「什么时候抱小孩啊」。这就是为何要把这步放到前面——在本身脑门上写上计划的结婚生子时间,免得他们总问!服务器

生成 SSH 密钥

密钥是免登陆链接服务器的通行证,有种刷脸通行的感受。若是本地已经存在而且不想另外生成的话,能够跳过此步。session

cd ~/.ssh 切换目录后用 ssh-keygen -t rsa -C "用于区分密钥的标识" 生成一对具备相同名字的密钥(默认为 id_rsaid_rsa.pub):用于本地的私钥和用于服务器的公钥(有 .pub 扩展名)。ssh

若是私钥名字不是默认的话,须要手动加入到被「认证」的私钥列表中,不然每次链接服务器都会提示输入服务器的密码。在遇到了一些坑(文后有说明)后,我以为设置 SSH config 最为靠谱!post

编辑 ~/.ssh/config 文件(若是不存在则 touch ~/.ssh/config 建立一下),添加如下内容:fetch

Host HOST_ALIAS                       # 用于 SSH 链接的别名,最好与 HostName 保持一致
  HostName SERVER_DOMAIN              # 服务器的域名或 IP 地址
  Port SERVER_PORT                    # 服务器的端口号,默认为 22,可选
  User SERVER_USER                    # 服务器的用户名
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/PRIVATE_KEY     # 本机上存放的私钥路径

服务器端认证

先用 pbcopy < ~/.ssh/PRIVATE_KEY.pub 将公钥复制到剪贴板;经过 ssh USER@SERVER 访问服务器,这时会提示输入密码(它也许只有这么一次「询问」的机会);成功登陆后 vim ~/.ssh/authorized_keys,在合适的位置 cmd + V 并保存退出(同时 exit 退出 SSH 链接)。网站

配置 Git 仓库

建立服务器端仓库

服务器上须要配置两个仓库,一个用于代码中转的远程仓库,一个用于用户访问的本地仓库。这里的「远程仓库」并不等同于托管代码的「中央仓库」,这两个仓库都是为了自动同步代码并部署网站而存在。

在存放远程仓库的目录中(假设是 /home/USER/repos)执行 git init --bare BRIDGE_REPO.git 会建立一个包含 Git 各类配置文件的「裸仓库」。

切换到存放用户所访问文件的目录(假设为 /home/USER/www,若是不存在则在 /home/USER 中执行 mkdir www):

git init
git remote add origin ~/repos/BRIDGE_REPO.git
git fetch
git checkout master

配置 Git Hook

将目录切换至 /home/USER/repos/BRIDGE_REPO.git/hooks,用 cp post-receive.sample post-receive 复制并重命名文件后用 vim post-receive 修改。其内容大体以下:

#!/bin/sh

unset GIT_DIR

NowPath=`pwd`
DeployPath="../../www"

cd $DeployPath
git pull origin master

cd $NowPath
exit 0

使用 chmod +x post-receive 改变一下权限后,服务器端的配置就基本完成了。

更新本机的仓库源

在原有的(托管代码的)仓库上加入刚才所配置的服务器上的远程仓库的地址为源,之后往那个源推送代码后就会自动部署了。

总结

在搭建环境时并无一路顺风,磕磕绊绊遇到很多问题,虽然不少不值得一提,但有的点仍是有记录并分享的价值的!

SSH 私钥「认证」

将生成的私钥进行「认证」有不止一种方式,然而,起初我用的是最挫最不靠谱的 ssh-add ~/.ssh/PRIVATE_KEY——只是在当前 session 有效,一重启就又会被「询问」了!

相关文章
相关标签/搜索