无人不苦
有情皆孽

利用WebHook实现PHP自动部署Git代码

平时项目代码都托管在Coding,然后每次提交了代码之后都要SSH到服务器上去git pull一次,很是繁琐,在看了OverTrue的《使用PHP脚本远程部署git项目》后就尝试在自己服务器上搞一下自动化部署,下面把部署步骤列出来算是一个分享与备忘。

首先在Coding上创建一个项目,然后在本地clone一份。

在服务器上(以Nginx环境为例,Apache请看OverTrue的教程)

1. 生成公钥

公钥有两个:1. git用户公钥,2. 部署公钥:

git用户公钥

部署公钥

sudo -Hu www ssh-keygen -t rsa # 请选择 “no passphrase”,一直回车下去

2. 准备钩子文件

创建和修改目录权限:

写入钩子文件:

确保你的hook文件可以访问:http://example.com/hook/index.php,钩子准备完成。

3.修改git配置和保存git用户名密码

在Coding网站

1.添加用户公钥

复制/root/.ssh/id_rsa.pub内容到个人设置页的SSH公钥里添加即可(https://coding.net/user/account/setting/keys)

2.添加部署公钥

复制/home/www/.ssh/id_rsa.pub的内容并添加到部署公钥:

选择项目 > 设置 > 部署公钥 > 新建 > 粘贴到下面框并确认

3.添加hook

选择项目 > 设置 > WebHook > 新建hook > 粘贴你的hook/index.php所在的网址。比如:http://example.com/hook/index.php, 令牌可选,但是建议写上。

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

初始化

1.我们需要先在服务器上clone一次,以后都可以实现自动部署了:

这个时候应该会要求你输入一次Coding的帐号和密码,因为上面我们设置了永久保存用户名和密码,所以之后再执行git就不会要求输入用户名和密码了。

**!!注意,这里初始化clone必须要用www用户**

2.往Coding.net提交一次代码测试:

在本地clone的仓库执行:

OK,稍过几秒,正常的话你在配置的项目目录里就会有你的项目文件了。

初始化Laravel框架

1. 下载Composer

在项目目录下执行:

**!!记得在本地提交的时候在.gitignore中加上composer.phar**

======================================================

以上只是针对我个人服务器环境的一个搭建过程,欢迎大家指正、探讨。

服务器环境:Linux(CentOS) - AMH - Nginx & MySql
WWW用户目录:/home/www
项目目录:/home/wwwroot/Dev/website.com/web/
Hook目录:/home/wwwroot/Dev/m.website.com/web/hook/

分享到:更多 ()

评论 21

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #14

    其实在服务器上不需要用户公钥吧,只要部署公钥就应该可以了吧

    骨总2年前 (2016-07-01)回复
    • 要在Coding的个人设置页里添加SSH公钥

      萧晔离2年前 (2016-07-07)回复
      • 在做开发的机器上添加用户公钥我同意,因为要push代码到coding,但是在生产服务器上只需要pull就可以了

        骨总2年前 (2016-07-07)回复
  2. #13

    sudo -Hu www cd /home/wwwroot/blog && git pull
    sudo:cd:找不到命令

    请问这是咋回事呢,该如何解决

    F~2年前 (2016-08-07)回复
    • 此处处理不需要sudo权限,只要讲web目录用户属主属组改为php相同即可。简写成 cd /home/wwwroot/blog && git pull 即可!

      遇着我-YU2年前 (2016-08-31)回复
  3. #12

    在服务器端控制台可以 git pull 在php里 shell_exec() 里这句也执行了 没有报错 但就是没有更新最新的文件下来

    罗锦毅2年前 (2016-08-09)回复
  4. #11

    请教 php: input 这个是什么意思 地址填什么?

    万斯number2年前 (2016-08-12)回复
    • php:input是php输入流,不需要填写地址,这里是接收post数据

      萧晔离2年前 (2016-08-17)回复
  5. #10

    我来补充两句:
    (一) 首先sudo -Hu 选项大家可能会困惑什么意思,-u代表切换到哪一个用户,这里说的是www
    -H代表切换HOME环境变量的值,也就是password文件中www用户对应的home目录,这个地方有的人遇到无法生成.ssh目录,或者与示例中结果或者位置不同,可以通过password中进行修改,位置自定义!
    (二) sudo -Hu www cd $target && git pull; 脚本执行会失败,原因是php执行者为www,www不在sudoer用户组中,所以执行时候会报错,经过测试发现,只要目录权限与php执行者权限一致,就可以通过cd $target && git pull语句顺利执行。
    希望大家可有作为参看进行修改……

    遇着我-YU2年前 (2016-08-31)回复
  6. #9

    赞一个!

    遇着我-YU2年前 (2016-08-31)回复
  7. #8

    畅言弱爆!点一下出现三条评论,删除还不好用,博主手动删下吧 (⊙o⊙)…

    遇着我-YU2年前 (2016-08-31)回复
  8. #7

    还有就是在确定sshkey无误的情况下出现git clone 或者 git pull 400报错,请修改remote地址为ssh地址,不要使用https的地址~

    遇着我-YU2年前 (2016-08-31)回复
  9. #6

    按照这种方式,为什么在coding上面,点击测试,始终报错302呢?

    Lilan1年前 (2017-03-24)回复
  10. #5

    谢谢博主,虽然有些地方有点怪,但是很详细,自己摸索就好了。我总结一下
    1.注意看一条条,是真的有用,而且必要的,我做的时候漏了好多,导致出了很多问题。
    2.全部以PHP用户来执行命令,就是sudo所用到的,运行前先看一下是www还是www-data,我的是后者,要自己做相对应的更改。
    3.公钥有两个,一个是个人的,一个是git的,而且git的是www-data生成的,这个要注意。
    4.PHP语句貌似写错了,应该为$cmd = “cd /mnt/www/xxx && sudo -Hu www-data git pull”;
    否则会提示没有sudo cd 这个指令

    Neil11个月前 (06-10)回复
    • 嗯,可能每个系统操作不一样,用户的确要注意,我的服务器是用root登录的,php是www用户,不注意的话可能就会没有权限执行git pull

      萧晔离10个月前 (06-12)回复
      • 博主 你好,我按照你的方式试了很多遍,WebHook上显示成功,但服务器上的代码就是没有更新….这种情况大概是什么原因呢

        Mr.Chen9个月前 (07-25)回复
  11. #4

    弱弱问一下,这个场景下,vendor和node_modules 都是没有提交到版本库的,那么本地git pull 完了,还要自己切到线上去 require install 或者 npm install吗,那这样的话,个人感觉还是比较蛋疼,还是我没有理解有误?

    weaving9个月前 (08-02)回复
  12. #3

    首先非常感谢楼主的分享,我说下我遇到的问题和解决方案。
    按照楼主的操作进行下去,递交git更新,服务器端php没有执行,逐渐查问题发现。
    1.需要在php.ini内找到disable_functions= ,删掉其中的shell_exec函数,保存重启php
    2.遇到提示www没在sudoers 范围内。切换root用户 vi /etc/sudoers 找到root ALL=(ALL) ALL的字段,在下一行追加:
    www ALL=(ALL) ALL
    使用!wq强制保存

    PS:以上是我遇到的两个问题和解决方法。希望各位遇到跟我一样的问题,照着解决吧。

    nowbe8个月前 (08-28)回复
  13. #2

    我之前用这个方法一直好好的,很久前的一天突然不能用了。
    解决好久不行,今天用的这个依然不行。
    Coding 那边也没有问题,就是服务端代码不能更新。
    www 也放到sudoers了, www 和 Nginx php 都是一个用户。目录改给的权限也给了,git pull 手动也没有报错也没有问题。就不是自动 git pull

    乐可开源6个月前 (10-15)回复
  14. #1

    对了,你这有个问题。你把 hook php 文件放到项目目录里,一次git clone 会老提示项目目录不空目录,不能git clone

    乐可开源6个月前 (10-15)回复