Aplicacions modernes a OpenShift, part 2: compilacions encadenades
Hola a tots! Aquesta és la segona publicació de la nostra sèrie en què mostrem com implementar aplicacions web modernes a Red Hat OpenShift.
A la publicació anterior, vam tocar lleugerament les capacitats de la nova imatge del constructor S2I (font a imatge), que està dissenyada per crear i desplegar aplicacions web modernes a la plataforma OpenShift. Aleshores ens interessava el tema del desplegament ràpid d'una aplicació, i avui veurem com utilitzar una imatge S2I com a imatge de constructor "pura" i combinar-la amb conjunts d'OpenShift relacionats.
Imatge de constructor neta
Com hem esmentat a la part XNUMX, la majoria de les aplicacions web modernes tenen l'anomenada fase de construcció, que normalment realitza operacions com ara la transpilació de codi, la concatenació de fitxers múltiples i la minificació. Els fitxers obtinguts com a resultat d'aquestes operacions -i això és HTML estàtic, JavaScript i CSS- s'emmagatzemen a la carpeta de sortida. La ubicació d'aquesta carpeta depèn normalment de quines eines de compilació s'estan utilitzant, i per a React aquesta serà la carpeta ./build (tornarem a això amb més detall a continuació).
Font a imatge (S2I)
En aquesta entrada no toquem el tema "què és S2I i com utilitzar-lo" (podeu llegir més sobre això aquí), però és important tenir clar els dos passos d'aquest procés per entendre què fa una imatge de Web App Builder.
Fase de muntatge
La fase de muntatge és de naturalesa molt similar al que passa quan executeu la compilació de Docker i acabeu amb una nova imatge de Docker. En conseqüència, aquesta etapa es produeix quan s'inicia una compilació a la plataforma OpenShift.
En el cas d'una imatge de Web App Builder, és responsable d'instal·lar les dependències de l'aplicació i executar la compilació. muntar el guió. De manera predeterminada, la imatge del constructor utilitza la construcció npm run build, però aquesta es pot substituir mitjançant la variable d'entorn NPM_BUILD.
Com hem dit anteriorment, la ubicació de l'aplicació acabada i ja construïda depèn de quines eines utilitzeu. Per exemple, en el cas de React aquesta serà la carpeta ./build, i per a les aplicacions Angular serà la carpeta nom_projecte/dist. I, com ja es va mostrar a la publicació anterior, la ubicació del directori de sortida, que està configurat per construir-se per defecte, es pot substituir mitjançant la variable d'entorn OUTPUT_DIR. Bé, com que la ubicació de la carpeta de sortida difereix d'un marc a un altre, simplement copieu la sortida generada a la carpeta estàndard de la imatge, és a dir, /opt/apt-root/output. Això és important per entendre la resta d'aquest article, però de moment mirem ràpidament la següent etapa: la fase d'execució.
fase d'execució
Aquesta etapa es produeix quan es fa una trucada a l'execució de Docker a la nova imatge creada durant l'etapa de muntatge. El mateix passa quan es desplega a la plataforma OpenShift. Per defecte executa l'script usos mòdul de servei per publicar contingut estàtic situat al directori de sortida estàndard anterior.
Aquest mètode és bo per desplegar aplicacions ràpidament, però generalment no es recomana publicar contingut estàtic d'aquesta manera. Bé, com que en realitat només oferim contingut estàtic, no necessitem instal·lar Node.js a la nostra imatge: n'hi haurà prou amb un servidor web.
És a dir, a l'hora de muntar necessitem una cosa, a l'executar en necessitem una altra. En aquesta situació, les construccions encadenades són útils.
"Es poden enllaçar dos conjunts, un generant una entitat compilada i l'altre allotja aquesta entitat en una imatge separada que s'utilitza per executar aquesta entitat".
En altres paraules, podem utilitzar la imatge del Web App Builder per executar la nostra compilació i després utilitzar la imatge del servidor web, el mateix NGINX, per servir el nostre contingut.
Així, podem utilitzar la imatge del Web App Builder com a constructor "pur" i alhora tenir una petita imatge d'execució.
Vegem-ho ara amb un exemple concret.
Per a la formació utilitzarem senzilla aplicació React, creat amb l'eina de línia d'ordres create-react-app.
Vegem aquest fitxer amb més detall i comencem per la secció de paràmetres.
parameters:
- name: SOURCE_REPOSITORY_URL
description: The source URL for the application
displayName: Source URL
required: true
- name: SOURCE_REPOSITORY_REF
description: The branch name for the application
displayName: Source Branch
value: master
required: true
- name: SOURCE_REPOSITORY_DIR
description: The location within the source repo of the application
displayName: Source Directory
value: .
required: true
- name: OUTPUT_DIR
description: The location of the compiled static files from your web apps builder
displayName: Output Directory
value: build
required: false
Tot aquí és bastant clar, però val la pena parar atenció al paràmetre OUTPUT_DIR. Per a l'aplicació React del nostre exemple, no hi ha res de què preocupar-se, ja que React utilitza el valor predeterminat com a carpeta de sortida, però en el cas d'Angular o una altra cosa, caldrà canviar aquest paràmetre segons sigui necessari.
Mireu la tercera i la quarta imatge. Tots dos es defineixen com a imatges de Docker i podeu veure clarament d'on provenen.
La tercera imatge és web-app-builder i prové de nodeshift/ubi8-s2i-web-app etiquetada 10.x a Hub Docker.
La quarta és una imatge NGINX (versió 1.12) amb l'última etiqueta activada Hub Docker.
Ara mirem les dues primeres imatges. Tots dos estan buits a l'inici i només es creen durant la fase de construcció. La primera imatge, react-web-app-builder, serà el resultat d'un pas de muntatge que combinarà la imatge web-app-builder-runtime i el nostre codi font. És per això que hem afegit "-builder" al nom d'aquesta imatge.
La segona imatge, react-web-app-runtime, serà el resultat de combinar nginx-image-runtime i alguns fitxers de la imatge react-web-app-builder. Aquesta imatge també s'utilitzarà durant el desplegament i només contindrà el servidor web i HTML estàtic, JavaScript, CSS de la nostra aplicació.
Confós? Ara fem una ullada a les configuracions de construcció i quedarà una mica més clar.
La nostra plantilla té dues configuracions de compilació. Aquí teniu el primer, i és bastant estàndard:
Com podeu veure, la línia amb l'etiqueta 1 diu que el resultat d'aquesta compilació es col·locarà a la mateixa imatge react-web-app-builder que vam veure una mica abans a la secció ImageStreams.
La línia anomenada 2 us indica d'on podeu obtenir el codi. En el nostre cas, es tracta d'un repositori git, i la ubicació, la referència i la carpeta de context estan determinats pels paràmetres que ja vam veure més amunt.
La línia anomenada 3 és la que ja vam veure a la secció de paràmetres. Afegeix la variable d'entorn OUTPUT_DIR, que en el nostre exemple és compilar.
La línia etiquetada 4 diu que utilitzeu la imatge web-app-builder-runtime, que ja vam veure a la secció ImageStream.
La línia amb l'etiqueta 5 diu que volem utilitzar una compilació incremental si la imatge S2I ho admet, i la imatge Web App Builder ho fa. En el primer llançament, un cop finalitzada l'etapa de muntatge, la imatge desarà la carpeta node_modules en un fitxer d'arxiu. Aleshores, en execucions posteriors, la imatge simplement descomprimirà aquesta carpeta per reduir el temps de creació.
I, finalment, la línia anomenada 6 són només uns quants desencadenants per fer que la compilació s'executi automàticament, sense intervenció manual, quan alguna cosa canvia.
En general, aquesta és una configuració de construcció força estàndard.
Ara fem una ullada a la segona configuració de construcció. És molt semblant al primer, però hi ha una diferència important.
Per tant, la segona configuració de compilació és react-web-app-runtime, i comença bastant estàndard.
La línia anomenada 1 no és cap novetat: simplement diu que el resultat de la compilació es posa a la imatge react-web-app-runtime.
La línia anomenada 2, com en la configuració anterior, indica d'on es pot obtenir el codi font. Però observeu que aquí estem dient que està tret de la imatge. A més, a partir de la imatge que acabem de crear, de react-web-app-builder (indicat a la línia etiquetada 3). Els fitxers que volem utilitzar es troben dins de la imatge i la seva ubicació allà està establerta a la línia etiquetada 4, en el nostre cas és /opt/app-root/output/. Si ho recordeu, aquí és on s'emmagatzemen els fitxers generats a partir dels resultats de la construcció de la nostra aplicació.
La carpeta de destinació especificada en el terme amb l'etiqueta 5 és simplement el directori actual (això és tot, recordeu, que s'executa dins d'una cosa màgica anomenada OpenShift, i no al vostre ordinador local).
La secció d'estratègia (línia anomenada 6) també és similar a la configuració de la primera compilació. Només que aquesta vegada farem servir nginx-image-runtime, que ja vam veure a la secció ImageStream.
Finalment, la línia anomenada 7 és una secció d'activadors que activarà aquesta compilació cada vegada que canviï la imatge de react-web-app-builder.
En cas contrari, aquesta plantilla conté una configuració de desplegament força estàndard, així com coses relacionades amb serveis i rutes, però no entrarem en massa detalls. Tingueu en compte que la imatge que es desplegarà és la imatge react-web-app-runtime.
Desplegament d'aplicacions
Així que ara que hem mirat la plantilla, vegem com utilitzar-la per desplegar una aplicació.
Podem utilitzar l'eina de client OpenShift anomenada oc per desplegar la nostra plantilla:
El patró aquí és el mateix, excepte per a la variable OUTPUT_DIR.
Suplement 2
En aquest article hem utilitzat NGINX com a servidor web, però és bastant fàcil substituir-lo per Apache, només cal canviar la plantilla al fitxer Imatge NGINX en Imatge d'Apache.
Conclusió
A la primera part d'aquesta sèrie, vam mostrar com implementar ràpidament aplicacions web modernes a la plataforma OpenShift. Avui hem vist què fa una imatge d'aplicació web i com es pot combinar amb un servidor web pur com NGINX mitjançant compilacions encadenades per crear una compilació d'aplicacions més preparada per a la producció. En el següent i últim article d'aquesta sèrie, mostrarem com executar un servidor de desenvolupament per a la vostra aplicació a OpenShift i garantir la sincronització dels fitxers locals i remots.
Part 2: Com utilitzar una imatge S2I nova amb una imatge de servidor HTTP existent, com ara NGINX, utilitzant conjunts OpenShift associats per al desplegament de producció;
Part 3: com executar un servidor de desenvolupament per a la vostra aplicació a la plataforma OpenShift i sincronitzar-lo amb el sistema de fitxers local.