如何从PHP脚本运行bundle

时间:2016-10-22 00:50:57

标签: php ruby bundler

当我推送到GitHub时,我正在编写一个webhook来自动发布网站。部分流程要求我使用

构建网站
bundle exec middleman build --clean

我正在尝试使用PHP脚本调用它,GitHub webhook调用该脚本,因此用户为www-data。然而,无论我尝试什么,我都会收到bundle无法找到的错误。

如何从PHP脚本运行bundle命令?

1 个答案:

答案 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由于某种原因没有envPATH=/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;
}

适合我!