Este Git/GitHub o soluție bună pentru implementarea WordPress?

25 ian. 2013, 05:39:09
Vizualizări: 37.5K
Voturi: 69

În prezent îmi dezvolt WordPress-ul local, fac commit la cod pe GitHub cu Git și apoi mă conectez prin SSH pe server și execut un "git pull" pentru a actualiza codul. Este aceasta o opțiune bună pentru implementarea codului pe un site WordPress (evident, în acest caz am acces root la server)? Știu de unelte precum Capistrano, dar ar fi exagerat să le folosesc pentru implementarea unui site WordPress? Cum pot profita la maximum de Git/GitHub în acest caz?

2
Comentarii

Eu folosesc http://www.deployhq.com/ și îmi plac foarte mult funcționalitățile pe care le oferă. Este un serviciu plătit, dar consider că prețul este rezonabil. Dacă întâmplător folosești WP Engine pentru hosting (eu da), ei au lansat recent o funcție de git push: http://git.wpengine.com/.

dwenaus dwenaus
5 feb. 2013 11:46:10

Cum gestionați acest caz de utilizare? Ați făcut unele personalizări în WordPress, în directorul de teme WordPress și ați modificat unele setări într-un plugin (acel plugin stochează setările în baza de date). În felul acesta, am instalat multe astfel de plugin-uri și am făcut modificări de setări pe localhost, acum fără a repeta modificările de setări ale plugin-ului cum pot să le configurez pe serverul de hosting. Cea mai mare provocare este că serverul dvs. de hosting are 1000 de articole de blog care sunt live. Fără a pierde aceste conținuturi, cum veți implementa WordPress-ul de pe localhost pe serverul live.

indianwebdevil indianwebdevil
14 iun. 2022 19:58:38
Toate răspunsurile la întrebare 4
6
64

Folosesc git pentru acest lucru și consider că funcționează foarte bine. Câteva sugestii:

  • Adaugă directorul tău de uploads (wp-content/uploads) în fișierul tău .gitignore.
  • Rulează un server web și un server de baze de date pe sistemul tău de dezvoltare pentru a putea testa modificările local înainte de a le trimite în producție.
  • Păstrează setările de conexiune la baza de date consistente între mediile de dezvoltare și producție, sau adaugă wp-config.php în fișierul tău .gitignore pentru a preveni suprascrierea setărilor WordPress de producție cu cele de dezvoltare.
  • Evită actualizarea pluginurilor pe sistemul de producție folosind interfața de administrare WordPress - în cel mai bun caz, copia ta git va suprascrie orice plugin actualizat imediat ce faci push/checkout, în cel mai rău caz vei avea conflicte. Actualizează pluginurile folosind interfața de administrare pe sistemul de dezvoltare, comită, trimite (push) și verifică (checkout) în producție.
  • Ia în considerare adăugarea unui hook git post-receive pentru a verifica automat actualizările în directorul pe care îl folosești pentru a publica WordPress prin serverul tău web (de exemplu /var/www). Acest lucru îți permite să verifici doar fișierele în sine, evitând ca metadatele git să ajungă în directorul rădăcină al serverului tău web și, de asemenea, înseamnă că poți adăuga orice modificări de permisiuni în hook-ul post-receive astfel încât permisiunile să rămână consistente de fiecare dată. Mai jos este inclus un exemplu:

    #!/bin/sh
    unset GIT_INDEX_FILE
    # directorul din care serverul tău web servește WordPress
    export GIT_WORK_TREE=/var/www/example.com/
    # directorul local în care se află repository-ul tău git remote
    export GIT_DIR=/home/git/repos/example.com.git/
    # utilizatorul de mai jos este pentru Debian - vei dori utilizatorul și grupul pe care le folosește serverul tău web
    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
    
26 ian. 2013 13:20:11
Comentarii

Este backtick-ul care apare după unset GIT_INDEX_FILE o greșeală de tipar?

Weston Ruter Weston Ruter
30 ian. 2013 00:44:37

James a rezumat destul de bine fluxul meu de lucru, cu excepția faptului că adaug fișierele temei în repository-ul git doar după ce am stabilit site-ul de staging/test/producție.

De asemenea, recomand cu totul utilizarea unui hook post-receive pe serverul remote, ceea ce elimină necesitatea de a te conecta și de a face un git pull etc.

davemac davemac
4 feb. 2013 09:54:51

Asta, împreună cu alias-urile SSH, înseamnă că pot face push către repository-ul temei live folosind 'git push live' etc

davemac davemac
4 feb. 2013 10:00:56

Nu sunt familiarizat cu procesul de actualizare a pluginurilor în WordPress, dar ce se întâmplă dacă actualizarea unui plugin face modificări în baza de date? Cum vor fi transmise acele modificări locale către serverul de producție?

User User
13 iun. 2014 08:21:28

@User asta ar varia de la plugin la plugin. WordPress-ul de bază verifică versiunile schemei, deci dacă actualizezi WordPress fără a folosi actualizatorul integrat, va face actualizările bazei de date separat. Sfatul meu ar fi că, dacă folosești orice pluginuri care scriu în baza de date, să verifici zona de administrare din WordPress, deoarece actualizările schemei sunt de obicei gestionate acolo, indiferent de modul în care actualizezi codul pluginului.

User User
13 iun. 2014 09:30:29

Pe măsură ce învăț și eu acest lucru, am inclus în repo doar tema mea activă și pluginurile personalizate. Întrebarea despre ce se întâmplă când un plugin de pe site se actualizează, dar apoi îl suprascrii cu un pull este motivul pentru care am adăugat în .gitignore toate pluginurile, cu excepția celor personalizate. De asemenea, am adăugat în .gitignore și fișierele încărcate, deoarece fișierele media de pe mașina mea de dezvoltare nu sunt neapărat aceleași ca pe serverul de producție. O problemă mai mare pe care vreau să o aduc în discuție este că GIT nu ar trebui să fie același lucru cu o operațiune de backup-restaurare. Sunt două operațiuni foarte diferite. Git nu ar trebui să fie soluția ta de backup-restaurare.

TARKUS TARKUS
28 feb. 2021 21:30:41
Arată celelalte 1 comentarii
4
22

Vă recomand cu căldură să configurați Capistrano - necesită puțin efort inițial prima dată, dar după aceea îl puteți folosi cu ușurință pentru noi setări.

Principalele avantaje sunt

  • posibilitatea de a face deploy direct de pe desktop. Poate nu pare mult, dar a vă conecta prin SSH la serverul remote și a face un git pull este în continuare o corvoadă.
  • revenirea ușoară la o versiune anterioară dacă este necesar
  • posibilitatea de a face lucruri interesante, cum ar fi configurarea deploy-ului pentru medii de staging/producție.

Adaug un set de scripturi Capistrano pentru a vă arăta cum am configurat eu lucrurile.

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, "" # numele aplicației tale - folosit pentru a seta numele directorului

set :scm, :git
set :repository, "" # folosește linia de acces SSH la repo pe care o obții de la provider, ex. git@github.com:nume/repo.git
set :deploy_to, "/var/www/#{application}" #acesta este folderul rădăcină al site-ului pe serverul remote
set :deploy_via, :remote_cache # obține direct din repo
set :copy_exclude, [".git", ".DS_Store", ".gitignore", ".gitmodules", "wp-config.php"]

# face ca capistrano să ceară parola sudo sau alte input-uri remote
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"

și în final, un fișier exemplu pentru mediu (dacă folosești gem-ul multistage, poți avea câte unul din acestea pentru fiecare stadiu al mediului tău, ex. local, staging, producție)

config/local.rb

server "", :app  #numele gazdei
set :branch, 'develop' #alege ramura pentru deploy
set :use_sudo, false #nu folosi sudo

set :deploy_to, "/var/www/#{application}" #suprascrie calea implicită pentru deploy

Aceste fișiere s-ar putea să nu funcționeze fără ajustări și vei avea nevoie de cunoștințe de bază despre Capistrano, dar sper că vor ajuta unele persoane.

Acesta a fost primul tutorial pe care l-am folosit pentru a începe cu Capistrano și WordPress: http://theme.fm/2011/08/tutorial-deploying-wordpress-with-capistrano-2082/

26 ian. 2013 14:05:48
Comentarii

Dacă folosești hook-uri git post-receive, ele elimină necesitatea de a te conecta prin SSH pe serverul remote și de a face un git pull

davemac davemac
4 feb. 2013 09:57:24

git post-receive hook este soluția recomandată!

Brock Hensley Brock Hensley
14 mai 2013 04:07:35

@dirt problema cu hook-ul post-receive este că, dacă nu ai o infrastructură CI adecvată, o singură îmbinare incorectă poate duce la căderea întregului site. Probabilitatea acestui lucru crește dacă lucrezi la un proiect cu mai mulți developeri care au acces de commit în repo-ul tău. De aceea, personal, prefer să fac deploy folosind capistrano, dar înțeleg de ce alții ar putea nu fi atât de îngrijorați de acest aspect.

anu anu
14 mai 2013 09:53:52

Folosești un depozit git gol, deci problema de îmbinare nu este relevantă

davemac davemac
2 aug. 2013 15:07:26
0

De fapt, am ţinut o prezentare la WordCamp pe această temă. În loc să mă repet, aici este un screencast al prezentării şi aici este un script foarte simplu de implementare care însoţeşte ceea ce am discutat.

Pe scurt, folosesc GitHub pentru a găzdui repository-ul şi utilizez un webhook pentru a implementa modificările bazate pe referinţa git. Acest lucru vă permite să utilizaţi modelul de ramificare git al lui Vincent Driessen şi vă deschide posibilitatea de a avea un număr nelimitat de webheads, servere de staging, servere de testare etc., toate cu implementare automată. De asemenea, acoperă păstrarea fişierului wp-config.php sub controlul versiunilor, menţinând în acelaşi timp versiuni separate pentru dezvoltare/producţie (prin redenumirea fişierelor şi folosirea symlink-urilor).

20 feb. 2013 19:39:22
0

Știu că această întrebare este puțin mai veche, dar deoarece nu am văzut acest răspuns aici, aș dori să împărtășesc ceea ce fac în mod normal pentru configurațiile și implementările bazate pe git pentru un singur site și funcționează foarte bine, chiar și atunci când lucrez de pe mai multe dispozitive, locații și cu mai mulți dezvoltatori (toți având propriile depozite locale în care operează, așa cum este obișnuit pentru git).

Pot recomanda cu căldură următoarea configurație:

Este, de asemenea, prezentat în (dacă aveți nevoie de o a doua sursă pentru a înțelege mai bine):

Practic, funcționează (cu cel puțin trei depozite) prin:

  1. plasarea site-ului web pe gazda live sub git,
  2. crearea unui nou depozit gol git pe gazda live.
  3. Și apoi bifurcați din depozitul gol către depozitul local de dezvoltare git.

Când munca este gata, faceți push către depozitul gol de la care ați clonat. Depozitul gol are hook-uri pentru a se sincroniza cu depozitul live (în codurile de mai sus numit prime).

Ca setări specifice Wordpress în depozit, am acest .gitignore:

# fișierele încărcate sunt date, excluse din arborele sursă
wp-content/uploads/

Restul, inclusiv configurația plugin-urilor și a temelor, le păstrez sub controlul versiunilor/configurației. Acest lucru îmi permite să urmăresc cu ușurință modificările și să revizuiesc codul înainte de a-l folosi live. Pot, de asemenea, să fac merge mai ușor cu copii remote cu modificările mele. Acest lucru este util în special pentru nucleul Wordpress, care este disponibil pe Github.

Această metodă funcționează foarte bine pentru majoritatea nevoilor mele legate de Wordpress. Depozitul gol vă împiedică să faceți push la modificări conflictuale. De asemenea, se sincronizează mai întâi cu o copie remote înainte de a actualiza site-ul live. Asta înseamnă că actualizarea site-ului live este de obicei destul de rapidă. Datorită hook-urilor, puteți chiar să apelați hook-uri de actualizare Wordpress după aceea, dacă doriți.

Nu am experimentat cât de mult poate fi îmbunătățit acest lucru cu hook-urile Github, dar în mod normal nu am nevoie de ele, deoarece codul este sub controlul versiunilor local, nu pe Github.

Pentru a configura un astfel de sistem pentru prima dată, ar trebui să vă luați un timp pentru a evalua dacă aveți toate instrumentele disponibile pe gazda remote:

  • Acces SSH
  • GIT
  • Un director privat în care puteți pune fișiere și subdirectoare (de exemplu, pentru depozitul gol git)

Timpul de configurare pentru prima dată ar trebui să fie posibil în una sau două ore, inclusiv întregul mediu și primul push publicat.

În funcție de gazdă, ați putea dori, de asemenea, să protejați directorul .git de accesul web. Iată un exemplu de cod .htaccess care face acest lucru chiar și atunci când Wordpress este plasat într-un subdirector, ceea ce lasă spațiu în depozit care nu este publicat online (util):

Options -Indexes

# corectează slash-ul final pentru .git / face să dispară + .gitignore și fișiere similare.
RedirectMatch 404 ^/\.git(.*)$

# maschează 403 pe .ht* ca 404
<Files ~ "^\.ht">
  Order Deny,Allow
  Allow from all
  Satisfy All
  Redirect 404 /
</Files>

RewriteEngine On
RewriteBase /

# mapează totul în public și setează variabila de mediu
# pentru a marca cererea ca fiind validă
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule ^(.*)$ /public/$1 [E=sitealias:set,L]

Pe scurt, tot ce nu este în directorul public nu este online. În directorul public poate fi, de exemplu, codul Wordpress, iar pentru .htaccess acolo aveți nevoie de:

RewriteEngine On
# maschează ca 404 dacă este accesat direct
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule .* - [L,R=404]

Acest lucru previne accesul direct la public. O parte din acest .htaccess-foo o puteți găsi prezentată aici: Cererile către .htaccess ar trebui să returneze 404 în loc de 403. Pentru variabilele de mediu, trebuie să testați dacă funcționează în mediul dumneavoastră. De asemenea, trebuie să decideți dacă puneți asta sub controlul versiunilor sau nu.

Dacă aveți mai mult control asupra gazdării, puteți face mai multe lucruri aici (și diferit / mai optimizat), exemplele de mai sus sunt destinate pentru medii tipice de găzduire partajată (care oferă GIT, unii utilizatori spun că îl puteți instala și singur, eu în mod normal îi cer furnizorilor mei să ofere astfel de servicii pentru că prefer să aibă ei grijă de asta, pentru asta îi plătesc).

Pe partea negativă, acest lucru are unele dintre problemele comune prezentate și în celelalte răspunsuri. Un lucru de care nu sunt mândru, dar care funcționează, este să ofer gazdei de dezvoltare o modificare a fișierului său de gazde pentru a direcționa serverul de baze de date către copia de dezvoltare. Astfel, puteți păstra o singură configurație de bază de date. Nu este chiar cool, mai ales din cauza credențialelor.

Backup-uri automate

Totuși, în mod normal nu mă preocup prea mult aici, ci în schimb am backup-uri zilnice care rulează pe sistemele remote, care sunt incrementale și care sunt stocate apoi într-o altă locație remote. Asta este ușor și ieftin și vă permite să restaurați atât instalarea Wordpress, cât și fișierele încărcate, baza de date și depozitul git. De asemenea, pentru comenzile mele de backup s-ar putea să nu fie perfect corecte, dar acestea funcționează pentru mine:

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

Ceea ce sugerez aici este să păstrați procesele din jurul instalării Wordpress în afara Wordpress. Ele trebuie să ruleze pe un sistem specific, așa că în mod normal nu le aveți în interiorul aplicației (de exemplu, aplicația poate cădea, dar trebuie ca acestea să continue să funcționeze).

Pregătit pentru lucrul în echipă

Un alt beneficiu frumos este că site-ul dumneavoastră este deja pregătit pentru lucrul în echipă. Datorită depozitului gol suplimentar, nu puteți face prea multe greșeli și puteți chiar să partajați ramuri remote în afară de ramura master sau live cu colegii dumneavoastră.

23 mai 2013 13:33:53