当我向我的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.');
答案 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