Cum aș putea compila assets pe server?

Am următoarea situație: un folder assets în care am alte două foldere: src și dist. În dist sunt strict fișiere compilate de Grunt. Problema este că toate aceste fișiere compilate sunt minified => conflicte aproape de fiecare dată la merge.

Din repo se face pull și în producție (unde nu s-ar putea instala grunt & deps).

Întrebarea este: s-ar putea automatiza acest lucru? Aș vrea să pun dist în ignore și să se compileze assets la fiecare push. Cred că asta ar însemna continuous integration sau continuous deployment, dar nu am avut niciodată de-a face cu asta, nu știu exact ce presupune și cum s-ar putea folosi.

Ceva îndrumare se poate? :smile:

pentru ca nu poti instala depedintele pe serverul de productie intradevar trebuie folosit un serviciu de continuous deployment

Incearca https://www.codeship.io are 100 private builds free / luna
Setup e foarte easy, zici ca vrei sa folosti node, si specifici exact ce comenzi sa ruleze
apoi pentru deploy cred ca rsync din dist pe server sau ceva in procesul de grunt

Alternativ DIY cu http://buildbot.net/

1 Like

rsync ftw! :sunny:

1 Like

Pentru că instalarea de soft extra pe server nu este întotdeauna o opțiune, buildbot cam pică.

Eu m-am gândit la o soluție ce implică un server intermediar (S) și funcționează așa:

  • La fiecare push pe master, S face pull, rulează Grunt (și/sau ce o mai fi nevoie; e.g. composer update) și face deploy în producție folosind … X
  • La fiecare push pe dev se întâmplă același lucru ca mai sus doar că se face deploy pe serverul de test

În toată povestea asta X poate fi ori rsync, sftp sau ce o mai fi disponibil.

Greșesc undeva? Pierd ceva din vedere?

Un continous integration se ocupa de asta. Pentru orice push poti face automat sa rulesi un script de build.

Deploy-ul se poate face automat sau manual.

Cu jenkins am reusit asta, iar scriptul a fost cu ant.

Acum sunt solutii de scripting mai simple: grunt, gulp, etc

Sunt sigur ca exista la fel de multe workflow-uri ca developeri, asa ca nu ma bag intr-o discutie de ce e mai bine sau nu. Fiecare cu ale lui.

Dar o sa explic cum cred eu ca e mai bine cand e vorba de grunt/sass/minificari/dist folders si cum evit eu probleme de genu. Da, teoretic e continuous integration. Cred ca cel mai simplu mod de a explica un workflow-ul e sa prezint workflow-ul meu.

In primul rand, orice cod care nu e scris de tine e ignorat de git. Asta include, node_modules, bower components si dist folders. Pur si simplu nu are rost sa il tii in git, cand codul tau e tot ce e nevoie pentru a genera site-ul cand folosest continuous integration.

Sa zicem ca trebuie sa dezvolti un site WP. Poate lucrezi cu altii sau nu, dar recomand sa creezi o organizatie in git si un repo pentru proiectul respectiv. Eu folosesc master pentru production si un dev branch pentru qa. Nimeni nu da commit la master si orice PR va intra in dev. O data pe saptamana sau cand crezi ca un “release” e necesar, faci un PR de la dev la master si gata.

Faza cu PR si branches e legat strans de continuous integration. Orice commit in master va initializa un build care va genera dist folderul tau. Orice commit in dev branch va genera un dist folder pentru qa. Fiecare dist are o versiune unica si il trimiti undeva ca sa-l salvezi. Poti face git releases cu un zip atasat, poti sa-l trimiti pe dropbox, poti folosi artefactory etc. E important si util sa ai access la o lista de “releasuri”, locatia nu prea conteaza.

Apropo, distul asta nu e doar o lista de fisiere JS/CSS concatenate. E proiectul complet. Toate tema WP de la cap la coada. Zic asta fiindca mi se pare ca tu consideri dist ca un fel de .tmp folder, dar de fapt ar trebui sa-l privesti ca un deliverable.

Asta e partea cu continuous integration. Continuous deployment se face dupa un successful build (gen toate testele sunt OK). Cand generezi un dist folder nou, il trimiti pe server live. Gen FTP sau heroku sau amazon sau orice, nu conteaza. Distul de la dev branch il trimiti la un qa environment, gen pe un subdomeniu al tau. Distul de la master il trimiti la locatia finala.

Binenteles, tu lucrezi de pe forkul tau doar. Nimeni niciodata nu trebuie sa dea commit in repo-ul organizatiei! Fiecare cu forkul lui.

In final, uite niste link-uri de la proiectele mele ce folosesc continuous X:

  • https://github.com/vilmosioo/Sky-Watch foloseste Travis. E public dar are o gramada de key private incriptate de travis pentru a trimite dist-ul generat pe site-ul meu prin FTP. Recomand sa creezi un FTP account pentru fiecare build separat, cu access minimum pentru proiectul respectiv. Ca nu toata lumea e nice :stuck_out_tongue: In special, uite cum e setat continuous integration aici
  • Site-ul meu e intr-un cont privat pe bitbucket, dar iti pot da access sa vezi cum arata. Ala foloseste Codeship pentru continuous integration. Ideea e aceeasi ca travis si e similar, doar ca e gratis si pentru proiecte private :stuck_out_tongue:

Hint: setarile serverului de continuous integration ar trebui sa fie in repo, nu pe server. Te ajuta daca vrei sa schimbi setari sau workflow intr-un singur commit, fara sa fie nevoie sa schimbi ceva in travis.

Hint 2: Daca esti smecher, faci continuous integration pentru */merge pe dev branch, sa rulezi toate testele pentru fiecare PR ce il deschizi, sa fii sigur ca e ok sa dai merge. Travis are o integrare smechera cu github pentru asta :smile:

Sper ca ajuta :smile:

2 Likes