当我推送到GitHub时,我正在编写一个webhook来自动发布网站。部分流程要求我使用
构建网站bundle exec middleman build --clean
我正在尝试使用PHP脚本调用它,GitHub webhook调用该脚本,因此用户为www-data
。然而,无论我尝试什么,我都会收到bundle
无法找到的错误。
如何从PHP脚本运行bundle
命令?
答案 0 :(得分:0)
我能够弄清楚这一点。首先,我installed rvm作为多用户安装,以确保www-data
帐户可以访问它。
$ curl -sSL https://get.rvm.io | sudo bash -s stable
安装所需的ruby版本,在我的情况下为2.3.1,然后设置rvm以使用它:
$ rvm install 2.3.1
$ rvm use 2.3.1
运行gem
以安装所需的任何宝石。由于rvm是一个多用户安装,因此这些gem会存储到系统而不是您的特定用户。
$ gem install packagename
我不知道这是否有必要,但我会关闭SSH会话并重新打开它。 rvm与环境变量混淆,所以比抱歉更安全。
运行env
以打印所有环境变量。如果printenv
由于某种原因没有env
,PATH=/usr/local/rvm/gems/ruby-2.3.1/bin:/usr/local/rvm/gems/ruby-2.3.1@global/bin:/usr/local/rvm/rubies/ruby-2.3.1/bin:/usr/local/rvm/bin:/home/steven/bin:/home/steven/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
rvm_bin_path=/usr/local/rvm/bin
GEM_HOME=/usr/local/rvm/gems/ruby-2.3.1
IRBRC=/usr/local/rvm/rubies/ruby-2.3.1/.irbrc
MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.3.1
rvm_path=/usr/local/rvm
rvm_prefix=/usr/local
rvm_ruby_string=ruby-2.3.1
GEM_PATH=/usr/local/rvm/gems/ruby-2.3.1:/usr/local/rvm/gems/ruby-2.3.1@global
RUBY_VERSION=ruby-2.3.1
也会有效。您将获得所有设置的大清单,您只需要与红宝石相关的清单。 不要复制/粘贴这些值,它们是我从系统中提取的示例。你的不一样!
/etc/php/5.6/fpm/pool.d/www.conf
现在我们需要PHP来识别这些变量。您需要在系统上找到正确的文件,这可能很棘手。我没有办法知道哪一个是正确的,我使用了反复试验。
我系统上的文件是PATH
。使用以下格式将以前抓取的所有环境变量添加到此文件中。请注意,您在这里也需要env[rvm_path] = /usr/local/rvm
env[rvm_prefix] = /usr/local
!
php-fpm
现在重启$ sudo systemctl restart php5.6-fpm
。您的服务名称可能与我的不同;我正在使用ondrej/php中的5.6版本。
Ubuntu 15.04及更新版(systemd):
$ sudo service php5.6-fpm restart
Ubuntu 14.10及更新版本:
cd
最后,在脚本本身中,您需要bundle
到您正在运行cd /opt/slate
/usr/bin/git reset --hard
/usr/bin/git pull
bundle exec middleman build --clean
cp -R /opt/slate/build/* /var/www/docs
命令的目录。我的简短剧本是:
function partioning(arr, left , right) // default qsort implementation
{
var pivot = arr[Math.floor((left + right)/ 2)],
i = left;
j = right;
var temp;
while(i <= j)
{
while(arr[i] < pivot)
i++;
while(arr[j] > pivot)
j--;
if(i <= j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
return i;
}
function quicksort(arr, left, right)
{
var i = partioning(arr, left, right)
if(left < i - 1)
quicksort(arr, left, i - 1);
if(right > i)
quicksort(arr, i, right);
return arr;
}
适合我!