Git / GitHub是一个很好的WordPress部署解决方案吗?


67

我目前正在本地开发WordPress,使用Git将代码提交到GitHub,然后通过SSH进入服务器并执行“ git pull”更新代码。这是将代码部署到WordPress站点上的一个好选择(在这种情况下,我显然可以对我的服务器进行根级访问。)我知道Capistrano之类的东西,但这对于部署到WordPress站点是否会过大?在这种情况下,如何充分利用Git / GitHub?


我使用deployhq.com,非常喜欢它们提供的功能。这是一项付费服务​​,但我认为价格合理。如果您恰好使用WP Engine托管(我愿意),那么他们最近推出了git push功能:git.wpengine.com
dwenaus

Answers:


60

我为此使用git,发现它确实很好用。一些建议:

  • 将您的上载目录(wp-content / uploads)目录添加到.gitignore文件中。
  • 在开发系统上运行Web服务器和数据库服务器,以便在将更改推送到生产环境之前可以在本地测试更改。
  • 在dev和prod之间保持数据库连接设置一致,或者将wp-config.php添加到.gitignore文件中,以防止开发wordpress设置覆盖生产版本。
  • 避免使用Wordpress的管理界面在生产系统上更新插件-充其量,一旦您推送/签出,git副本将覆盖您更新的所有插件,最坏的情况下会出现冲突。使用开发系统上的管理界面进行更新,在生产中进行提交,推送和签出。
  • 考虑添加一个git post-receive钩子,以将您的更新自动检出到用于通过Web服务器(例如/var/www)发布wordpress的目录中。这使您仅可以检出文件本身,避免任何git元数据发现其进入Web服务器文档根目录的方式,还意味着您可以将任何权限更改添加到接收后挂钩中,以便每次都保持权限一致。下面是一个示例:

    #!/bin/sh
    unset GIT_INDEX_FILE
    # the directory your web server serves wordpress from 
    export GIT_WORK_TREE=/var/www/example.com/
    # the local directory where your remote git repository sites
    export GIT_DIR=/home/git/repos/example.com.git/
    # below user is for debain - you want the user and group your webserver uses
    sudo git checkout -f
    sudo chown -R www-data:www-data $GIT_WORK_TREE
    sudo chmod -R 755 $GIT_WORK_TREE
    sudo chmod 600 $GIT_WORK_TREE/wp-config.php
    sudo chmod -R 775 $GIT_WORK_TREE/wp-content

反击出现unset GIT_INDEX_FILE错字了吗?
韦斯顿·鲁特

James几乎总结了我的工作原理,除了在建立了暂存/测试/生产站点后才将主题文件添加到git repo中。我也完全建议在远程服务器上使用接收后钩子,节省登录时间并进行git pull等
。– davemac

那,加上SSH别名,意味着我可以使用'git push live'等推送到实时主题存储库
davemac

我不熟悉wordpress中的插件更新过程,但是如果插件更新对数据库进行了更改会怎样?这些本地更改将如何推送到生产服务器?
2014年

@User会因插件而异。核心wordpress会进行架构版本检查,因此如果不使用内置更新程序来更新Wordpress,它将单独进行数据库更新。我的建议是,如果您正在使用任何写入数据库的插件,请检查Wordpress的管理区域,因为无论如何更新插件代码,通常都会在此处处理架构更新。
James Hebden 2014年

22

我强烈建议您设置Capistrano-这是第一次的前期工作,但是之后您可以轻松地将其用于新设置。

主要优点是

  • 能够从您的桌面部署。听起来可能不算多,但是将其缩进远程服务器中,并且进行git pull仍然很麻烦。
  • 如果需要,可以轻松回滚到以前的版本
  • 能够完成很酷的事情,例如将部署部署部署到暂存/生产环境。

我添加了一组capistrano脚本,向您展示如何设置。

Capfile

require 'railsless-deploy'
load 'config/deploy'`

deploy.rb

set :stages, %w(production staging local)
set :default_stage, "staging"
require 'capistrano/ext/multistage'

set :application, "" # your application name - used to set directory name

set :scm, :git
set :repository, "" # use the ssh repo access line you get from the provider eg git@github.com:name/repo.git
set :deploy_to, "/var/www/#{application}" #this is the root site folder on the remote server
set :deploy_via, :remote_cache # get directly from repo
set :copy_exclude, [".git", ".DS_Store", ".gitignore", ".gitmodules", "wp-config.php"]

# makes capistrano ask for sudo password or other remote inputs
default_run_options[:pty] = true

namespace :tasks do
    task :fix_links  do
        run "ln -nfs #{shared_path}/uploads #{release_path}/wp-content/uploads"
        run "ln -nfs #{shared_path}/wp-config.php #{release_path}/wp-config.php"
      run "ln -nfs #{shared_path}/blogs.dir #{release_path}/wp-content/blogs.dir"
      run "ln -nfs #{shared_path}/.htaccess #{release_path}/.htaccess"
      run "sudo chown -R www-data.www-data #{release_path}/"
    end
end

after "deploy", "tasks:fix_links"

最后是一个示例环境文件(如果您使用多阶段的gem,则可以针对您环境的每个阶段(例如本地,暂存,生产)使用这些文件之一)

config / local.rb

server "", :app  #hostname
set :branch, 'develop' #choose branch to deploy
set :use_sudo, false #don't use sudo

set :deploy_to, "/var/www/#{application}" #overwrite default path to deploy to

如果不进行调整,这些文件可能无法工作,并且您需要一些Capistrano基本知识,但希望会对某些人有所帮助。

这是我使用的第一篇教程,使我开始使用Capistrano和WordPress:http : //theme.fm/2011/08/tutorial-deploying-wordpress-with-capistrano-2082/


2
如果您使用git post-receive钩子,它们将不需要ssh进入远程服务器并执行git pull
davemac

git post-receive钩是要走的路!
Brock Hensley

3
@dirt接收后挂钩的问题在于,除非您拥有适当的CI基础架构,否则一次不正确的合并会导致整个站点瘫痪。如果您正在与具有对仓库的访问权限的多个开发人员一起工作的项目,则发生这种情况的可能性会增加。这就是为什么我个人更喜欢通过capistrano进行部署,但是我可以理解为什么其他人可能不会这么担心。
阿努

您使用裸git repo,因此合并问题不相关
davemac

9

实际上,我对此主题做了一个WordCamp演示。而不是重复自己,这里是它的一个截屏,并在这里是一个非常简单的部署脚本陪我讨论。

简而言之,我使用GitHub托管存储库,并使用Webhook部署基于git ref的更改。这使您可以使用Vincent Driessen的git分支模型,并通过自动部署使您拥有无限的webhead,登台服务器,测试服务器等。我还将介绍将wp-config.php保持在版本控制下,同时维护单独的开发/生产版本(通过重命名文件和符号链接)。


5

我知道这个问题有点老了,但是由于我在这里还没有看到这个答案,我想分享一下我通常对基于单站点git的设置和部署所做的工作,并且工作得非常好,并且可以在多个站点上工作设备,位置以及多个开发人员(所有人员都有自己的本地存储库,就像git一样,它们都在其中运行)。

我可以热忱地建议以下设置:

(如果您需要第二个资源来解决问题)中也对此进行了概述:

它基本上可以(至少有三个存储库)通过以下方式工作:

  1. 将网站放在git下的实时主机上,
  2. 在实时主机上创建一个新的裸git存储库
  3. 然后从裸存储库派生到您的本地开发git repo。

完成工作后,您将对克隆自的远程裸仓库进行推送。裸仓库具有与实时仓库同步的钩子(在上面的代码称为prime)。

作为回购中Wordpress的特定设置,我有以下内容.gitignore

# uploads are data, excluded from source tree
wp-content/uploads/

其余包括。我一直在版本/配置控制下的插件和主题配置。这使我可以轻松跟踪更改并实时使用代码之前对其进行检查。我还可以通过自己的更改更轻松地将其与远程树合并。这对于Github上可用Wordpress核心特别有用。

这对我的大多数Wordpress需求都很好。裸仓库可以防止您推送冲突的更改。在更新实时站点之前,它还会先同步到远程副本。这意味着更新实时站点通常非常快。由于这些挂钩,您甚至可以根据需要甚至以后调用Wordpress更新挂钩。

如果没有试验过,可以用Github钩子改进多少,但是我通常不需要它们,因为代码在本地版本控制下,而不是Github。

要首次设置这样的系统,您应该花一些时间评估远程主机上是否有可用的所有工具:

  • SSH访问
  • GIT
  • 您可以在其中放置文件和子目录的私有目录(例如,用于裸git repo)

首次设置时间应在两个小时(含)内。整个环境,您首先发布发布。

根据您的主机,您可能还希望屏蔽.git目录以防网络访问。这是一些示例.htaccess代码,甚至将Wordpress放在子目录中也是如此,这在回购中留下了未在线发布的空间(有用):

Options -Indexes

# fix trailing slash for .git / make it disappear + .gitignore and similar files.
RedirectMatch 404 ^/\.git(.*)$

# mask 403 on .ht* as 404
<Files ~ "^\.ht">
  Order Deny,Allow
  Allow from all
  Satisfy All
  Redirect 404 /
</Files>

RewriteEngine On
RewriteBase /

# map everything into public and set environment var
# to tag the request being valid
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule ^(.*)$ /public/$1 [E=sitealias:set,L]

简而言之,不在公共目录中的所有内容都不在线。例如,在公共目录内可以是wordpress代码库,为此,.htaccess您需要:

RewriteEngine On
# mask as 404 if directly accessed
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule .* - [L,R=404]

这阻止了直接访问公众。您可以在此概述该.htaccess -foo的一部分:对.htaccess的请求应返回404而不是403。对于环境变量,您需要测试该变量是否在您的环境中有效。另外,您还需要确定是否将其置于版本控制之下。

如果您对托管有更多的控制权,则可以在此处做更多的事情(以及进行不同的/更优化的处理),以上示例针对的是典型的共享托管环境(提供GIT,有些用户说您可以轻松地将其安装为好吧,我通常请托管人提供此类信息,因为我更喜欢托管人是否愿意为我付费。

从消极的方面讲,这具有一些其他答案中也概述的常见问题。我不感到骄傲的一件事是,有效的方法是使开发主机对其主机文件进行更改,以使数据库服务器指向开发副本。因此,您可以保留一个数据库配置。特别是不是很酷。由于凭据。

自动备份

但是,我通常不在这里,而是每天在远程系统上运行每日备份,这些备份是增量存储的,然后它们本身存储在另一个远程位置。这既简单又便宜,并且允许您还原Wordpress安装以及文件上传,数据库 git repo。另外,对于我的备份命令,我可能并不完美,但是那些对我有用:

mysql: mysqldump --host=%s -u %s --password=%s %s| gzip > %s
git  : git gc
       git bundle
files: tar --force-local -czf %s %s

我在这里建议的是,使Wordpress安装周围的过程不受Wordpress的影响。它们需要在特定的系统上运行,因此通常不需要在应用程序中包含它们(例如,应用程序可能会关闭,但您需要使它们继续运行)。

为团队合作而启用

另一个不错的好处是您的站点已经启用了团队合作。由于有了额外的裸仓库,您可以做很多事情,甚至可以与同事共享除主分支或实时分支之外的远程分支。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.