使用GitHub、PHP Composer和Bash进行自动化部署

3
我在部署服务器上通过PHP运行Composer时遇到了问题。我已经设定(或将要设定)与GitHub的webhook,以通知我并接受拉取请求,然后自动部署到适当的服务器。
问题出现在bash行(cd $ {localFolder} && composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader)中,它没有给出任何错误或输出,就好像从未调用过一样。脚本中的每一行都可以正常运行,即使是在该顽固命令之后运行的命令也是如此。我还尝试过不带任何选项运行脚本,并使用精确相同的结果硬编码文件夹位置。
当我尝试执行sudo -H -u www-data bash -c 'echo "./download_project.sh 12345678912345 git_branch git_repo'以测试命令时,它可以正常运行并完成。
PHP代码:
$data = json_decode(utf8_encode(file_get_contents("data.json")));
$command = "/var/www/download_project.sh" . " " . uniqid() . " " . $data->deployTable[$deploy]->branch . " " . $data->deployTable[$deploy]->repository;
echo ($command . "</br>");
echo shell_exec($command);

Bash代码:

#! /bin/bash

if [ "$#" -ne 3 ]; then
    echo "Usage: $(basename $0) [guid] [branch] [repository]"
    exit 1
fi

working="/var/www/"
guid=$1
branch=$2
repository=$3
localFolder="${working}temp/"
localFile="${working}temp.zip"

#clone the appropriate branch and repository to the /var/www/temp folder
#result: functions as expected
git clone -b $branch git@github.com:ORGANIZATION/$repository.git $localFolder

#moves the sql folder out of /var/www/temp and onto /var/www to be used for db creation and/or migration
#result: functions as expected
mv "${localFolder}sql" "${working}sql"

#removes /var/www/temp/doc as it is not needed or wanted for production
#result: functions as expected
rm -rf "${localFolder}doc"

#downloads all dependencies  into the /var/www/temp/vedor folder
#result: nothing happens
(cd ${localFolder} && composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader)

注意:GUID将来会用于归档目的。

如果您在Bash代码中将“cd”和“composer install”分开成两行,会发生什么?此外,如果您逐行手动运行脚本,这是否有效? - Mikel Bitson
@MikelBitson 如果我弄坏了光盘,我会得到相同的结果。如果我在shell中逐行运行命令,无论是作为自己还是作为www-data,都可以正常工作。如果我只在脚本中运行顽固的那一行,我会得到相同的无结果。 - Maspuce
你没有描述任何出错的观察结果。你只是指出了shell脚本中有一个有问题的行,声称“它没有给出任何错误信息,而且在这个顽固的命令之后运行的每一条命令都很好”,所以脚本并没有失败或停止,但到底哪里出了问题? - Sven
@Sven,我已经编辑了这篇文章。 本质上就好像命令不存在一样。 我没有从命令中得到任何输出或结果,它应该下载并安装我所有的依赖关系。 - Maspuce
@alcohol 我已经在bash脚本的每一行添加了注释,详细说明了预期结果和实际结果。我保留了cd的换行符以保持问题的原始本质,但是该脚本最初是没有换行符的,并且具有完全相同的结果。 - Maspuce
显示剩余3条评论
1个回答

1
我强烈建议将cd && composer install移出你强制它进入的子shell(即:删除包含的())。其次,我建议暂时修改shebang为#!/bin/bash +x,这样您可以以一种调试模式运行脚本。然后展示给我们运行的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接