使用Git,Bitbucket和PHP自动部署

时间:2013-04-11 14:11:18

标签: php git deployment bitbucket

当我向我的bitbucket存储库进行git推送时,我正在尝试设置自动部署。我有一个我从this blog使用的php部署脚本,但是当脚本运行时,它记录它只是从先前的提交更新。

这是一个例子。假设我登录到我的服务器并输入git pull。服务器将使用最新的更改进行更新,并假设该提交的哈希值为001.但是,如果我进行多次提交,请调用它们002,003和004我的脚本应该每次都运行,假设我在每次提交后将这些更改推送到bitbucket 。该脚本运行但每次它都将保留001的更改。只有当我登录到我的服务器并输入git pull时,服务器才会更新为004.您知道是什么原因引起的吗?

// Make sure we're in the right directory
exec('cd '.$this->_directory, $output);
$this->log('Changing working directory... '.implode(' ', $output));

// Discard any changes to tracked files since our last deploy
exec('git reset --hard HEAD', $output);
$this->log('Reseting repository... '.implode(' ', $output));

// Update the local repository
exec('git pull '.$this->_remote.' '.$this->_branch, $output);
$this->log('Pulling in changes... '.implode(' ', $output));

// Secure the .git directory
exec('chmod -R og-rx .git');
$this->log('Securing .git directory... ');

if (is_callable($this->post_deploy))
{
 call_user_func($this->post_deploy, $this->_data);
}

$this->log('Deployment successful.');

4 个答案:

答案 0 :(得分:5)

我建议不要根据主版本中的最新版本发布,而是发布最新版本。

/home/my-user/my-application/1.0.12/www
/home/my-user/my-application/1.0.13/www

等。这提供了回滚功能。您可以创建一个通过SSH连接到服务器的PHP脚本,并根据该标记创建一个新的克隆。如果使用Composer,则可以使用它来执行命令。如果没有,你可以使用makefile。

编辑:我忘了提及你是如何实际链接的。

你有一个符号链接
/home/my-user/my-application/www -> /home/my-user/my-application/1.0.12/www

当您的整个部署脚本完成且没有错误时,您将符号链接切换为:
/home/my-user/my-application/www -> /home/my-user/my-application/1.0.13/www

您的应用程序现在无需停机即可使用。

答案 1 :(得分:1)

一种非常简单有效的方法是使用 bitbucket管道,您可以创建一个YAML脚本来编译您的依赖关系并在每次提交时将代码推送到服务器,自动或手动。

以下是Bitbucket Pipelines YAML脚本的示例:

image: php:7.1.1

pipelines:
  default:
    - step:
       caches:
         - composer
       script:
         - apt-get update && apt-get install -y unzip
         - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
         - composer install
    - step:
       deployment: staging
       name: Deploy to Staging Server
       script:
         - apt-get update
         - apt-get -qq install rsync 
         - echo "Upload Project files..."
         - rsync -avH * -e "ssh" root@$IP_SERVER:/var/www/html/

此脚本在Docker实例中安装Composer依赖项,并将项目文件推送到服务器。

答案 2 :(得分:0)

问题是文件权限。

我正在关注该博客帖子的相同链接。我发现php和nginx进程使用的'www-data'用户没有对存储库代码的写权限。它甚至不能使用git。

为验证这一点,请尝试在服务器上执行'git pull'作为'www-user'。您可以通过'sudo su www-data'切换到它。您会发现它甚至不能将其识别为有效的git仓库,并且无法在没有错误的情况下运行“deploy.php”脚本。

您需要为存储库设置适当的权限,以便www-data可以访问它。

或者你改变了整个方法。请关注http://toroid.org/ams/git-website-howto这篇文章,我认为这是一种比上述更好的方法。我最终使用了这种方法。

答案 3 :(得分:0)

您想在推送的遥控器中设置post-update挂钩。

在默认情况下,git不会检出您推送到远程的任何数据。这就是为什么默认的git配置拒绝推送到签出分支,因为当你推送到checkout-out分支时,签出的文件不再与HEAD保持同步。

当远程接收推送到分支时,您可以在post-update挂钩中对此做出反应。要了解会发生什么,首先应该从一些日志开始:

echo "post update `date`: $*" >> /home/ingo/test/githooks.out

当我推到新的分支时,例如我得到了行

post update Mi 24. Jun 13:01:14 CEST 2015: refs/heads/new

,其中$*包含我推送的分支。

有了这个,您可以编写一个简单的脚本来检查该分支。我更喜欢检查分离头,因为将多个模块存储库(无子模块)的工作组合到部署版本中要简单得多。请参阅我的answer到源代码部署,了解如何在git存储库之外签出代码并使用它。

例如你可以做

for b in $*
do B=`basename $b`
if [ "$B" = "publish" ] # react on changes to the publish branch
then git --work-tree "PATH TO THE PUBLISHED WORK TREE" checkout publish
do_some_extra_work # to change permissions or inform your team leader
fi done

当然,您也可以执行结帐步骤,即拉动

if [ "`cat HEAD`" = "ref: refs/heads/master" ]
# only do that checkout if the repository is in a sane state
then git merge new # I assume you push to new
fi

很酷的是,您将在执行推送的终端中看到遥控器上挂钩的输出:

# git push remote master:new
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Updating f81ba5b..a99a710
remote: Fast-forward
remote:  a.txt | 2 ++
remote:  1 file changed, 2 insertions(+)
To ../remote
    db48da1..a99a710  master -> new