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

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

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

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

远程连接服务器

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

生成 SSH 密钥

密钥是免登录连接服务器的通行证,有种刷脸通行的感觉。如果本地已经存在并且不想另外生成的话,可以跳过此步。

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

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

编辑 ~/.ssh/config 文件(如果不存在则 touch ~/.ssh/config 创建一下),添加以下内容:

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 有效,一重启就又会被「询问」了!

用 Git Hooks 进行自动部署的更多相关文章

  1. 搭建Git服务器环境----Git hooks代码自动部署

    引言:自己想搭一套git的服务端环境,不想用github码云等.经多方资料整合,实验总结,以下是亲测有效的方式.可用于公司日常开发 一.搭建Git环境 ① 安装 Git Linux 做为服务器端系统, ...

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

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

  3. 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  4. git利用hooks实现自动部署

    准备工作: 1.一台虚拟linux环境和window 开始工作 1.安装git(略) 2.创建git用户和创建test.git裸仓库 [root@localhost ~]# useradd -m gi ...

  5. git管理和自动部署项目

    当一个项目需要纳入到版本控制的时候,选择的工具还是比较多的,最常见的就是工具有CVS,SVN,GIT等.在平时的开发中视情况而定,从来就没有最好的版本控制工具,只有最适合的工具.在这里我习惯用git来 ...

  6. 使用Git Hooks实现开发部署任务自动化

    前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...

  7. jenkins maven git windows code 自动部署

    本人刚刚接触  写的不好就对付看看吧 哈哈哈O(∩_∩)O哈哈~ 最近看见别人弄得自动部署 自己也是手痒痒 也想弄一个 所以就弄了一个 windows的 我用的是https的  在网上看了很多都是 s ...

  8. git push后自动部署

    前提,服务器已经装好ssh,本地也已经将ssh 公钥传到服务器对应位置 先用 pbcopy < ~/.ssh/PRIVATE_KEY.pub 将公钥复制到剪贴板:通过 ssh USER@SERV ...

  9. Git hook实现自动部署

    Git Hook 是 Git 提供的一个钩子,能被特定的事件触发后调用.其实,更通俗的讲,当你设置了 Git Hook 后,只要你的远程仓库收到一次 push 之后,Git Hook 就能帮你执行一次 ...

随机推荐

  1. mysql左连接,右连接,内连接

  2. (13) go map

    1.定义 map 无序, key唯一 (1) (2) (3)定义+赋值 2. map的值时map, 记得要make 3.增删改查 (1)增 改 (2)删除 (3)查 4.遍历 值map 嵌套for, ...

  3. T-sql 行转列,数据库查询分页

    1 USE [APS_Future_FT] 2 GO 3 /****** Object: StoredProcedure [dbo].[A_CrudePrice] Script Date: 2013/ ...

  4. 51nod1376 最长上升子序列的数量

    机房的人问我树状数组怎么做这题...... 树状数组维护$len, num$表示$LIS$的长度和数量即可 复杂度$O(n \log n)$ 注:$O(n \log n)$二分+单调栈才是真神仙 具体 ...

  5. [BZOJ3583]杰杰的女性朋友(矩阵快速幂)

    杰杰的女性朋友 时间限制:10s      空间限制:256MB 题目描述 杰杰是魔法界的一名传奇人物.他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力.自从他从事魔法竞赛以来,短短几 ...

  6. HDU 5646 DZY Loves Partition 数学 二分

    DZY Loves Partition 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5646 Description DZY loves parti ...

  7. EM(Expectation Maximization)算法

    EM(Expectation Maximization)算法  参考资料: [1]. 从最大似然到EM算法浅解 [2]. 简单的EM算法例子 [3]. EM算法)The EM Algorithm(详尽 ...

  8. jquery-ajax请求:超时设置,增加 loading 提升体验

    前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白.如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的 ...

  9. (转)Ext.Button点击事件的三种写法

    转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...

  10. HDFS API基本操作

    对HDFS API基本操作都是通过 org.apache.hadoop.fs.FileSystem类进行的,以下是一些常见的操作: package HdfsAPI; import java.io.Bu ...