最近在使用Coding的代码托管,顺便设置了WebHook自动部署,过程还是挺艰辛的,主要还是没搞懂Linux的权限控制,不过好在弄好了,分享一下获益最深的一篇文章,供大家参考,原文是英文版的,我的英语也不行,勉强能看懂,大家凑合着看吧

原文链接:http://jondavidjohn.com/git-pull-from-a-php-script-not-so-simple/

I intended to set up a repository (hosted on BitBucket) to initiate a pull on a dev server when new commits are pushed up.

It seemed like a simple enough process. BitBucket has a service that will fire off a POST request as a post-receive hook. So I set up a receiving php script to check a randomized token and then initiate the git pull. Looking something like this...

<?php

define('PRIVATE_KEY', 'XXXXXXXXXXXXXXXXxxx');

if ($_SERVER['REQUEST_METHOD'] === 'POST'
&& $_REQUEST['thing'] === PRIVATE_KEY)
{
echo shell_exec("git pull");
}

Didn't end up being as simple as I had anticipated...

There were a few considerations that I did not take into account. Documenting them here will hopefully help you avoid some obstacles in trying to get something like this set up.

(Missed) Considerations

the binary (git in this case)

The user that is attempting to execute git pull is the apache user (www in our case). This user did not happen to have git in their path.

This took a while to track down because the exec() family of functions simply fail silently because they only report STDOUT and not STDERR. To get the function to report STDERR you can route it into STDOUT by adding 2->&1 at the end of your command.

After I realized this I logged in and found the full path of the git binary with which git, which is /full/path/to/bin/git.

<?php
...
echo shell_exec("/full/path/to/bin/git pull 2>&1");
...

Now it was reporting the next issue...

permissions

error: cannot open .git/FETCH_HEAD: Permission denied

The apache user also needs read and write access to the entire repository.

chown -R ssh_user:www repository/

It's also a good idea to make sure any files/directories inherit this ownership if being created by others by setting the group sticky bit.

chmod -R g+s repository/

"Host key verification failed"

Next, you need to do an intial git pull with the apache user to make sure the remote is added to the apache user's known_hosts file

sudo -u www git pull

ssh key

Another consideration created by this command being run by the apache user is the ssh key it uses to communicate with the remote repository.

First, I went down the path of attempting to use the GIT_SSH environment variable to set the ssh -i option to tell it to use a specific ssh key I had generated with the ssh user. I never got this to work, most likely because there are a lot of rules ssh uses to determine the safety of a given key. It requires some specific permissions regarding the user that is attempting to use the key.

An easier way I discovered was to give the apache user a home directory (via /etc/passwd) and a .ssh directory and then run the ssh-keygen command as the apache user (www)

sudo -u www ssh-keygen -t rsa

This creates the keys and puts them in their expected location with the proper permissions applied.

Then I added the key as a read-only key for the BitBucket repository and everything worked as expected.

 

最新文章

  1. 微信小程序 wx.getUserInfo 解密 C# 代码
  2. Snort - manual 笔记(四)
  3. HTML添加多媒体或音乐
  4. wordpress自定义后台用户联系方式 添加qq、微博、微信
  5. golang的采集库
  6. linux中FTP自动备份VPS脚本
  7. 在eclipse中运行storm-starter
  8. NoSql之Redis使用(一)
  9. HDOJ 2802 F(N)
  10. MyEclipse Web Project导入Eclipse Dynamic Web Project,无法部署到tomcat问 题
  11. 免小号QQ空间说说刷赞器
  12. Android 获取截图 并将其保存到本地sd在卡路径
  13. iOS开发 - Swift使用GCD实现计时器功能
  14. Appium移动自动化测试之—基于java的iOS环境搭建
  15. SpringBoot+Angular2 开发环境搭建
  16. hdu 5505(GT and numbers)
  17. python中MySQLdb的使用
  18. Java 8中用法优雅的Stream,性能也&quot;优雅&quot;吗?
  19. 关于memset赋值问题
  20. SAS 日期格式显示年月的format

热门文章

  1. javascript写的新闻滚动代码
  2. [C++程序设计]用指针变量作函数参数接收数组地址
  3. php中12个魔术方法
  4. HQL和Criteria(转)
  5. SPOJDIVCNT2: Counting Divisors(莫比乌斯反演)
  6. logstash nginx 访问日志
  7. LeeCode-Majority Element
  8. The Java™ Tutorials下载地址
  9. vue.js的devtools安装
  10. ios应用view之间数据传递的方式