Apakah Git / GitHub solusi penyebaran WordPress yang baik?

67

Saat ini saya sedang mengembangkan WordPress saya secara lokal, melakukan kode saya ke GitHub dengan Git dan kemudian SSHing ke server saya dan melakukan "git pull" untuk memperbarui kode saya. Apakah ini pilihan yang baik untuk penyebaran kode ke situs WordPress (saya jelas memiliki akses tingkat root ke server saya dalam kasus ini.) Saya tahu hal-hal seperti Capistrano, tetapi apakah itu terlalu banyak untuk penyebaran ke situs WordPress? Bagaimana saya bisa memaksimalkan Git / GitHub dalam hal ini?

Mat
sumber
Saya menggunakan deployhq.com dan sangat menyukai fitur yang mereka tawarkan. Ini adalah layanan berbayar, tetapi menurut saya harganya masuk akal. Jika Anda kebetulan meng-host dengan WP Engine (saya lakukan) mereka baru-baru ini meluncurkan fitur push git: git.wpengine.com .
dwenaus

Jawaban:

60

Saya menggunakan git untuk ini dan ternyata berfungsi dengan sangat baik. Beberapa saran:

  • Tambahkan direktori upload Anda (wp-content / upload) direktori ke .gitignorefile Anda .
  • Jalankan server web dan server database pada sistem pengembangan Anda sehingga Anda dapat menguji perubahan secara lokal sebelum mendorongnya ke produksi.
  • Pertahankan pengaturan koneksi database Anda secara konsisten antara dan prod, atau tambahkan wp-config.php ke .gitignorefile Anda untuk mencegah pengaturan pengembangan wordpress Anda menimpa yang produksi Anda.
  • Hindari memperbarui plugin pada sistem produksi Anda menggunakan antarmuka admin dari Wordpress - karena paling baik, salinan git Anda akan menimpa plugin yang Anda perbarui segera setelah Anda menekan / checkout, paling buruk Anda akan mendapatkan konflik. Lakukan pembaruan Anda menggunakan antarmuka admin pada sistem pengembangan Anda, komit, dorong dan checkout dalam produksi.
  • Pertimbangkan untuk menambahkan git post-receivehook untuk checkout pembaruan Anda secara otomatis ke direktori yang Anda gunakan untuk mempublikasikan wordpress melalui server web Anda (misalnya /var/www). Ini memungkinkan Anda untuk hanya memeriksa file sendiri, menghindari metadata git yang menemukan jalan masuk ke root dokumen server web Anda, dan juga berarti Anda dapat menambahkan perubahan izin apa pun ke dalam kiriman pasca-terima sehingga izin Anda tetap konsisten setiap saat. Contohnya termasuk di bawah ini:

    #!/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
James Hebden
sumber
Apakah backtick muncul setelah unset GIT_INDEX_FILEsalah ketik?
Weston Ruter
James telah cukup banyak meringkas worfklow saya, kecuali saya hanya menambahkan file tema ke repo git setelah saya memiliki situs pementasan / pengujian / produksi didirikan. Saya juga sangat merekomendasikan menggunakan post-
accept
Itu, bersama dengan alias SSH berarti saya dapat mendorong ke repo tema langsung menggunakan 'git push live' dll
davemac
Saya tidak terbiasa dengan proses pembaruan plugin di wordpress tetapi apa yang terjadi jika pembaruan plugin membuat perubahan pada database? Bagaimana perubahan lokal itu akan didorong ke server produksi?
Pengguna
@ Pengguna yang akan bervariasi dari satu plugin ke plugin lainnya. Core Wordpress memeriksa versi skema, jadi jika Anda memperbarui Wordpress tanpa menggunakan pembaru bawaan, ia akan melakukan pembaruan DB secara terpisah. Saran saya adalah jika Anda menggunakan plugin apa pun yang menulis ke DB, Anda memeriksa area admin Wordpress, karena pembaruan skema biasanya ditangani di sana terlepas dari bagaimana Anda memperbarui kode plugin.
James Hebden
22

Saya akan sangat menyarankan pengaturan Capistrano - ini adalah sedikit pekerjaan dimuka pertama kali, tetapi setelah itu Anda dapat dengan mudah menggunakannya untuk pengaturan baru.

Keuntungan utamanya adalah

  • dapat digunakan dari desktop Anda. Ini mungkin kedengarannya tidak banyak, tetapi ssh-ing ke server jauh Anda, dan melakukan git pull masih menyebalkan.
  • kembalikan mudah ke versi sebelumnya jika perlu
  • mampu melakukan hal-hal keren seperti pemasangan pengaturan ke lingkungan pementasan / produksi.

Saya menambahkan satu set script capistrano untuk menunjukkan kepada Anda bagaimana saya mengatur semuanya.

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 [email protected]: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"

dan akhirnya, file lingkungan sampel (jika Anda menggunakan permata multistage, maka Anda dapat memiliki salah satunya untuk setiap tahap lingkungan Anda, misalnya lokal, pementasan, produksi)

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

File-file ini mungkin tidak berfungsi tanpa mengutak-atik, dan Anda akan membutuhkan pengetahuan dasar Capistrano, tetapi mudah-mudahan akan membantu beberapa orang.

Ini adalah tutorial pertama yang saya gunakan untuk membuat saya menggunakan Capistrano dan WordPress: http://theme.fm/2011/08/tutorial-deploying-wordpress-with-capistrano-2082/

anu
sumber
2
Jika Anda menggunakan kait git post-accept, mereka meniadakan kebutuhan untuk ssh ke server jauh dan melakukan tarikan git
davemac
git post-receivekait adalah cara untuk pergi!
Brock Hensley
3
@dirt masalah dengan kait pasca-terima adalah bahwa kecuali Anda memiliki infrastruktur CI yang layak, satu penggabungan yang salah dapat menurunkan seluruh situs Anda. Kemungkinan ini meningkat jika Anda mengerjakan proyek dengan banyak pengembang yang memiliki akses komit ke repo Anda. Itu sebabnya saya, secara pribadi, suka menggunakan via capistrano, tetapi saya bisa melihat mengapa orang lain mungkin tidak terlalu mengkhawatirkannya.
anu
Anda menggunakan repo telanjang git sehingga masalah penggabungan tidak relevan
davemac
9

Saya benar-benar melakukan presentasi WordCamp tentang topik ini. Daripada mengulangi diri saya sendiri, inilah screencast-nya dan inilah skrip penerapan yang sangat sederhana untuk menemani apa yang saya diskusikan.

Singkatnya, saya menggunakan GitHub untuk meng-host repo, dan menggunakan webhook untuk menyebarkan perubahan berdasarkan pada git ref. Ini memungkinkan Anda untuk menggunakan model percabangan git Vincent Driessen dan membuka Anda hingga memiliki webhead tanpa batas, server pentas, server pengujian, dll., Semuanya dengan penyebaran otomatis. Saya juga mencakup menjaga wp-config.php di bawah kontrol versi sambil mempertahankan versi dev / produksi yang terpisah (dengan mengganti nama file dan symlinking).

Matthew Boynes
sumber
4

Saya tahu pertanyaan ini sedikit lebih tua tetapi karena saya belum melihat ini sebagai jawaban di sini, saya ingin berbagi apa yang biasanya saya lakukan untuk setup dan penyebaran berbasis git situs tunggal dan itu bekerja dengan sangat baik, juga dengan bekerja dari banyak perangkat, lokasi, dan dengan banyak pengembang (semua memiliki repo lokal mereka sendiri, mereka beroperasi seperti biasa untuk git).

Saya dengan hangat menyarankan pengaturan berikut:

Ini juga diuraikan dalam (jika Anda membutuhkan sumber daya kedua untuk membungkus kepala Anda di sekitarnya):

Ini pada dasarnya bekerja (dengan setidaknya tiga repo) oleh:

  1. menempatkan situs web di live-host di bawah git,
  2. buat repositori bare git baru di host langsung.
  3. Dan kemudian bercabang dari repositori kosong ke repositori git pengembangan lokal Anda.

Ketika pekerjaan selesai Anda mendorong repo telanjang yang Anda kloning. Repo telanjang memiliki kait untuk disinkronkan dengan repo langsung (dalam kode di atas disebut prime ).

Sebagai pengaturan khusus Wordpress di repo saya punya ini .gitignore:

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

Sisanya termasuk. plugin dan konfigurasi tema saya simpan di bawah kontrol versi / konfigurasi. Ini memungkinkan saya untuk dengan mudah melacak perubahan dan meninjau kode sebelum menggunakannya secara langsung. Saya juga bisa lebih mudah bergabung dengan pohon jarak jauh dengan perubahan saya sendiri. Itu sangat berguna terhadap inti Wordpress yang tersedia di Github .

Ini berfungsi cukup baik untuk sebagian besar kebutuhan Wordpress saya. Repo kosong mencegah Anda mendorong perubahan yang bertentangan. Ini juga disinkronkan ke salinan jarak jauh terlebih dahulu sebelum memperbarui situs langsung. Itu berarti, memperbarui situs langsung biasanya cukup cepat. Karena kait, Anda bahkan dapat menghubungi kait pembaruan Wordpress sesudahnya jika mau.

Jika belum bereksperimen berapa banyak ini dapat ditingkatkan dengan kait Github, tapi saya biasanya tidak membutuhkannya karena kode berada di bawah kontrol versi lokal, bukan Github.

Untuk mengatur sistem seperti itu untuk pertama kalinya, Anda harus meluangkan waktu untuk mengevaluasi jika Anda memiliki semua alat yang tersedia di host jarak jauh Anda:

  • Akses SSH
  • GIT
  • Direktori pribadi tempat Anda memasukkan file dan sub-direktori (mis. Untuk repo telanjang Anda)

Waktu setup untuk pertama kalinya harus mungkin dalam satu dua jam termasuk. seluruh lingkungan dan Anda pertama kali mempublikasikan push.

Tergantung pada host Anda, Anda mungkin juga ingin melindungi .gitdirektori dari akses web. Berikut adalah beberapa contoh .htaccesskode yang bahkan menempatkan Wordpress di dalam sub-direktori, yang membuat ruang dalam repo tidak dipublikasikan secara online (berguna):

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]

Singkatnya, semua yang tidak ada di dalam direktori publik tidak online. Di dalam direktori publik dapat berupa basis kode wordpress misalnya, untuk .htaccessitu Anda memerlukannya:

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

Ini mencegah akses langsung ke publik . Bagian dari .htaccess -foo ini dapat Anda temukan diuraikan di sini: Permintaan untuk .htaccess harus mengembalikan 404 alih-alih 403 . Untuk variabel lingkungan, Anda perlu menguji apakah itu berfungsi di lingkungan Anda. Anda juga perlu memutuskan apakah Anda meletakkannya di bawah kontrol versi atau tidak.

Jika Anda memiliki kontrol lebih besar pada hosting, Anda dapat melakukan lebih banyak hal di sini (dan berbeda / lebih dioptimalkan), contoh di atas ditargetkan untuk lingkungan shared hosting yang umum (yang menawarkan GIT, beberapa pengguna mengatakan Anda dapat dengan mudah menginstalnya sendiri sebagai baik, saya biasanya meminta hoster saya untuk menyediakan seperti itu karena saya lebih suka jika mereka menjaga itulah yang saya bayar untuk mereka).

Di sisi negatif, ini memiliki beberapa masalah umum yang juga dijabarkan dalam jawaban lainnya. Satu hal yang saya tidak banggakan tetapi yang berhasil adalah memberi host pengembangan perubahan ke file host itu untuk memiliki titik server database ke salinan pengembangan. Jadi, Anda dapat menyimpan satu konfigurasi basis data. Tidak benar-benar keren esp. karena kredensial.

Cadangan Otomatis

Namun saya biasanya tidak terlalu peduli di sini tetapi sebagai gantinya memiliki cadangan harian dijalankan pada sistem jarak jauh yang secara bertahap disimpan di lokasi lain yang jauh. Itu mudah dan murah dan memungkinkan Anda untuk memulihkan baik instalasi Wordpress maupun file-upload, database dan repo git. Juga untuk perintah cadangan saya, saya mungkin tidak sepenuhnya baik-baik saja, tetapi itu berfungsi untuk saya:

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

Apa yang saya sarankan di sini adalah bahwa Anda menjaga proses di sekitar instalasi Wordpress Anda dari Wordpress. Mereka perlu dijalankan pada sistem tertentu, sehingga Anda biasanya tidak memilikinya di dalam aplikasi (mis. Aplikasi bisa turun tetapi Anda harus terus menjalankannya).

Diaktifkan untuk Kerja Tim

Manfaat bagus lainnya adalah situs Anda sudah diaktifkan untuk kerja tim. Berkat repo bare tambahan Anda tidak bisa berbuat banyak salah dan Anda bahkan dapat berbagi cabang jarak jauh selain dari master atau cabang langsung dengan kolega Anda.

hakre
sumber