Git / GitHub เป็นโซลูชันการปรับใช้ WordPress ที่ดีหรือไม่


67

ขณะนี้ฉันกำลังพัฒนา WordPress ของฉันอยู่ในพื้นที่ยอมรับรหัสของฉันเพื่อ GitHub กับ Git จากนั้น SSHing เข้าสู่เซิร์ฟเวอร์ของฉันและทำ "git pull" เพื่ออัปเดตรหัสของฉัน นี่เป็นตัวเลือกที่ดีสำหรับการปรับใช้รหัสบนเว็บไซต์ WordPress (ฉันเห็นได้ชัดว่ามีระดับการเข้าถึงเซิร์ฟเวอร์ของฉันในกรณีนี้) ฉันรู้ว่าสิ่งต่าง ๆ เช่น Capistrano แต่นั่นจะเกินความจำเป็นในการปรับใช้กับเว็บไซต์ WordPress หรือไม่ ฉันจะใช้ประโยชน์สูงสุดจาก Git / GitHub ในกรณีนี้ได้อย่างไร


ฉันใช้deployhq.comและชอบคุณสมบัติที่มีให้ มันเป็นบริการชำระเงิน แต่ฉันพบว่าราคาสมเหตุสมผล หากคุณเกิดขึ้นที่จะเป็นเจ้าภาพกับเครื่องยนต์ WP (ฉัน) พวกเขาเพิ่งรีดออกคุณลักษณะผลักดันคอมไพล์: git.wpengine.com
dwenaus

คำตอบ:


60

ฉันใช้คอมไพล์สำหรับเรื่องนี้และคิดว่ามันใช้งานได้ดีจริงๆ คำแนะนำเล็กน้อย:

  • เพิ่มไดเรกทอรีอัพโหลดของคุณ (wp-content / uploads) ลงใน.gitignoreไฟล์ของคุณ
  • เรียกใช้เว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูลบนระบบการพัฒนาของคุณเพื่อให้คุณสามารถทดสอบการเปลี่ยนแปลงในเครื่องก่อนที่จะทำการเปลี่ยนแปลง
  • ทำให้การตั้งค่าการเชื่อมต่อฐานข้อมูลของคุณสอดคล้องกันทั้ง dev และ prod หรือเพิ่ม wp-config.php ลงใน.gitignoreไฟล์ของคุณเพื่อป้องกันการตั้งค่า wordpress ของคุณในการเขียนทับการผลิตของคุณ
  • หลีกเลี่ยงการอัปเดตปลั๊กอินในระบบการผลิตของคุณโดยใช้อินเทอร์เฟซผู้ดูแลระบบของ Wordpress - ที่ดีที่สุดสำเนา git ของคุณจะเขียนทับปลั๊กอินใด ๆ ที่คุณอัปเดตทันทีที่คุณกด / เช็คเอาต์ ทำการอัปเดตของคุณโดยใช้อินเทอร์เฟซผู้ดูแลระบบในการพัฒนาของคุณกระทำส่งและชำระเงินในการผลิต
  • ลองเพิ่ม git post-receivehook เพื่อเช็คเอาต์อัพเดตของคุณโดยอัตโนมัติในไดเรกทอรีที่คุณใช้เพื่อเผยแพร่เวิร์ดเพรสผ่านเว็บเซิร์ฟเวอร์ของคุณ (เช่น/var/www) สิ่งนี้ช่วยให้คุณสามารถตรวจสอบไฟล์ด้วยตัวเองเท่านั้นหลีกเลี่ยงการใช้เมตาดาต้า git เพื่อหาทางเข้าไปในรูทเอกสารของเว็บเซิร์ฟเวอร์ของคุณและยังหมายความว่าคุณสามารถเพิ่มการเปลี่ยนแปลงการอนุญาตใด ๆ ลงในตะขอหลังการโพสต์ ตัวอย่างรวมอยู่ด้านล่าง:

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

backtick ปรากฏหลังจากunset GIT_INDEX_FILEพิมพ์ผิดหรือไม่?
Weston Ruter

James สรุปผลวอร์ฟโคลว์ของฉันได้ค่อนข้างมากยกเว้นฉันจะเพิ่มไฟล์ธีมลงใน repo คอมไพล์เมื่อฉันสร้างเว็บไซต์ทดสอบ / ทดสอบ / โปรดักชั่น นอกจากนี้ผมโดยสิ้นเชิงแนะนำให้ใช้การโพสต์ได้รับเบ็ดบนเซิร์ฟเวอร์ระยะไกล, บันทึกการเข้าสู่ระบบและการทำคอมไพล์ดึง ฯลฯ
davemac

นั่นพร้อมกับนามแฝง SSH หมายความว่าฉันสามารถผลักดันไปยัง repo ธีมสดโดยใช้ 'git push live' ฯลฯ
davemac

ฉันไม่คุ้นเคยกับกระบวนการอัปเดตปลั๊กอินใน wordpress แต่จะเกิดอะไรขึ้นหากอัปเดตปลั๊กอินทำการเปลี่ยนแปลงฐานข้อมูล การเปลี่ยนแปลงในพื้นที่เหล่านั้นจะถูกผลักไปยังเซิร์ฟเวอร์ผลิตอย่างไร
ผู้ใช้

@ ผู้ใช้ที่อาจแตกต่างจากปลั๊กอินไปยังปลั๊กอิน Core wordpress ทำการตรวจสอบเวอร์ชั่นของ schema ดังนั้นหากคุณอัปเดต Wordpress โดยไม่ต้องใช้ตัวอัปเดตในตัวระบบจะทำการอัปเดตฐานข้อมูลแยกต่างหาก คำแนะนำของฉันคือถ้าคุณใช้ปลั๊กอินใด ๆ ที่เขียนไปยังฐานข้อมูลที่คุณตรวจสอบพื้นที่ผู้ดูแลระบบของ Wordpress เนื่องจากการจัดการสคีมามักจะมีการจัดการที่นั่นโดยไม่คำนึงถึงวิธีการปรับปรุงรหัสปลั๊กอิน
James Hebden

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"

และสุดท้ายไฟล์สภาพแวดล้อมตัวอย่าง (ถ้าคุณใช้อัญมณีหลายขั้นตอนคุณสามารถมีหนึ่งในสิ่งเหล่านี้สำหรับแต่ละขั้นตอนของสภาพแวดล้อมของคุณเช่นในพื้นที่การแสดงละครการผลิต)

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
หากคุณใช้ hooks post-receive git พวกเขาปฏิเสธความต้องการที่จะ ssh ในเซิร์ฟเวอร์ระยะไกลและทำ git pull
davemac

git post-receiveขอเป็นวิธีที่จะไป!
Brock Hensley

3
@ พบปัญหากับการขอรับโพสต์ว่าถ้าคุณมีโครงสร้างพื้นฐาน CI ที่ดีอยู่แล้วการรวมที่ไม่ถูกต้องเพียงครั้งเดียวสามารถทำให้ทั้งไซต์ของคุณพัง โอกาสในการเพิ่มขึ้นนี้ถ้าคุณกำลังทำงานในโครงการที่มีผู้พัฒนาหลายคนที่มีสิทธิ์เข้าถึง repo ของคุณ นั่นเป็นเหตุผลที่ฉันเองชอบติดตั้งผ่าน capistrano แทน แต่ฉันเห็นได้ว่าทำไมคนอื่นถึงไม่กังวลมาก
anu

คุณใช้ repo git ที่เปลือยเปล่าเพื่อให้ปัญหาการรวมไม่เกี่ยวข้อง
davemac

9

จริง ๆ แล้วฉันได้นำเสนอ WordCamp ในหัวข้อนี้ แทนที่จะทำซ้ำตัวเองนี่คือหน้าจอมันและนี่เป็นสคริปต์การใช้งานที่ง่ายมากที่จะมาพร้อมกับสิ่งที่ฉันพูดถึง

กล่าวโดยย่อคือฉันใช้ GitHub เพื่อโฮสต์ repo และใช้ webhook เพื่อปรับใช้การเปลี่ยนแปลงตามการอ้างอิง git สิ่งนี้ช่วยให้คุณใช้รูปแบบการแยกสาขาของ Vincent Driessenและเปิดให้คุณมี webheads แบบไม่ จำกัด เซิร์ฟเวอร์การทดสอบเซิร์ฟเวอร์ทดสอบ ฯลฯ ทุกอย่างพร้อมการปรับใช้แบบอัตโนมัติ ฉันยังครอบคลุมถึงการรักษา wp-config.php ภายใต้การควบคุมเวอร์ชันในขณะที่ยังคงรุ่น dev / การผลิตที่แยกจากกัน (โดยการเปลี่ยนชื่อไฟล์และ symlinking)


4

ฉันรู้ว่าคำถามนี้เก่ากว่าเล็กน้อย แต่เนื่องจากฉันไม่เห็นว่านี่เป็นคำตอบที่นี่ฉันต้องการแบ่งปันสิ่งที่ฉันทำตามปกติสำหรับการตั้งค่าและการปรับใช้ตามไซต์ git เดียวและมันทำงานได้ดีจริงๆด้วยการทำงานจากหลาย ๆ อุปกรณ์สถานที่และกับนักพัฒนาหลายคน (ทุกแห่งมี repos ในพื้นที่ของตัวเองพวกเขาทำงานเพราะมันเป็นเรื่องธรรมดาสำหรับคอมไพล์)

ฉันสามารถแนะนำการตั้งค่าต่อไปนี้อย่างอบอุ่น:

นอกจากนี้ยังมีการอธิบายไว้ใน (หากคุณต้องการทรัพยากรที่สองเพื่อห่อหัวของคุณรอบ ๆ มัน):

มันใช้งานได้ (โดยมี repos อย่างน้อยสาม) โดย:

  1. วางเว็บไซต์บนโฮสต์สดภายใต้คอมไพล์
  2. สร้างพื้นที่เก็บข้อมูล gitใหม่บนโฮสต์สด
  3. จากนั้นแยกจากที่เก็บเปลือยไปยัง repit git การพัฒนาท้องถิ่นของคุณ

เมื่องานเสร็จแล้วคุณจะต้องกดกับ repo เปลือยระยะไกลที่คุณลอกแบบมา repo เปล่ามี hooks ที่จะซิงค์กับ repo สด (ในรหัสด้านบนเรียกว่าprime )

ในฐานะที่เป็น Wordpress การตั้งค่าเฉพาะใน repo ฉันมีสิ่งนี้.gitignore:

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

ส่วนที่เหลือรวม การกำหนดค่าปลั๊กอินและธีมที่ฉันเก็บไว้ภายใต้การควบคุมเวอร์ชัน / การกำหนดค่า สิ่งนี้ช่วยให้ฉันติดตามการเปลี่ยนแปลงและตรวจสอบรหัสได้ง่ายก่อนใช้งานจริง ฉันสามารถผสานกับต้นไม้ระยะไกลได้ง่ายขึ้นด้วยการเปลี่ยนแปลงของฉันเอง ที่เป็นประโยชน์อย่างยิ่งกับหลัก Wordpress ซึ่งมีอยู่ใน Github

วิธีนี้ใช้ได้ผลดีสำหรับ Wordpress ของฉันส่วนใหญ่ Repo เปลือยป้องกันคุณจากการผลักดันการเปลี่ยนแปลงที่ขัดแย้ง นอกจากนี้ยังซิงค์กับสำเนาระยะไกลก่อนที่จะอัปเดตเว็บไซต์สด ซึ่งหมายความว่าการอัปเดตไซต์สดนั้นทำได้อย่างรวดเร็ว เพราะตะขอคุณยังสามารถเรียกตะขอ Wordpress update ได้หลังจากนั้นถ้าต้องการ

หากยังไม่ได้ทดลองว่าสามารถปรับปรุงได้มากเพียงใดด้วย Github hooks แต่โดยปกติฉันไม่ต้องการใช้เพราะรหัสอยู่ภายใต้การควบคุมเวอร์ชันท้องถิ่นไม่ใช่ Github

ในการตั้งค่าระบบดังกล่าวเป็นครั้งแรกคุณควรใช้เวลาสักครู่เพื่อประเมินว่าคุณมีเครื่องมือทั้งหมดที่มีในโฮสต์ระยะไกลของคุณหรือไม่:

  • การเข้าถึง SSH
  • GIT
  • ไดเรกทอรีส่วนตัวที่คุณสามารถวางไฟล์และไดเรกทอรีย่อยไว้ใน (เช่นสำหรับ repo git เปลือยของคุณ)

ควรตั้งค่าเวลาเป็นครั้งแรกภายในหนึ่งชั่วโมงรวม สภาพแวดล้อมทั้งหมดและคุณเผยแพร่การพุชครั้งแรก

ขึ้นอยู่กับโฮสต์ของคุณคุณอาจต้องการป้องกัน.gitไดเรกทอรีจากการเข้าถึงเว็บ นี่คือตัวอย่าง.htaccessโค้ดที่ทำให้ Wordpress อยู่ในไดเรกทอรีย่อยซึ่งทำให้มีพื้นที่ว่างใน 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]

ในระยะสั้นทุกอย่างที่ไม่อยู่ในไดเรกทอรีสาธารณะไม่ได้ออนไลน์ ภายในไดเรกทอรีสาธารณะสามารถเป็น codebase 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 เช่นเดียวกับการอัพโหลดไฟล์ฐานข้อมูลและ repo git นอกจากนี้สำหรับคำสั่งสำรองข้อมูลของฉันฉันอาจไม่เป็นไรอย่างสมบูรณ์แบบ แต่สิ่งเหล่านี้ใช้ได้สำหรับฉัน:

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 พวกเขาจำเป็นต้องเรียกใช้บนระบบที่เฉพาะเจาะจงดังนั้นโดยปกติคุณจะไม่มีในแอพพลิเคชั่น (เช่นแอปพลิเคชันสามารถลงไปได้ แต่คุณจำเป็นต้องทำงานเหล่านี้ต่อไป)

เปิดใช้งานสำหรับการทำงานเป็นทีม

ข้อดีอีกอย่างคือคุณเปิดใช้ไซต์ของคุณสำหรับการทำงานเป็นทีมอยู่แล้ว ต้องขอขอบคุณ repo เพิ่มเติมที่ทำให้คุณไม่สามารถทำผิดได้มากและคุณยังสามารถแบ่งปันสาขาระยะไกลได้นอกเหนือจากการเป็น Master หรือ Live Branch กับเพื่อนร่วมงานของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.