問題描述
我正在本地開發我的 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 it 和 here’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 建議以下設置:
它也被概述 (如果你需要一個第二個資源來圍繞它):
它基本上有效 (至少有三個回饋):
- 將網站放在 Git 上的 live-host 上,
- 在即時主機上創建一個新的 bare git repository 。
- 然後從裸機庫到您的本地開發 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。