问题描述

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

最佳解决方案

我使用 git 这个,发现它工作得很好。几点建议:

  • 将您的上传目录 (wp-content / uploads) 目录添加到.gitignore 文件。
  • 在您的开发系统上运行 Web 服务器和数据库服务器,以便您可以在将它们推送到生产之前在本地进行测试。
  • 保持数据库连接设置与 dev 和 prod 保持一致,或者将 wp-config.php 添加到.gitignore 文件中,以防止您的开发 wordpress 设置覆盖生产环境。
  • 避免使用 WordPress 的管理界面更新您的生产系统上的插件 – 尽可能地,您的 git 副本会在您推/签时立即覆盖您更新的任何插件,最糟糕的是您将会遇到冲突。使用开发系统上的管理界面进行更新,在生产中提交,推送和结帐。
  • 考虑添加一个 git post-receive 钩子,将您的更新自动检入您通过 Web 服务器 (例如/var/www) 发布 wordpress 的目录。这允许您仅查看文件本身,避免任何 git 元数据查找到您的 Web 服务器的文档根目录,也意味着您可以将任何权限更改添加到 post-receive 钩子中,以便您的权限保持一致。以下是一个例子:

    #!/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
    

次佳解决方案

我强烈建议您设置 Capistrano – 这是第一次的一些前期工作,但之后,您可以轻松地使用它来进行新的设置。

主要优点是

  • 能够从桌面部署。这可能听起来不是很多,但是 ssh-ing 进入你的远程服务器,并且做一个 git 拉扯仍然是一个痛苦的屁股。
  • 如果需要,可以轻松回滚到以前的版本
  • 能够做到很酷的事情,如安装部署到分段/生产环境。

我正在添加一组 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"

最后,一个示例环境文件 (如果您使用多级宝石,那么您可以为您的环境的每个阶段都有其中一个,例如本地,分段,生产)

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/

第三种解决方案

我实际上做了一个关于这个话题的 WordCamp 演示。不要重复我自己,here’s a screencast of ithere’s a very simple deployment script 陪同我讨论的。

简而言之,我使用 GitHub 托管 repo,并使用一个 webhook 来部署基于 git ref 的更改。这允许您使用 Vincent Driessen’s git branching model,并打开您的无限网页头,分段服务器,测试服务器等,全部采用自动部署。我还将保留 wp-config.php 版本控制,同时保持单独的开发/生产版本 (通过重命名文件和符号链接) 。

第四种方案

我知道这个问题有点老了,因为我在这里没有看到这样的回答,我想分享一下我通常用于基于 single-site Git 的设置和部署,它的工作非常好,同时也是从多个设备工作,位置和多个开发人员 (都有自己的本地资源,因为它是常见的 git) 。

我可以 warm-heartedly 建议以下设置:

它也被概述 (如果你需要一个第二个资源来围绕它):

它基本上有效 (至少有三个回馈):

  1. 将网站放在 Git 上的 live-host 上,
  2. 在实时主机上创建一个新的 bare git repository
  3. 然后从裸机库到您的本地开发 git repo(s) 。

当你完成这项工作后,你就可以按照你从中克隆的远程裸机回购。纯粹的回购具有与现场回购同步的钩子 (在上面的代码中称为黄金) 。

作为 WordPress 的具体设置在 repo 我有这个.gitignore

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

其余的包括插件和主题配置我保持在版本/配置控制。这样我可以在使用它之前轻松跟踪更改并查看代码。我也可以通过我自己的更改更容易地与远程树结合。这对 WordPress core which is available on Github 特别有用。

这对我的大部分 WordPress 需求都很好。裸机可以防止您发生冲突的变化。在更新 live-site 之前,它也首先同步到远程副本。这意味着更新 live-site 通常很快。因为这些钩子,如果你喜欢,你甚至可以调用 WordPress 更新钩子。

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

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

  • SSH 访问
  • GIT
  • 一个私有的目录,你可以把文件和 sub-directories(例如,你的裸机 git repo)

setup-time 第一次应该可以在一个两小时内包括。整个环境和你先发布推。

根据您的主机,您可能还需要屏蔽 web-access 中的.git 目录。这里有一些.htaccess 代码,甚至将 WordPress 放置在 sub-directory 中,这样可以在 repo 中留下空间,而不在线发布 (有用):

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 可以在这里找到:Requests to .htaccess should return 404 instead of 403 。对于环境变量,您需要测试是否在您的环境中工作。此外,您还需要决定是否将其置于版本控制之下。

如果您对托管有更多的控制权,您可以在此处进行更多的操作 (而不同/更多的优化),上面的示例针对典型的 shared-hosting 环境 (提供 GIT,有些用户可以轻松地将其自己安装) 我通常要求我的主人提供,因为我喜欢,如果他们照顾,这是我支付他们) 。

在消极方面,这还有一些常见问题也在其他答案中概述。有一件事我不为自豪,但有什么工作是给开发主机一个变化,它的主机文件让数据库服务器指向开发副本。所以你可以保留一个数据库配置。不是很酷 esp 因为凭据。

自动备份

然而,我通常在这里并不在意,而是在远程系统上运行每日备份,这些远程系统是自动存储在另一个远程位置的。这很简单便宜,可以让您恢复 WordPress 安装以及 file-uploads,数据库和 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 之外。他们需要在特定的系统上运行,所以你通常不会在应用程序中使用它们 (例如,应用程序可能会下降,但是您需要让它们继续运行) 。

启用团队合作

另一个不错的好处是您已经为 team-work 启用了站点。由于额外的光盘回购,您不能做太多错误,甚至可以与您的同事分享远距离的分支机构,与主人或现场分支机构分开。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。