git hooks自动部署

一、 准备

1. 笔者的git库和web服务器在同一台机器上。

# cd /data/wwwroot/html               //html目录

# git clone /home/git/html .         //首次需克隆远程库

# chown -R www.www .            
//修改WEB权限为程序运行者

2. 由于hooks下的脚本一般是由git执行,所以git需要拥有相关目录的写入权限。

# usermod -a -G git www
    //将git用户加入到www组

# find /data/wwwroot/html
-type d -exec chmod 775 {} \;    
    //修改WEB根目录及以下目录权限为775

二、 hooks脚本

# cat /home/git/html/hooks/post-receive

#!/bin/sh
unset GIT_DIR
LOG_PATH=/tmp/gitupdate.log
DeployPath=/data/wwwroot/html
cd $DeployPath
git add . -A && git stash
echo "------------Start Pull -----------" >> $LOG_PATH
echo "Time:"`date ‘+%Y-%m-%d %T‘` >> $LOG_PATH
git pull origin master &>> $LOG_PATH
git stash pop
exit 0

三、 验证

1. 客户端以git身份验证上传或修改文件,首次上传文件以后发现并没有同步,通过以上打印的日志找到问题。

# cat /tmp/gitupdate.log

------------Start Pull -----------

Time:2017-01-13 16:49:44

error: cannot open .git/FETCH_HEAD: Permission denied

因为git账户更新文件会在.git目录下记录和创建一些文件,而我们git clone的时候使用的是root账户,修改权限:

# chown -R git.git /data/wwwroot/html/.git

2. 定时更新权限脚本

由于:

- 网站根目录下会产生新的属主为git的目录和文件,导致www不具备写入权限

- .git隐藏目录下可能会生成新的文件,导致git更新失败

- 手动干预git后部分文件权限发生变化

这些情况都可能导致自动更新出现问题,为了解决这些权限导致的失败隐患,特将更新权限写为计划任务,并根据情况决定多久执行一次,笔者定为1小时执行一次。

# crontab -l | grep chperm

0 */1 * * * /data/shell/chperm.sh

# cat /data/shell/chperm.sh

#!/bin/bash
chown -R www.www /data/wwwroot/html
find /data/wwwroot/html -type d -exec chmod 775 {} \;
chown -R git.git /data/wwwroot/html/.git/

3. 改完后验证正常。

# cat /tmp/gitupdate.log

------------Start Pull -----------

Time:2017-01-13 16:53:11

From /home/git/html

* branch            master     -> FETCH_HEAD

Updating 0591be6..1cdb27b

Fast-forward

tests/sunleitest1.txt |    1 +

1 files changed, 1 insertions(+), 0 deletions(-)

create mode 100644 tests/sunleitest.txt

create mode 100644 tests/sunleitest1.txt

?

时间: 2024-10-08 12:04:32

git hooks自动部署的相关文章

做了一个简易的git 代码自动部署脚本

项目是THINKPHP写的 用了 oschina git 进行版本管理. 公网服务器是CentOS.每次用FTP上传很麻烦. 所以想到了在服务器上安装一个GIT进行 pull代码.因为我的远程服务器数据库和本地不一样,所以代码pull后还需要修改 几个config.php数据库配置文件. 所以想再git 代码更新后,要自动执行config.php文件的替换或者修改. 其中看到这里讨论http://www.v2ex.com/t/81173  git hook 然后看了下比较麻烦.也看不懂. 所以就

git hook 自动部署

1. 当前虚拟站点根目录的 .git/ 权限 2. 当前项目裸仓库创建 hooks/post-receive 文件,并给予x 的权限 3. 复制如下内容 #!/bin/sh unset $(git rev-parse --local-env-vars) REPO="[email protected]:edc2.git" #BRANCH=`echo $refname | sed -n 's/^refs\/heads\///p'` #BRANCH_DIR="/root"

git管理和自动部署项目

当一个项目需要纳入到版本控制的时候,选择的工具还是比较多的,最常见的就是工具有CVS,SVN,GIT等.在平时的开发中视情况而定,从来就没有最好的版本控制工具,只有最适合的工具.在这里我习惯用git来管理自己的项目,当然之前使用svn管理的,但是当用了git工具就不愿意再用其它的工具来管理.这里除了习惯之外,git的很多功能是svn不具备的,最简单的就是离线提交,用git管理的项目你会发现整个项目的大小变化不大,不像svn那样每个目录又有一个.svn 的目录,而且会使项目的变得很大.关于git与

Webhook实践 —— PHP自动部署

Webhook实践 -- PHP自动部署 1.部署Gogs 参考博客:使用 Gogs 搭建自己的 Git 服务器 2.添加git的ssh公钥 因为是用git用户部署的Gogs,接下来在服务器上配置用git账号配置ssh公钥 首先在主机上生成秘钥: [[email protected] ~]$ ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa Generating public/private dsa key pair. Created directory

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

最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式. 关于部署,实际上是自动部署,起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码,后来记得 Git 带有 Hooks,索性在ProGit 一书翻了翻: Git 本身可以调用自定义的挂钩脚本,其中有两组:客户端和服务器端.客户端挂钩用于客户端的操作,如提交和合并.服务

使用 Git Hook 实现网站的自动部署

自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自己生产环境的代码的,FTP 覆盖旧文件.服务器定时任务去 build 最新的源码,还是有更高级的做法? 目前我在使用 Git Hook 来部署自己的项目.Git Hook 是 Git 提供的一个钩子,能被特定的事件触发后调用.其实,更通俗的讲,当你设置了 Git Hook 后,只要你的远程仓库收到一次 push 之后,Git Hook 就能帮你执行一次 bash 脚本. 下面是

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

使用Git Hooks实现开发部署任务自动化 提供:ZStack社区 前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构以及源码变更交换的速度被很多开发者青睐. 在git的众多优点中,最有用的一点莫过于它的灵活性.通过"hooks"(钩子)系统,开发者和管理员们可以指定git在不同事件.不同动作下执行特定的脚本. 本文将介绍git hoo

【Webhooks】使用Git的Webhooks进行服务器自动部署代码

使用Git的Webhooks进行服务器自动部署代码 本文项目地址 https://github.com/diandianxiyu/PageBlog/blob/master/%E4%BD%BF%E7%94%A8Git%E7%9A%84Webhooks%E8%BF%9B%E8%A1%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E4%BB%A3%E7%A0%81.md 如有错误,请指正~ 前言 之前一直想做自动化运

Git自动部署

Git自动部署文件位于repository下面的hooks里的post-receive #!/bin/sh set -e git-update-server-info gitosis-run-hook update-mirrors # Check the remote git repository whetherit is bare IS_BARE=$(git rev-parse--is-bare-repository) if [ -z "$IS_BARE" ]; then echo&