使用 PHP 脚本自动部署 git 项目

背景介绍

一般流程

在用 git 做项目版本控制的时候。一般开发者在开发环境中完成开发,会把代码 push 到代码托管平台(GitHubBitbucketCoding码云)中。再把 Git库代码 pull 到测试环境中进行项目测试,最后测试通过后的代码 pull 到生产环境中。

自动部署

但每次 push 后,都要 ssh 到服务器上。进入项目目录,再执行 git pull, 如果项目迭代频繁。每次改完代码,都要 push -> ssh -> pull 。过程还是比较繁琐。
那能不能简化这个过程呢?
答案是肯定的,这也是我写篇文章的目的。就是利用 Git hook 的功能,利用 Git hook 实现自动部署方法有很多。我在这里主要介绍如何用 PHP 脚本的方法来实现自动部署项目。测试环境自动部署和生产环境方法是一样的。

准备工作

  • 在代码托管平台创建一个私有库。(这个实例 我在 Coding 上创建的)
  • 项目服务器上安装 git (测试环境或者生产环境)

在服务器上

  • 生成公钥
    主要用于服务器和 Git 仓库的通信,在执行 git clone 或 git pull 的时候免于用户密码验证。

    ssh-keygen -t rsa -C "rockts@sina.com"
    # 最好和你代码托管平台用户一直的邮箱地址
    # 然后一直回车就行
    # 生成的文件通常是 /root/.ssh/id_rsa,如果非root用户请查看提示上的路径
    
  • 准备 hook 文件
    在 www 创建 hook 目录,在 hook 目录创建 index.php ,文件如下:

    <?php
    error_reporting(1);
    $target = './websita.com'; // 服务器上 web 目录
    $token = 'Coding  上填写的 hook 令牌';
    $wwwUser = 'www';
    $wwwGroup = 'www'; 
              
    $json = json_decode(file_get_contents('php://input'), true);
    if (empty($json['token']) || $json['token'] !== $token) {
        exit('error request');
    }            
    $cmds = array(
        "cd $target ",
        "git reset --hard origin/master && git clean -f ",
        "git pull",
        "chown -R {$wwwUser}:{$wwwGroup} $target/",
    );  
    foreach ($cmds as $cmd) {
        shell_exec($cmd);
    }
    

    如果有其他需求,比如 build、watch 都可以写这里
    $wwwUser 是服务器 web服务 运行用户 Nginx 和 Apache 都不一样,根据各自服务器自行填写。

  • 修改目录权限

     chown -R www:www /www/hook # 这里请改成你创建的hook目录
    
  • 配置 git

    git config --global user.name "rockts" 
    git config --global user.email "rockts@sina.com" # 邮箱请与conding上一致
    

备注:hock 目录的 index.php 文件,必须要确保可以访问。
http://example.com/hook/index.php 或者 http://ip/hook/index.php

在代码托管平台

  • 添加服务器用户公钥

    复制服务器上刚创建的的公钥到 Coding -> 账户的 ->SSH公钥 -> 新增公钥

    cat /root/.ssh/id_rsa.pub
    
  • 添加 hock

    在 Coding 上进入您的项目 在 设置-> WebHook 新建 hook

    • url 里输入能访问的 hook目录index.php 的地址
    • token 和 上面 index.php 文件里 $token = 'Coding 上填写的 hook 令牌' 一致。
    • Push 开启

    如果没有问题,稍过几秒刷新页面查看hook状态,显示为绿色勾就OK了。

部署测试

  • 先在服务器执行一次 git clone, 以后就可以实现自动部署了

    sudo -Hu www git clone git@coding.net:you/repo.git /www/websita.com/  --depth=1
    

    第一次 git clone 一定要用服务器 web 服务运行用户
    /www/websita.com/ 服务器项目目录
    git@coding.net:you/repo.git 你的 Coding 上代码库地址

  • 测试项目,给 Coding 代码库 push 一次

    在开发环境

    $ cd 项目目录
    $ vi test.txt
    $ git commit -am "test hook"
    $ git push
    

    过几秒后,你的服务器里项目应该有就 test.txt 就个文件了。
    大功告成!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,331评论 25 707
  • 我常喜欢用“好久不见”作为与人重逢的对白开头,或许是真的好久不见,又或许是想表达一份久违的思念。 可是总有些人,你...
    ZinX阅读 835评论 0 2
  • 站立脊柱前屈伸展式UttanasanaStanding forward bend 1.伸展哪里,就要预先收缩哪里。...
    舒涵vivian阅读 1,043评论 0 6
  • 各位家长: 你们好! 经过昨天与你们的沟通之后,再与其他科任老师进行了一个反馈。今天上课的课堂纪律非常非常的好。所...
    纳百川11阅读 133评论 0 0