Frenlee

使用PHP脚本同步git项目

自己在开发项目的时候总是会遇到一些比较繁琐的事情,比如说开发环境中的代码使用git版本控制工具,提交到git远程仓库后,若要同步到服务器上去,如果开发过程中更改的很频繁,那么这就是一件繁琐而痛苦的事情.以往我都是ssh到远程服务器上,手动敲命令,然后pull同步到服务器上的.如果能够使用web hook 也就是远程仓库中的web hook钩子,在每次我push代码后能够让服务器自动pull代码下来,实现自动同步就好了.

以前本来也有去切一个php脚本,通过web hook去实现代码同步的,无奈因为git与代码文件限权,ssh key等各方面权限问题的影响,没有实施成功.今天本来想研究下自动部署那些比较重量级的软件的.但无意中发现了安正超写的使用php脚本同步git项目的文章,然后将权限问题都解决了,然后在记得服务器上实现了下,

我使用的环境是Ubuntu14.04 + nginx + git 1.9.1

具体步骤如下:

准备工作

  • 服务器上必须按照git,web服务以及开启ssh服务
  • 拥有一个自己的git远程仓库

国外比较常用的有 github gitlab 国内比较常用的有 开源中国 coding 国内的服务器的话建议使用国内的版本仓库

在服务器上

  1. 根据服务器进入到web服务器根目录下,我使用的是nginx,所以用户名为www-data ,apache 用户为 apache,不同的环境会有所区别,查看web用户的家目录,在/etc/passwd 文件中可以查看

    1
    sudo cat /etc/passwd
  2. 在web用户家目录下创建 .ssh 文件夹,将所有者和用户组修改该www-data

    1
    2
    sudo mkdir /var/www/.ssh
    sudo chown www-data:www-data /var/www/.ssh/ -R
  3. 使用 www-data 用户生成ssh key

    1
    sudo -Hu www-data ssh-keygen -t rsa

一直回车就好了,然后进入.ssh文件夹既可以看到id_rsa,id_rsa.pub和known_hosts文件了

  1. 配置git 用户和email
    1
    2
    sudo git config --global user.name "frenlee"
    sudo git config --global user.email "frenlee710@gmail.com"

用户名和邮箱需要和git远程仓库的一样,这样提交代码的时候就可以知道是谁提交的.而且可以直接点击用户名跳转到相应的用户

  1. 创建仓库文件夹repos,这个看个人爱好,什么文件名都可以,最好是放在web用户家目录下,并修改所属者和所属组

    1
    2
    sudo mkdir /var/www/repos
    sudo chown www-data:www-data /var/www/repos/ -R
  2. 创建项目文件夹,并修改权限

    我这里的项目文件夹和脚本文件名相同,早/var/www/html/下,创建了一个test 文件夹

    1
    2
    sudo mkdir /var/www/html/test
    sudo chown www-data:www-data /var/www/html/test/ -R
  3. 添加PHP钩子脚本

    在自己服务器可访问到地方添加一个php文件,具体内容为hook.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
    <?php
    /**
    *
    * author: v_frli <frenlee@163.com>
    * since: 2015/12/10 17:32
    */

    error_reporting(1);
    $repos = array('test');//允许操作的代码库
    $target = '/var/www/html/';//目标文件夹
    $dir = '/var/www/repos/';//git 目录
    $token = md5('123456');//验证凭证
    $wwwUser = 'www-data';
    $wwwGroup = 'www-data';

    $input = $_GET;
    if (!(isset($input['token'], $input['target']) && $input['token'] === $token && in_array($input['target'], $repos))) {
    exit('Error request');
    }
    $target .= $input['target'];//项目目标地址
    $dir .= $input['target'];//项目原地址
    if (!is_dir($target) || !is_dir($dir)) {
    exit('Dir is not exist');
    }

    //执行命令
    $cmds = array(
    "cd $dir && git pull", //git pull
    "rm -rf $target/* && cp -r $dir/* $target/",//删除旧文件 复制新文件
    "chown -R {$wwwUser}:{$wwwGroup} $target/"//修改权限
    );
    foreach($cmds as $cmd) {
    shell_exec($cmd);
    }

在托管网站上

  1. 添加ssh 公钥,我这里使用的是gitlab

获取 /var/www/.ssh/id_rsa.pub的内容添加到托管网站的ssh key 下
gitlab的在Profile Settings>SSH Keys下

  1. 在托管网站上创建一个项目

git@gitlab.com:frenlee710/test.git

  1. 添加钩子
    在项目的setting>Web Hooks 下添加自己添加的hook.php文件的访问路径

http://yoursite.com/hook.php?token=e10adc3949ba59abbe56e057f20f883e&target=test

把路径加入就可以了,token 是123456的md5,用来控制我们脚本代码至执行的权限,target表示你要更新的项目是哪一个.

服务器上

  1. 初始化
    我们首先得在服务器上把代码pull下来
    1
    sudo -Hu www-data git clone git@gitlab.com:frenlee/test.git /var/www/repos/test --depth=1

这样就可以了,可以在本地编写代码,然后进行push ,push完成后,等待几秒就可以去验证在项目代码中是否存在代码了.当然第一次弄可能不是一帆风顺,可以自己慢慢一个一个步骤来调试.