4

当我将 git push 到我的 bitbucket 存储库时,我正在尝试设置自动部署。我有一个我从这个博客中利用的 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

4 回答 4

5

我建议发布的不是基于你的 master 中的最新版本,而是基于最新的标签。

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

等等。这提供了回滚功能。您可以创建一个 PHP 脚本,通过 SSH 连接到您的服务器并基于该标签创建一个新的克隆。如果你使用 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

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

于 2013-04-11T14:14:37.057 回答
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 依赖项并将项目文件推送到服务器。

于 2018-03-28T18:42:53.303 回答
0

问题是文件权限。

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

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

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

或者你改变整个方法。按照这篇文章http://toroid.org/ams/git-website-howto我觉得这是一个比上面更好的方法。我最终使用了这种方法。

于 2013-10-17T08:52:13.447 回答
0

你想post-update在你推送到的遥控器中设置一个钩子。

在默认情况下,git 不会检出您推送到远程的任何数据。这就是为什么默认 git 配置拒绝推送到签出分支,因为当您推送到签出分支时,签出文件不再与 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

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

有了这个,您可以简单地编写一个脚本来签出该分支。我更喜欢检查分离的头,因为将多个模块存储库(无子模块)的工作组合到已部署的版本中要简单得多。请参阅我对源代码部署的回答,了解如何在 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
于 2015-06-24T11:33:07.230 回答