原文发表于 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. BNUOJ 52505 Euclidean Geometry

    结论. 算了好久不会算,最后看了样例猜出了结论.次长边全用上,再用最长边减去次长边. #include<bits/stdc++.h> using namespace std; int T; ...

  2. python计数器Count

    python计数器Count # -*- coding:utf-8 -*- """ python计数器Counter 需导入模块collections "&qu ...

  3. BZOJ2599 IOI2011Race

    题目:一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 点分治,我们考虑经过根节点的路径,t[x]表示路径长为x时最少的边数,然后每次拿栈记下来清空. 注意先搜索再更新,这样可以避免同一 ...

  4. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  5. 【欧拉函数】BZOJ4173-数学

    [题目大意] [思路] 基本是popoqqq大爷的题解,稍微添加了几句自己的注释,方便理解 同理,如果n%k+m%k<k等价于0 =∑([(n+m)/k]-[n/k]-[m/k])×φ(k) … ...

  6. bzoj 2002 LinkCutTree

    我的第一道LCT题(居然1A,O(∩_∩)O哈哈~) 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 大概题意: 给一颗有根树,维护每个 ...

  7. bzoj1715 虫洞

    Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...

  8. codeforces VK Cup 2015 - Qualification Round 1 B. Photo to Remember 水题

    B. Photo to Remember Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/522/ ...

  9. Django Pagination

    Django provides a few classes that help you manage paginated data – that is, data that’s split acros ...

  10. 使用ScrapySharp快速从网页中采集数据

    ScrapySharp是一个帮助我们快速实现网页数据采集的库,它主要提供了如下两个功能 从Url获取Html数据 提供CSS选择器的方式解析Html节点 安装: ScrapySharp可以直接从Nug ...