Configurarea unui mediu de etapizare

Este o practică obișnuită de a lucra la nivel local pe un proiect și de a împinge revizuiri la un server de producție, dar pasul pe care oamenii îl ignoră este serverul de așteptare. Un server de așteptare este un amestec între producție și dezvoltare; puteți încerca aplicația ca și cum ar fi fost în producție. Să examinăm câteva dintre problemele pe care trebuie să le luați în considerare, precum și pașii necesari pentru replicarea unei platforme de producție ca serviciu (PAAS).

Sa întâmplat de mai multe ori: împing o revizuire a aplicației mele în producție, doar pentru a găsi o problemă după ce este publică. Aceste probleme pot fi la fel de simple ca și uitarea adăugării de imagini la depozitul dvs. sau ar putea fi la fel de mari ca modificarea structurii bazei de date locale și uitarea actualizării bazei de date de producție. Problemele se întâmplă tuturor, mai ales atunci când ați depășit termenele limită. În aceste situații, este o idee inteligentă de a configura un mediu de așteptare. Ideea este să aveți un server care replică îndeaproape mediul de producție, pentru a testa aplicația înainte de publicare.

Mediile de mediere nu numai că prind erorile umane, ci și problemele legate de software.

Puteți găsi și remedia aceste probleme, deoarece zona de așteptare are același software ca și mediul dvs. de producție. Acest lucru este în contrast puternic cu mașina dvs. locală, unde puteți avea versiuni diferite de software instalate (de ex., PHP 5.3 vs PHP 5.4) sau chiar caracteristici diferite. Am impins codul care conținea apeluri file_get_contents doar pentru a găsi că serverul de producție nu a suportat această funcție.

Deci, cum faceți să stabiliți un server în așteptare? Ei bine, primul pas este o mică recunoaștere.


Este totul în detalii (în mare parte)

Problemele se întâmplă tuturor, mai ales atunci când ați depășit termenele limită.

Crearea unui mediu de așteptare este specific mediului de producție. Nu există o soluție magică care să funcționeze în orice situație. Dar cele mai multe cazuri urmează un model similar și voi acoperi toate punctele cheie pe măsură ce mergem împreună.

Este corect să presupunem că majoritatea oamenilor își implementează aplicațiile cu un instrument de tipărire (cum ar fi GIT). Pe șansa ciudată de a lucra la un proiect vechi care folosește în continuare FTP, site-urile precum ftploy.com sau deployHQ.com pot acționa ca un tampon între GIT și serverul tău. Jeffrey Way a reunit un videoclip informativ care detaliază modul în care se stabilește acest lucru.

Pe lângă GIT, trebuie să vă gândiți la limbile, software-ul și caracteristicile "speciale" oferite de serverele dvs. de producție. Folosesc un PAAS bazat pe PHP, numit Fortrabbit, pentru că oferă suport PHP, Apache și GIT la zi. Acestea oferă, de asemenea, posibilitatea de a adăuga un cuvânt cheie în mesajul de comitere GIT care declanșează compozitorul pentru a instala dependențele proiectului.

Acesta este sistemul pe care îl voi configura în restul acestui articol. Setul său standard de caracteristici, precum și caracteristica specială a compozitorului, fac Fortrabbit perfect pentru o mare varietate de gazde. Amintiți-vă: aceasta nu este o soluție magică, dar pașii implicați urmează același model pe care l-ați folosi pentru a configura un mediu de așteptare pentru majoritatea proiectelor. Adaptați procesul la nevoile dvs. specifice.

Așa că, fără să mai vorbim, să intrăm.


Crearea serverului

Crearea unui mediu de așteptare este specific mediului de producție.

Există multe sisteme de operare diferite pe care le puteți rula pe un server. Fortrabbit rulează Debian Squeeze pe serverele lor și, din moment ce încercăm să le potrivim, am decis să o rulez și ei.

Voi folosi Vagrant pentru a stabili acest lucru. Nu vă faceți griji dacă nu ați folosit niciodată Vagrant; nu vom face nimic avansat. Asigurați-vă că aveți instalat VirtualBox și Vagrant (Vagrant este un CLI pentru VirtualBox, deci este necesar VirtualBox).

Vagrantul obține un instantaneu virtual al unui sistem de operare ca "casetă" de bază și apoi puteți crea mai multe VM din acea imagine. În primul rând, trebuie să descărcați caseta de bază pentru Debian Squeeze. Nu sunt sigur exact de unde provine copia mea, așa că am încărcat-o la DropBox pentru a descărca și utiliza. Pentru a instala, deschideți o fereastră terminal și tastați:

 caseta de vagare adăugați debian https://dl.dropbox.com/u/30949096/debian.box

Aceasta adaugă caseta la Vagrant cu numele "debian". Acum putem crea o instanță a acestei casete pentru zona noastră de așteptare. Mai întâi, să creăm un nou dosar:

 mkdir ~ / staging_server cd ~ / staging_server

Apoi, creați fișierul de configurare Vagrant tastând:

 vagrant init debian

Acest lucru creează un fișier de configurare, numit "VagrantFile", care conține toate setările pentru serverul dvs. Arată destul de aglomerat când îl deschideți, dar majoritatea liniilor sunt comentarii. Trebuie doar să dezactivați linia care spune: config.vm.network: prin punte. Ștergerea tuturor celorlalte comentarii vă lasă un fișier care arată astfel:

 Vagrant :: Config.run do | config | config.vm.box = "debian" config.vm.network: capăt de legătură

Aceste opțiuni îi spun lui Vagrant să creeze o nouă mașină virtuală bazată pe caseta de bază Debian Squeeze. Apoi, setează modul de rețea la "punte". Un VM cu o rețea de bridge a apărut ca o nouă mașină fizică la routerul dvs., astfel că își însușește automat propria adresă IP. Acest lucru vă permite să accesați mașina de pe orice dispozitiv din rețea (posibil în afara rețelei dvs., dacă vă configurați ruterul).

Acum, putem lansa VM cu comanda: "vagrant sus" (fără ghilimele).

Ar trebui să vedeți ieșirea de la Vagrant creând VM. Dacă computerul dvs. are mai multe rețele NIC conectate la rețea, Vagrant vă va solicita să selectați NIC pentru a trece la punte.

Vom utiliza SSH pentru a vă conecta, dar va trebui să folosim programul Vagrant încorporat "vagrant ssh"În conformitate cu cele mai bune practici ale Vagrantului, toate casetele ar trebui să aibă un utilizator numit" vagrant "cu parola, atât pentru rădăcină, cât și pentru vagrant," vagrant ". sudo utilizator care nu are nevoie să introducă o parolă, astfel încât să puteți utiliza direct sudo comenzi.

Să mergem mai departe și să setăm software-ul serverului.


Software-ul

Configurația Fortrabbit include:

  • Apache 2.2
  • PHP 5.4
  • Compozitor

În plus, ei folosesc repozitoriul dotdeb pentru a instala cea mai mare parte a acestuia. Pentru cei necunoscuți, dotdeb este un proiect al lui Guillaume Plessis care instalează cele mai actualizate versiuni ale pachetelor populare de servere web.

Suntem gata să începem. Asigurați-vă că fereastra terminalului este deschisă și conectată la server prin SSH. Mai întâi, adăugați repo-ul dotdeb la APT (managerul de pachete) adăugând un fișier nou la sources.d director:

 sudo vim /etc/apt/sources.list.d/dotdeb.list

Aceasta deschide un nou fișier numit dotdeb.list în vim (un editor de text). Numele nu este important deoarece toate fișierele din acest director sunt citite în APT. Trebuie să adăugăm patru linii la acest fișier. Dacă nu ați utilizat VIM, introduceți doar "eu"pentru a intra în modul de inserare și copiați / inserați următoarele patru linii:

 deb http://packages.dotdeb.org squeeze toate deb-src http://packages.dotdeb.org squeeze toate deb http://packages.dotdeb.org squeeze-php54 toate deb-src http: //packages.dotdeb .org squeeze-php54 toate

Pentru a salva, apăsați pe Esc cheie și tip : wq. Aceasta este comanda de a scrie și de a renunța, ceea ce înseamnă, în principiu, salvarea și ieșirea.

Apăsând pe Enter salvează fișierul și vă întoarce la linia de comandă.

Acum am adăugat repo-urile, dar mai trebuie să adăugăm semnătura înainte de a le putea folosi. Introduceți următoarele pentru a adăuga cheia GNU:

 curl http://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -

Aceasta descarcă cheia dotdeb și o adaugă ca sursă semnată. Acum actualizați APT pentru a trage pachetul nou tastând:

 sudo apt-get update

Acest lucru poate dura un minut sau cam asa ceva, dar veti avea toate pachetele dotdeb enumerate in APT cand acesta va termina. Din cauza modului în care este setat dotdeb și modul în care sunt încărcate dependențele APT, putem instala Apache și PHP în același timp tastând:

 sudo apt-get instala php5

Cu această singură linie, APT instalează și configurează Apache2 și PHP5. Dacă utilizați add-on-ul Fortracbit's memcache, îl puteți instala cu:

sudo apt-get instala memcached

Dar nu voi merge în memcache în exemplul nostru din acest articol.

Acum trebuie să instalăm extensiile pe care Fortrabbit le folosește. Rulați următoarea comandă:

 sudo apt-get instalare php5-xdebug php5-tidy php5-sqlite php5-redis php5-pgsql \ php5-mysqlnd php5-memcache php5-memcached php5-php5-php5-php5 php5-php5 php5 php5-curl php5 -apc php5-intl

Ultimul lucru pe care trebuie să-l instalăm este compozitorul. Am de gând să-l instalez la nivel global, deoarece îl vom folosi în câteva locații diferite. Comenzile pentru instalarea globală a Compozitorului sunt:

 curl-uri https://getcomposer.org/installer | php sudo mv compozitor.phar / usr / local / bin / compozitor

Prima comandă descarcă și execută programul de instalare; a doua comanda muta Composer-ul in directorul bin, astfel incat sa il putem folosi fara a declara calea. Să trecem la configurație.


Configurarea Apache

Șansele sunt bune, deoarece este posibil să lucrați la mai multe proiecte. Dacă este cazul, având un server de așteptare pentru fiecare proiect creează o mulțime de cheltuieli generale. Pentru a permite mai multor site-uri pe un singur server, trebuie să adăugăm gazde virtuale bazate pe nume în Apache și trebuie să separăm directoarele și repo-urile pentru fiecare proiect.

Să începem cu o gazdă virtuală.

Voi continua să folosesc vim, dar știți că dacă doriți să lucrați în programele proprii, puteți fie copia și lipi sau salvați-l în staging_server dosarul pe care l-ați creat pe computer.

Acest dosar este distribuit VM-ului dvs. și puteți accesa fișierele din vagabond directorul rădăcină. Puteți folosi apoi: sudo cp / vagrant / fișier noul fișier sau sudo mv / vagrant / fișier newfile pentru a copia sau muta fișierele, respectiv.

Pentru a crea o nouă gazdă virtuală, trebuie să creați un fișier în / etc / apache2 / sites-available / director. Pentru a face acest lucru cu VIM, tastați următoarele:

 sudo vim /etc/apache2/sites-available/demo.site

Înăuntru, introduceți următoarele (rețineți că apăsați pe "eu"pentru modul de inserare):

  ServerAdmin [email protected] ServerName demo.dev DocumentRoot / var / www / demo  Opțiuni Indexuri FollowSymLinks MultiViews AllowOverride ALL Ordine permite, refuza permisiunea de la toate  ErrorLog $ APACHE_LOG_DIR /demo.log LogLevel depanare 

Prima linie declară o gazdă virtuală care ascultă cererile pe orice IP de pe portul 80. Apoi, setăm e-mailul de administrare al serverului și numele serverului. E-mailul este pentru raportarea erorilor, iar opțiunea nume de server îi spune lui Apache când să citească această gazdă virtuală. Gazdele virtuale regulate lucrează în afara IP-urilor. De exemplu, fiecare vhost asculta pe un IP diferit; așa îi diferențiază Apache.

Întrucât probabil aveți doar o singură adresă IP, putem utiliza gazde virtuale bazate pe nume, permițându-vă să furnizați un alt nume pe același IP.

În exemplul nostru, orice solicitare adresată demo.dev este preluată de această gazdă virtuală.

Următoarea linie stabilește directorul rădăcină al documentului. Aici Apache preia fișierele pentru acest vhost. Declarațiile din interiorul Director directiva stabileste permisiunile pentru acest vhost. Nu voi intra prea mult în detaliu, dar am setat mai întâi opțiunile directoare Apache, apoi am stabilit ce poate fi înlocuit într-un fișier .htaccess și în final stabilim cine poate accesa site-ul (oricine poate, în cazul nostru).

Ultimele două linii spun Apache ce să numească fișierul jurnal și ce să scrie în jurnal. Fișierul nostru de jurnal se numește demo.log din dosarul de jurnal Apache situat la / Var / log / apache2 / pe acest VM.

Pentru a activa acest vhost, tastați următoarele:

 sudo a2ensite demo.site

Aceasta creează o legătură simbolică între fișierul din folderul disponibil pentru site-uri către un fișier din folderul activat de site-uri. După ce executați această comandă, vi se solicită să reporniți Apache. Veți primi o eroare dacă încercați să reporniți Apache deoarece nu am creat directorul site-ului. Acest lucru este ușor de fix cumpărare crearea Demo dosarul pe care l-am referit în fișierul vhost:

 sudo mkdir / var / www / demo

Nu dorim ca utilizatorul rădăcină să dețină dosarul, deci să îl schimbați cu utilizatorul vag chown comanda:

 sudo chown -R vagrant: vagrant / var / www / demo

Acum reporniți Apache:

 serviciul sudo apache2 reporniți

Noul nostru site ar trebui acum să fie pe deplin funcțional. Următorul pas este să configurați GIT.


Urmărirea cu unele GIT Magic

Asigurați-vă că sunteți în directorul de domiciliu tastând cd ~. Creați un nou dosar pentru repo: mkdir demo.git, introduceți dosarul și inițiați un nou repo GIT gol:

 cd demo.git git init --bare

Un repo replică este în esență un repo standard fără un director de lucru. Dacă doriți să aflați mai multe despre GIT, consultați seria video a lui Andrew Burgess.

Acum avem nevoie de capacitatea de a împinge codul în dosarul site-ului și există multe modalități de a realiza acest lucru. Dar îmi place să fac lucrurile să pară cât mai aproape de serviciul pe care-l simt. Iată o imagine a procesului de fuziune al forței de tragere luate de pe site-ul lor:

Puteți vedea că procesul de împingere trece prin trei etape. Acesta afișează un mesaj de actualizare atunci când se conectează și despachetează site-ul în director. Pasul final instalează totul dacă mesajul de comitet conține cuvintele cheie "[declanșator: compozitor]". Apoi, după terminarea acestor trei pași, vi se afișează ">> Totul încheiat <

Înainte de a crea cârligele, vreau să vorbesc despre culori.

Fac majoritatea muncii mele în terminal și, de cele mai multe ori, aplicațiile terminale lasă totul la aceeași culoare. Adăugarea de culori diferite la aplicația dvs. nu numai că sporește lizibilitatea, dar crește și capacitatea de a-ți dori. Deci, mai bine răspândit "practicile de culoare" în aplicațiile terminale, voi lua un moment pentru a discuta cum funcționează.


Culoare terminale

Terminalele vin cu șaisprezece culori ANSI care pot fi configurate și utilizate pe tot parcursul terminalului. Iată o imagine a ecranului de setări iTerm2, care prezintă cele 16 sloturi de culoare:

Puteți să le accesați în terminal introducând caracterul de evacuare, urmat de brațul deschis deschis și apoi de codul de culoare. Puteți vedea în această imagine că culorile sunt împărțite în două linii: unul etichetat "Normal" și celălalt "Bright". Codurile pentru culorile normale sunt numerele 30-37 urmate de litera "m", iar culorile luminoase sunt din nou 90-97, urmate de un m. Puteți testa acest lucru în fereastra terminalului folosind ecou. Pentru a crea caracterul de evacuare, tastați ctrl-v urmat de ctrl- [. Veți obține un personaj care arată ^ [, dar nu va funcționa dacă tastați "^ [" (shift-6 și apoi deschideți brațul pătrat). Deci, în fereastra tip terminal:

 echo "^ [[31m Hello World ^ [[0m"

Din nou, primul ^ [ nu a fost tipărită, dar a fost creată cu ctrl-v și apoi ctrl- [. 0m caracterul este codul de resetare; elimină toate formatele. Acest lucru se datorează faptului că codurile de culoare nu se termină după cuvântul următor, continuând până când primesc un cod diferit.

Dacă este făcut corect, codul de mai sus scoate cuvintele "hello world" în roșu (cu excepția cazului în care acest slot este setat la o altă culoare).

Pe parcursul restului tutorialului, voi adăuga culori comenzilor. Simțiți-vă liber să urmați sau să le omiteți; acestea nu sunt strict necesare. Dar dacă doriți să folosiți culori, nu ezitați să folosiți clasa de ajutor pentru culori. Acum, hai să ne întoarcem să scriem cârligele.


Crearea cârligelor

Dacă luați o altă privire la fotografia Fortrabbit, veți vedea că acesta afișează mesajul "Pasul 1: Actualizarea depozitului" înainte de actualizarea repo. Pentru a face acest lucru corect, trebuie să punem acest mesaj în cârligul de pre-recepție, care se execută înainte de actualizarea repo-ului. În fereastra terminalului:

 vim ~ / demo.git / hooks / pre-receive

Aceasta deschide cârligul pentru editare. Adăugați următorul cod:

 #! / Usr / bin / php 

Prima linie spune sistemului de operare că acesta este un fișier PHP și îl execută ca atare. Apoi atribuim o culoare și secvența de resetare variabilelor. Ultimul pas ecoue linia.

Cârligul următor este un pic mai complicat deoarece gestionează restul acțiunilor. O vom lua pas cu pas, salvați astfel primul cârlig (: wq) și deschideți următorul cârlig:

 vim ~ / demo.git / cârlige / post-recepție

Cârligul post-recepție rulează după actualizarea repo-ului. Trebuie să actualizăm mai întâi site-ul și apoi să verificăm declanșatorul Composer. Iată un schelet al programului nostru, lăsând orice logică nouă:

 #! / Usr / bin / php  msgstr "\ n"; / * TODO: Deplasare la site * / echo "->". "$" / "TODO: Verificați dacă comitetul a declanșat * / echo $ galben." >> Totul a fost terminat <<" . $blank . "\n"; ?>

Aceasta este doar o schiță de lucru de la. Primul lucru pe care trebuie să-l punem este caracteristica de a trage noua versiune a repo-ului în directorul site-ului. În mod tradițional, aș fi scris următoarele dacă aș fi în dosar:

 git fetch origine git reset --hard origine / master

Ai putea folosi ceva de genul git trageți, dar acest lucru poate cauza erori. Dacă un fișier a fost modificat direct sau dacă ați pierdut un comitet, atunci git trageți nu vă va permite să vă trageți sau să vă ștergeți fișierele netrackate.

Acestea sunt două comenzi simple, dar veți primi o eroare dacă încercați să le executați din cârlig.

GIT stabilește unele variabile de mediu înainte de a rula cârligele. Puteți să o ocoli cu una din cele două soluții și vă voi arăta amândouă.

Primul este de a suprascrie variabilele de mediu, trecând direct în informații. Al doilea șterge complet variabilele. Voi folosi prima opțiune din acest exemplu și a doua opțiune când vom lucra la declanșatorul compozitorului. Înlocuiți comentariul pe care l-am adăugat mai sus unde se afișează "TODO Deploy to site" cu următoarele:

 $ git = "git -git-dir = / var / www / demo / .git / -work-tree = / var / www / demo /"; exec ("$ git fetch -q origine"); exec ("$ reset git - hard origin / master");

Acest lucru suprascrie variabilele de mediu și solicită funcțiile menționate mai sus. A adăugat -q parametru spune GIT să fie "silențios", interzicând GIT de la ecou orice mesaje.

Acum trebuie să verificăm declanșatorul Composer. Să o rupem în două etape. Mai întâi verificăm declanșatorul și apoi executăm compozitorul. Înlocuiți al doilea comentariu TODO cu următoarele:

 $ msg = exec ("$ git log -n 1 - format = format:% s% b"); dacă (strpos ($ msg, "[declanșator: compozitor]")! == false) echo $ galben. "Pasul 3: Cârligul compozitorului". $ gol. "\ N"; echo "-> Triggering install - obțineți un". $ cyan. "cafea" . $ gol. "\ N"; // rula ecoul compozitorului "->". $ cyan. "O.K" . $ gol. "\ N"; 

Primul rând preia mesajul de comitere folosind git log comandând și trecând într-un format special pentru a exclude orice informații suplimentare. Apoi, verificăm dacă șirul are cuvântul special de declanșare și ecuați cel de-al treilea pas și mesajul OK. Verificăm cuvântul cheie Composer, dar puteți implementa mai multe cuvinte cheie pentru alte funcții, cum ar fi: migrați în Laravel sau efectuați teste de unitate. Adăugați ceva pentru a vă îmbunătăți fluxul de lucru.

Ultimul pas este să executați compozitorul. Compozitorul are două comenzi: compozitorul instala și compozitor.

Comanda de instalare nu citește composer.json dacă găsiți o composer.lock, și pentru că unii oameni ar putea adăuga composer.lock la dosarul lor .gitignore, este mai sigur să alergi compozitor (întotdeauna se uită la composer.json fişier.

Cea de-a doua problemă este că, uneori, Compozitorul folosește GIT pentru a descărca pachete, iar aceste încercări nu reușesc datorită variabilelor de mediu. Deci, aici este un loc bun pentru a elimina doar variabila de mediu "GIT_DIR". Înlocuiți comentariul pentru a rula Composer cu următoarele:

 chdir ( "/ var / www / demo"); putenv ( "GIT_DIR"); exec ("actualizare compozitor");

Acest cod este drept. Deplasăm procesul PHP în dosarul site-ului, apoi eliminăm GIT_DIR variabilă de mediu astfel încât funcția GIT să funcționeze în mod normal. Ultima linie execută compozitorul.


Legătura se termină

Acum avem ambele setări, dar nu suntem complet gata să începem să folosim serverul nostru. În primul rând, trebuie să facem aceste cârlige executabile:

 chmod a + x ~ / demo.git / cârlige / pre-primi chmod a + x ~ / demo.git / hooks / post-primi

Apoi, creați un replică GIT în dosarul site-ului. Vom primi o eroare dacă încercăm să executăm cârligele deoarece folderul site-ului nu este un repo GIT. Pentru a remedia acest tip:

 cd / var / www / demo git init git adăugați de la distanță origine /home/vagrant/demo.git

Primele două linii creează repo-ul, apoi adăugăm depozitul gol ca origine a repo-ului.

De asemenea, trebuie să adăugați cheia dvs. publică la gazdele autorizate ale acestui server pentru a putea accesa serverul prin GIT fără o parolă. Puteți să copiați cheia publică introducând pe computer (nu pe VM):

 cat ~ / .ssh / id_rsa.pub | pbcopy

Apoi, pur și simplu lipiți-l pe serverul din fișier ~ / .Ssh / authorized_keys:

 vim ~ / .ssh / authorized_keys

Doar adăugați-o la fișier, dar lăsați tot ce este deja înăuntru.

Apoi, trebuie să adăugăm IP-ul acestui server în fișierul hosts. Pentru a găsi IP, tastați:

 ip -4-o addr arată eticheta eth *

Aceasta vă arată adresa IP a tuturor dispozitivelor de rețea din acest VM. Adăugați unul care se conectează la rețeaua locală. Dacă nu puteți determina ce adresă IP să utilizați, copiați și lipiți una în browserul dvs. Dacă se conectează, atunci aveți adresa IP corectă.

Luați IP-ul și adăugați-l la fișierul hosts al computerului (nu la fișierul hosts al VM-ului). Fișierul hosts pe un Mac este situat la etc / hosts:

 sudo vim / etc / gazde

Apoi, adăugați următoarea linie:

 #Format: IP_adresa nume_site 192.168.0.110 demo.dev

Dacă aceasta funcționează, veți putea naviga la http://demo.dev în browserul dvs. În timp ce vă aflați încă pe Mac, creați un dosar și inițializați un repo GIT:

 mkdir ~ / demo cd ~ / demo git init echo "Hello World"> index.php adăugați. git commit -am "adăugat index.php" git adăugați la distanță staging [email protected]: demo.git git push staging master

Dacă totul a mers bine, ar trebui să vedeți un răspuns de la cârligele noastre GIT. Navigarea la http://demo.dev ar trebui să aibă ca rezultat mesajul "Hello World" afișat în browserul dvs..


Concluzie

Deci, astfel puteți crea un mediu de așteptare care să imite funcționalitatea unui PAAS tipic. Dacă ați avut probleme la urmărirea de mai multe ori, sau trebuie să configurați mai multe medii de așteptare, am creat un script care automatizează complet procesul. Pentru mai multe informații, puteți vizita stagr.gmanricks.com.

Sper că ți-a plăcut articolul. Simțiți-vă liber să puneți întrebările pe care le puteți avea în comentarii. Mulțumesc că ați citit.

Cod