問題描述

我正在本地開發我的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。