PHP 执行对比。 apache 用户 shell:自动 GIT 部署 PHP BitBucket 服务器
PHP exec Vs. apache user shell : Automatic GIT deployments PHP BitBucket Server
我做了一些研究,我正在尝试重现类似于 JONATHAN NICOL 的博客 post、“Automated git deployments from Bitbucket”。
更新发布
我已经启用了 exec()
函数输出的日志记录功能,并在我的命令末尾添加了 2>&1
。
当我打印返回给 deploy.log 的内容时,我收到以下内容:
//从exec('cd /home/apache/www.websitename.org.git && git fetch 2>&1');
(
[0] => fatal: Not a git repository (or any parent up to mount point /home)
[1] => Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
)
//来自 exec('cd /home/apache/www.websitename.org.git && GIT_WORK_TREE=/var/www/html/www.websitename.org /usr/bin/git checkout -f');
的输出
Array
(
[0] => fatal: Not a git repository (or any parent up to mount point /home)
[1] => Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
)
问题描述:
如果我复制在引用的 PHP Web 挂钩脚本中包含的 exec()
函数中执行的命令的输出,当我的 feature branch
合并到 dev
被复制到适当的目录中。我的问题是我想确保 exec()
函数中的命令 运行ning 实际上正在执行。
起初我以为这是由于权限问题,但我从 shell 发出的命令与通过 PHP 的 exec()
函数。
我似乎无法弄清楚为什么 Web Hook 脚本生成的命令在 apache 用户的 shell 中起作用,但在 PHP 执行时却不起作用 PHP 运行 作为 apache 并生成它们。
环境描述:
我在 RedHat 7.2 机器上安装了 BitBucket 服务器 v4.7.1 运行ning。该服务器还包含一个开发环境,我想在合并特定分支时自动部署文件。
我的网络根目录是 /var/www/html,apache 可以访问它。当我执行 <?php echo exec('whoami'); ?>
时,输出是 apache
。
我正在 运行 宁 PHP 5.6.23,我可以从 php 脚本执行 shell 命令。
我的php用户是apache,apache还有一个shell连接到这个用户
我在GIT的默认分支是master
,我还有dev
和staging
分支。典型的工作流程是从 master
创建一个分支并将更改提交到功能分支。然后将该功能分支合并到 dev
,然后合并到 staging
,最后合并到 master
.
使用 Nicol 博客 post 的结构和用于 bitbucket.org 的修改后的 BitBucket Repo,我已经能够复制以下内容:
使用以下命令将 GIT 存储库克隆为镜像:
作为 apache 用户:
cd /home/apache/
git clone --mirror ssh://git@path.to.bitbucket.local:7999/wn/www.websitename.org.git
然后:
cd /home/apache/www.websitename.org.git
GIT_WORK_TREE=/var/www/html/www.websitename.org git checkout -f dev
Apache 对 .git 存储库具有适当的权限,apache 可以在其 $PATH
中访问 git
,并且 apache 具有 /var/www/html/www.websitename.org
我正在检查这种情况下的 dev
,因为我在 BitBucket 中的 Web Hook 设置为在功能分支合并到 dev
并推送到 BitBucket 时做出响应。
Bitbucket Server Web Post Hooks 插件调用的 PHP 脚本类似于以下内容:
更新的代码示例
<?php
//$repo_name = $_GET['repoName'];
//$client = $_GET['client'];
//for debug
//file_put_contents('deploy.log', serialize($_POST['payload']), FILE_APPEND);
//file_put_contents('deploy.log', $_GET['client'], FILE_APPEND);
//file_put_contents('deploy.log', $_GET['repoName'], FILE_APPEND);
//file_put_contents('deploy.log', print_r($_POST), FILE_APPEND);
// Full path to git binary is required if git is not in your PHP user's path. Otherwise just use 'git'.
$git_bin_path = '/usr/bin/git';
echo getcwd() . "\n";
$update = false;
// Parse data from Bitbucket hook payload
//$payload = json_decode($_POST['payload']);
if ( isset($_POST['payload']) ) { // old method
$payload = $_POST['payload'];
} else { // new method
$payload = json_decode(file_get_contents('php://input'),false);
}
/*if(function_exists('exec')) {
file_put_contents('deploy.log', print_r("exec enabled",true), FILE_APPEND);
}else{
file_put_contents('deploy.log', print_r("exec NOT enabled",true), FILE_APPEND);
}
if(function_exists('chdir')) {
file_put_contents('deploy.log', print_r("chdir enabled",true), FILE_APPEND);
}else{
file_put_contents('deploy.log', print_r("chdir NOT enabled",true), FILE_APPEND);
}
file_put_contents('deploy.log', print_r($payload,true), FILE_APPEND);*/
//set repo name
$repo_name = $payload->repository->slug;
file_put_contents('/var/www/html/deploy/deploy.log', print_r($repo_name.":",true), FILE_APPEND);
$web_root_dir = '/var/www/html/lt/'.$repo_name;
$repo_dir = '/home/apache/'.$repo_name.'.git';
$dir = getcwd();
file_put_contents('/var/www/html/deploy/deploy.log',print_r("BEFORECHDIR:".$dir."CHDIRBEFORE\r\n"), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r("repo".$repo_dir."repo\r\n",true), FILE_APPEND);
chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r("DIR:repo".getcwd()."repo:DIR \r\n",true), FILE_APPEND);
$test = chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($test,true), FILE_APPEND);
if(count($payload->refChanges) == '0'){
$update = false;
}elseif($payload->refChanges[0]->refId == 'refs/heads/dev' ){
$update = true;
}
file_put_contents('/var/www/html/deploy/deploy.log', print_r("This is the update:".$update.": this ends update \r\n",true), FILE_APPEND);
if ($update) {
file_put_contents('/var/www/html/deploy/deploy.log', print_r("It's an update",true), FILE_APPEND);
// Do a git checkout to the web root
$cmd1 = $git_bin_path . ' fetch';
$cmd2 = 'GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' checkout -f ';
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd1,true), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd2,true), FILE_APPEND);
$test = chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($test,true), FILE_APPEND);
exec("cd ".$repo_dir." && ". $cmd1 ." 2>&1",$out1,$outtest);
if($outtest !==0 ){
file_put_contents('/var/www/html/deploy/deploy.log', print_r($out1,true), FILE_APPEND);
}
exec("cd ".$repo_dir." && ". $cmd2 ." 2>&1",$out2,$outtest1);
if($outtest1 !==0 ){
file_put_contents('/var/www/html/deploy/deploy.log', print_r($out2,true), FILE_APPEND);
}
file_put_contents('/var/www/html/deploy/deploy.log', print_r("made it past exec",true), FILE_APPEND);
//$test = shell_exec($cmd1);
//$test2 = shell_exec($cmd2);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd1,true), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd2,true), FILE_APPEND);
// Log the deployment
$commit_hash = exec('cd ' . $repo_dir . ' && ' .$git_bin_path . ' rev-parse --short HEAD');
file_put_contents('/var/www/html/deploy/deploy.log', date('m/d/Y h:i:s a') . " Deployed branch: " . $branch . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}
?>
我可能忽略了什么会导致 PHP 的 exec()
函数在使用 exec()
时以不足的权限执行,而不是直接从 [=110] 执行=] 用户的 shell?
原来是 RedHat 7.2 下 apache 用户的 SELinux 权限问题。
我创建了另一个用户并添加了一个 bash 脚本来执行 git 提取和结帐。
我还修改了我的 sudoers 文件以允许 apache 运行 bash 脚本作为新创建的用户。
我做了一些研究,我正在尝试重现类似于 JONATHAN NICOL 的博客 post、“Automated git deployments from Bitbucket”。
更新发布
我已经启用了 exec()
函数输出的日志记录功能,并在我的命令末尾添加了 2>&1
。
当我打印返回给 deploy.log 的内容时,我收到以下内容:
//从exec('cd /home/apache/www.websitename.org.git && git fetch 2>&1');
(
[0] => fatal: Not a git repository (or any parent up to mount point /home)
[1] => Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
)
//来自 exec('cd /home/apache/www.websitename.org.git && GIT_WORK_TREE=/var/www/html/www.websitename.org /usr/bin/git checkout -f');
Array
(
[0] => fatal: Not a git repository (or any parent up to mount point /home)
[1] => Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
)
问题描述:
如果我复制在引用的 PHP Web 挂钩脚本中包含的 exec()
函数中执行的命令的输出,当我的 feature branch
合并到 dev
被复制到适当的目录中。我的问题是我想确保 exec()
函数中的命令 运行ning 实际上正在执行。
起初我以为这是由于权限问题,但我从 shell 发出的命令与通过 PHP 的 exec()
函数。
我似乎无法弄清楚为什么 Web Hook 脚本生成的命令在 apache 用户的 shell 中起作用,但在 PHP 执行时却不起作用 PHP 运行 作为 apache 并生成它们。
环境描述:
我在 RedHat 7.2 机器上安装了 BitBucket 服务器 v4.7.1 运行ning。该服务器还包含一个开发环境,我想在合并特定分支时自动部署文件。
我的网络根目录是 /var/www/html,apache 可以访问它。当我执行 <?php echo exec('whoami'); ?>
时,输出是 apache
。
我正在 运行 宁 PHP 5.6.23,我可以从 php 脚本执行 shell 命令。
我的php用户是apache,apache还有一个shell连接到这个用户
我在GIT的默认分支是master
,我还有dev
和staging
分支。典型的工作流程是从 master
创建一个分支并将更改提交到功能分支。然后将该功能分支合并到 dev
,然后合并到 staging
,最后合并到 master
.
使用 Nicol 博客 post 的结构和用于 bitbucket.org 的修改后的 BitBucket Repo,我已经能够复制以下内容:
使用以下命令将 GIT 存储库克隆为镜像:
作为 apache 用户:
cd /home/apache/
git clone --mirror ssh://git@path.to.bitbucket.local:7999/wn/www.websitename.org.git
然后:
cd /home/apache/www.websitename.org.git
GIT_WORK_TREE=/var/www/html/www.websitename.org git checkout -f dev
Apache 对 .git 存储库具有适当的权限,apache 可以在其 $PATH
中访问 git
,并且 apache 具有 /var/www/html/www.websitename.org
我正在检查这种情况下的 dev
,因为我在 BitBucket 中的 Web Hook 设置为在功能分支合并到 dev
并推送到 BitBucket 时做出响应。
Bitbucket Server Web Post Hooks 插件调用的 PHP 脚本类似于以下内容:
更新的代码示例
<?php
//$repo_name = $_GET['repoName'];
//$client = $_GET['client'];
//for debug
//file_put_contents('deploy.log', serialize($_POST['payload']), FILE_APPEND);
//file_put_contents('deploy.log', $_GET['client'], FILE_APPEND);
//file_put_contents('deploy.log', $_GET['repoName'], FILE_APPEND);
//file_put_contents('deploy.log', print_r($_POST), FILE_APPEND);
// Full path to git binary is required if git is not in your PHP user's path. Otherwise just use 'git'.
$git_bin_path = '/usr/bin/git';
echo getcwd() . "\n";
$update = false;
// Parse data from Bitbucket hook payload
//$payload = json_decode($_POST['payload']);
if ( isset($_POST['payload']) ) { // old method
$payload = $_POST['payload'];
} else { // new method
$payload = json_decode(file_get_contents('php://input'),false);
}
/*if(function_exists('exec')) {
file_put_contents('deploy.log', print_r("exec enabled",true), FILE_APPEND);
}else{
file_put_contents('deploy.log', print_r("exec NOT enabled",true), FILE_APPEND);
}
if(function_exists('chdir')) {
file_put_contents('deploy.log', print_r("chdir enabled",true), FILE_APPEND);
}else{
file_put_contents('deploy.log', print_r("chdir NOT enabled",true), FILE_APPEND);
}
file_put_contents('deploy.log', print_r($payload,true), FILE_APPEND);*/
//set repo name
$repo_name = $payload->repository->slug;
file_put_contents('/var/www/html/deploy/deploy.log', print_r($repo_name.":",true), FILE_APPEND);
$web_root_dir = '/var/www/html/lt/'.$repo_name;
$repo_dir = '/home/apache/'.$repo_name.'.git';
$dir = getcwd();
file_put_contents('/var/www/html/deploy/deploy.log',print_r("BEFORECHDIR:".$dir."CHDIRBEFORE\r\n"), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r("repo".$repo_dir."repo\r\n",true), FILE_APPEND);
chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r("DIR:repo".getcwd()."repo:DIR \r\n",true), FILE_APPEND);
$test = chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($test,true), FILE_APPEND);
if(count($payload->refChanges) == '0'){
$update = false;
}elseif($payload->refChanges[0]->refId == 'refs/heads/dev' ){
$update = true;
}
file_put_contents('/var/www/html/deploy/deploy.log', print_r("This is the update:".$update.": this ends update \r\n",true), FILE_APPEND);
if ($update) {
file_put_contents('/var/www/html/deploy/deploy.log', print_r("It's an update",true), FILE_APPEND);
// Do a git checkout to the web root
$cmd1 = $git_bin_path . ' fetch';
$cmd2 = 'GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' checkout -f ';
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd1,true), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd2,true), FILE_APPEND);
$test = chdir($repo_dir);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($test,true), FILE_APPEND);
exec("cd ".$repo_dir." && ". $cmd1 ." 2>&1",$out1,$outtest);
if($outtest !==0 ){
file_put_contents('/var/www/html/deploy/deploy.log', print_r($out1,true), FILE_APPEND);
}
exec("cd ".$repo_dir." && ". $cmd2 ." 2>&1",$out2,$outtest1);
if($outtest1 !==0 ){
file_put_contents('/var/www/html/deploy/deploy.log', print_r($out2,true), FILE_APPEND);
}
file_put_contents('/var/www/html/deploy/deploy.log', print_r("made it past exec",true), FILE_APPEND);
//$test = shell_exec($cmd1);
//$test2 = shell_exec($cmd2);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd1,true), FILE_APPEND);
file_put_contents('/var/www/html/deploy/deploy.log', print_r($cmd2,true), FILE_APPEND);
// Log the deployment
$commit_hash = exec('cd ' . $repo_dir . ' && ' .$git_bin_path . ' rev-parse --short HEAD');
file_put_contents('/var/www/html/deploy/deploy.log', date('m/d/Y h:i:s a') . " Deployed branch: " . $branch . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}
?>
我可能忽略了什么会导致 PHP 的 exec()
函数在使用 exec()
时以不足的权限执行,而不是直接从 [=110] 执行=] 用户的 shell?
原来是 RedHat 7.2 下 apache 用户的 SELinux 权限问题。
我创建了另一个用户并添加了一个 bash 脚本来执行 git 提取和结帐。
我还修改了我的 sudoers 文件以允许 apache 运行 bash 脚本作为新创建的用户。