先说下基本流程
1、首先在码云创建一个项目,名为test
2、在本地创建git版本库,拉取码云上的test代码,与码云上的test项目建立连接
3、远程工作服务器克隆码云上的test代码,与码云上的test项目建立连接
4、在远程服务器上的工作目录建立一个webhooke.php文件,作为回调脚本
5、设置码云上test项目的webhook回调地址为上一步建立的文件地址
6、本地同步代码到码云后,远程工作服务器会自动从码云拉取代码
流程是比较简明容易理解的,不过过程却是曲折的。主要还是对linux服务器不熟悉,造成了走弯路。
下面就回顾一下整个实现过程和遇到坑
一、安装git
按照百度搜索到的教程,一步步安装。链接:https://jingyan.baidu.com/article/e9fb46e16698687521f766ec.html 安装过程中出现错误,提示 undefined reference to `libiconv'
安装libiconv,详细链接地址:http://blog.csdn.net/daojibruce/article/details/75315401
二、在工作服务器拉取项目
1、首先在服务器上生成秘钥,并把秘钥填写到码云的设置中
这里要注意的坑
是:生成密钥匙时,要使用http服务器的用户生成。否则当运行webhook.php文件,链接git时,shell脚本的执行者是http服务器的用户www,系统会到www用户的家目录下寻找对应的秘钥。
所以在生成密钥时,不能直接 ssh-keygen -t rsa -C “码云的邮箱”,这样写会直接在当前用户root的家目录生成秘钥。所以我们要切换到www用户执行该命令,或者直接使用sudo运行该命令:sudo -u www ssh-keygen -t rsa -C “码云的邮箱”,然后一路回车即可。
然而我又遇到了个坑
,输出如下错误:/dev/null:NOt a directory
这个问题找了半天,终于找到问题的原因。是因为www用户的家目录设置有误,所以生成密钥时,找不到存储位置。使用命令查看用户的家目录位置,如下:
www用户的家目录本应是www目录,不知道怎么变成dev/null。改成www后,在www目录下建立.ssh文件夹,运行命令成功。
去到.ssh目录下,把is_rsa.pub文件中的字符串复制下,填到码云
2、克隆test项目
还是使用www用户,运行git命令,克隆test项目:sudo -u www git clone ssh:git@xxxxxxx
然后又输出错误信息,提示没有发现git命令。是因为当前用户的环境变量里没有设置git的路径,可以去设置环境变量,或者直接把路径拼接在git前面即可。使用git –exec-path 查看git的运行路径,然后执行:
sudo -u www /usr/local/libexec/git-core/git clone ssh:git@xxxxxxx
三、webhook.php
webhook.php文件逻辑比较简单。接受到码云发送的请求后,验证下密码,判断是否合法,然后执行shell命令即可:shell_exec(“sudo -u www /usr/local/libexec/git-core/git pull”);