Aplikacione moderne në OpenShift, pjesa 2: ndërtimet e lidhura të ndërtimeve të zinxhirit

Përshëndetje! Ky është postimi i dytë në serinë tonë, ku tregojmë si të zhvilloni aplikacione moderne web në Red Hat OpenShift.

Aplikacione moderne në OpenShift, pjesa 2: ndërtimet e lidhura të ndërtimeve të zinxhirit

Në postimin e mëparshëm, ne përmëndëm në mënyrë të lehtë mundësitë e reja të builder-image S2I (source-to-image), i cili është i destinuar për ndërtimin dhe zhvillimin e aplikacioneve moderne web në platformën OpenShift. Atëherë na interesonte tema e zhvillimit të shpejtë të aplikacioneve, ndërsa sot do të shqyrtojmë si ta përdorim S2I-image si një 'builder' të pastër dhe ta kombinojmë me ndërlidhjet OpenShift.

Builder-i i pastër

Siç e pĂ«rmĂ«ndĂ«m nĂ« pjesĂ«n e parĂ«, shumica e aplikacioneve moderne web kanĂ« njĂ« fazĂ« ndĂ«rtimi, ku zakonisht kryhen operacione tĂ« tilla si transpiling i kodit, konkatencionimi i disa skedave dhe minimizimi. SkedarĂ«t e marrĂ« nga kĂ«to operacione – qĂ« pĂ«rfshijnĂ« HTML statik, JavaScript dhe CSS – vendosen nĂ« folderin output. Lokacioni i kĂ«tij folderi zakonisht varet nga mjetet e ndĂ«rtimit qĂ« pĂ«rdoren, dhe pĂ«r React do tĂ« jetĂ« folderi ./build (do tĂ« kthehemi nĂ« kĂ«tĂ« çështje mĂ« poshtĂ«).

Source-to-Image (S2I)

Në këtë postim ne nuk do të flasim fare për temën 'çfarë është S2I dhe si ta përdorim' (për më shumë mund të lexoni këtu), por është e rëndësishme që të kuptoni qartë dy fazat e këtij procesi, për të kuptuar se çfarë bën imazhi Web App Builder.

Faza e asamblesë (assemble phase)

Faza e asamblesë, në thelb, është shumë e ngjashme me atë që ndodh kur ju bëni docker build dhe si rezultat merrni një Docker-image të ri. Prandaj, kjo fazë ndodh kur nisni një ndërtim në platformën OpenShift.

Në rastin e imazhit Web App Builder, përgjegjësia për instalimin e varësive të aplikacionit tuaj dhe nisjen e ndërtimit i takon assemble script. Si parazgjedhje, builder-image përdor strukturën npm run build, por kjo mund të anulohet përmes variablit të mjedisit NPM_BUILD.

Siç e thamĂ« mĂ« parĂ«, vendndodhja e aplikacionit tĂ« gatshĂ«m, tashmĂ« tĂ« ndĂ«rtuar, varet nga cilat mjete pĂ«rdoren. PĂ«r shembull, nĂ« rastin e React, do tĂ« jetĂ« dosja /build, ndĂ«rsa pĂ«r aplikacionet Angular – dosja project_name/dist. Dhe, siç u tregua nĂ« postimin e kaluar, vendndodhja e katalogut tĂ« output-it, i cili nĂ« mĂ«nyrĂ« default Ă«shtĂ« caktuar si build, mund tĂ« ndryshohet pĂ«rmes variablit tĂ« mjedisit OUTPUT_DIR. Dhe pĂ«r shkak se vendndodhja e dosjes sĂ« output-it ndryshon nga njĂ« framework nĂ« njĂ« tjetĂ«r, thjesht e kopjoni output-in e gjeneruar nĂ« dosjen standarde nĂ« imazh, pra nĂ« /opt/apt-root/output. Kjo Ă«shtĂ« e rĂ«ndĂ«sishme pĂ«r tĂ« kuptuar pjesĂ«n tjetĂ«r tĂ« kĂ«tij artikulli, ndĂ«rkohĂ«, le tĂ« shikojmĂ« shpejt fazĂ«n tjetĂ«r – fazĂ«n e ekzekutimit (run phase).

Faza e ekzekutimit (run phase)

Kjo fazë ndodh kur bëhet thirrje docker run për një imazh të ri, të krijuar në fazën e ndërtimit. Ajo ndodh gjithashtu gjatë implementimit në platformën OpenShift. Në mënyrë default skriptin e aktivizimit përdor moduli serve për shërbimin e përmbajtjes statike që ndodhet në katalogun e output-it standard të përmendur më lart.

Ky metod Ă«shtĂ« i mirĂ« pĂ«r implementimin e shpejtĂ« tĂ« aplikacioneve, por nĂ« tĂ« vĂ«rtetĂ«, nuk rekomandohet tĂ« shĂ«rbehet pĂ«rmbajtje statike nĂ« kĂ«tĂ« mĂ«nyrĂ«. Duke qenĂ« se ne nĂ« tĂ« vĂ«rtetĂ« po shĂ«rbejmĂ« vetĂ«m pĂ«rmbajtje statike, Node.js i instaluar brenda imazhit tonĂ« nuk Ă«shtĂ« i nevojshĂ«m – njĂ« server web do tĂ« ishte mjaft.

Me fjalĂ« tĂ« tjera, gjatĂ« ndĂ«rtimit na nevojitet njĂ« gjĂ«, ndĂ«rsa gjatĂ« ekzekutimit – diçka tjetĂ«r. NĂ« njĂ« situatĂ« tĂ« tillĂ« do tĂ« dobishen ndĂ«rtimet e lidhura (chained builds).

Ndërtime të lidhura (chained builds)

Ja çfarë thonë për ndërtimet e lidhura në dokumentacionin e OpenShift:

«Dy ndërtimet mund të lidhen me njëra-tjetrën, ku njëra gjeneron një entitet të përpiluar dhe tjetra vendos këtë entitet në një imazh të veçantë, i cili përdoret për të ekzekutuar këtë entitet».

Me fjalë të tjera, ne mund të përdorim imazhin Web App Builder për të ekzekutuar ndërtimin tonë, dhe pastaj të përdorim imazhin e serverit web, të njëjtin NGINX, për të shërbyer përmbajtjen tonë.

KĂ«shtu, ne mund tĂ« aplikojmĂ« imazhin Web App Builder si njĂ« ‘tĂ« pastĂ«r’ builder dhe nĂ« tĂ« njĂ«jtĂ«n kohĂ« tĂ« kemi njĂ« imazh runtime tĂ« vogĂ«l.

Tani le të analizojmë këtë me një shembull konkret.

Për stërvitje do të përdorim një aplikacion të thjeshtë React, të krijuar me ndihmën e mjetit të komandës create-react-app.

Të gjitha së bashku do të na ndihmojë skedari i shabllonit OpenShift.

Le të analizojmë më në detaje këtë skedar dhe të fillojmë me seksionin e parametrave.

parametrat:
  - emri: SOURCE_REPOSITORY_URL
    përshkrimi: URL-ja burimore për aplikacionin
    emri i shfaqjes: URL Burimor
    e kërkuar: e vërtetë
  - emri: SOURCE_REPOSITORY_REF
    përshkrimi: Emri i degës për aplikacionin
    emri i shfaqjes: Dega Burimore
    vlera: master
    e kërkuar: e vërtetë
  - emri: SOURCE_REPOSITORY_DIR
    përshkrimi: Lokacioni brenda repo-s burimore të aplikacionit
    emri i shfaqjes: Dosja Burimore
    vlera: .
    e kërkuar: e vërtetë
  - emri: OUTPUT_DIR
    përshkrimi: Lokacioni i skedave statike të kompiluar nga ndërtuesi i aplikacioneve tuaja
    emri i shfaqjes: Dosja e Daljes
    vlera: ndërtim
    e kërkuar: e gabuar

Këtu gjithçka është mjaft e qartë, por duhen kushtuar vëmendje parametrave OUTPUT_DIR. Për aplikacionin React nga shembulli ynë nuk ka çfarë të shqetësohemi, pasi React përdor si vlerë të daljes dosjen standarde, ndërsa në rastin e Angular ose ndonjë gjëje tjetër, ky parametër do të duhet të ndryshohet në mënyrë të duhur.

Tani le të shohim seksionin e ImageStream-ëve.

- apiVersion: v1
  lloji: ImageStream
  metadata:
    emri: react-web-app-builder  // 1 
  spec: {}
- apiVersion: v1
  lloji: ImageStream
  metadata:
    emri: react-web-app-runtime  // 2 
  spec: {}
- apiVersion: v1
  lloji: ImageStream
  metadata:
    emri: web-app-builder-runtime // 3
  spec:
    etiketat:
    - emri: latest
      nga:
        lloji: DockerImage
        emri: nodeshift/ubi8-s2i-web-app:10.x
- apiVersion: v1
  lloji: ImageStream
  metadata:
    emri: nginx-image-runtime // 4
  spec:
    etiketat:
    - emri: latest
      nga:
        lloji: DockerImage
        emri: 'centos/nginx-112-centos7:latest'

Shikoni imazhet e tretë dhe të katërt. Të dy janë të përcaktuar si imazhe Docker dhe është qartë se nga po vijnë.

Imazhi i tretĂ« – Ă«shtĂ« web-app-builder, dhe ai vjen nga nodeshift/ubi8-s2i-web-app me etiketĂ« 10.x nĂ« Docker hub.

I katĂ«rti – Ă«shtĂ« imazhi NGINX (versioni 1.12) me etiketĂ« latest nĂ« Docker hub.

Tani le tĂ« shohim dy imazhet e para. TĂ« dy janĂ« bosh nĂ« fillim dhe krijohen vetĂ«m gjatĂ« fazĂ«s sĂ« ndĂ«rtimit. Imazhi i parĂ« – react-web-app-builder – do tĂ« jetĂ« rezultati i fazĂ«s sĂ« assemblimit, e cila do tĂ« bashkojĂ« imazhin web-app-builder-runtime dhe kodin tonĂ« burimor. Kjo Ă«shtĂ« arsyeja pse e kemi pĂ«rfshirĂ« '-builder' nĂ« emrin e kĂ«tij imazhi.

Imazhi i dytĂ« – react-web-app-runtime – do tĂ« jetĂ« rezultat i bashkimit tĂ« nginx-image-runtime dhe disa skedave nga imazhi react-web-app-builder. Ky imazh gjithashtu do tĂ« pĂ«rdoret gjatĂ« implementimit dhe do tĂ« pĂ«rmbajĂ« vetĂ«m serverin web dhe HTML statik, JavaScript, CSS tĂ« aplikacionit tonĂ«.

E ngatërruar? Tani le të shohim konfigurimet e ndërtimit dhe do të bëhet pak më e qartë.

Në shabllonin tonë ka dy konfigurime të ndërtimit. Ja e para, dhe është mjaft standarde:

  apiVersion: v1
  kind: BuildConfig
  metadata:
    name: react-web-app-builder
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: react-web-app-builder:latest 
    source:   
      git:
        uri: ${SOURCE_REPOSITORY_URL}
        ref: ${SOURCE_REPOSITORY_REF}
      contextDir: ${SOURCE_REPOSITORY_DIR}
      type: Git
    strategy:
      sourceStrategy:
        env:
          - name: OUTPUT_DIR 
            value: ${OUTPUT_DIR}
        from:
          kind: ImageStreamTag
          name: web-app-builder-runtime:latest 
        incremental: true 
      type: Source
    triggers: 
    - github:
        secret: ${GITHUB_WEBHOOK_SECRET}
      type: GitHub
    - type: ConfigChange
    - imageChange: {}
      type: ImageChange

Si e shohim, rreshti me etiketen 1 tregon se rezultati i kësaj ndërtese do të vendoset në atë imazh react-web-app-builder, të cilin e pamë më parë në seksionin e ImageStream-eve.

Rreshti me etiketen 2 tregon nga ku të merrni kodin. Në rastin tonë, kjo është një depo git, dhe vendndodhja, ref dhe dosja e kontekstit janë të përcaktuara nga parametrat që i pamë më lart.

Rreshti me etiketen 3 – e kemi parĂ« tashmĂ« nĂ« seksionin e parametrave. Ajo shton njĂ« variabĂ«l ambienti OUTPUT_DIR, qĂ« nĂ« shembullin tonĂ« Ă«shtĂ« e barabartĂ« me build.
Rreshti me etiketen 4 tregon të përdoret imazhi web-app-builder-runtime, që e kemi parë më parë në seksionin e ImageStream.

Rreshti me etiketen 5 tregon se ne duam të përdorim ndërtimin inkremental, nëse imazhi S2I e mbështet atë, dhe imazhi Web App Builder e mbështet. Në fillim, pas përfundimit të fazës së asamblesë, imazhi do të ruajë dosjen node_modules në një skedar zip. Pastaj, në startet pasuese, imazhi do të thjesht deshifrojë këtë dosje për të shkurtuar kohën e ndërtimit.

Dhe, pĂ«rfundimisht, rreshti me etiketen 6 – janĂ« thjesht disa triggera, qĂ« ndĂ«rtimi tĂ« fillojĂ« automatikisht, pa ndĂ«rhyrje manuale, kur ndonjĂ« gjĂ« ndryshon.

Në përgjithësi, kjo është një konfigurim ndërtimi mjaft standard.

Tani le të shohim konfigurimin e dytë të ndërtimit. Ai është shumë i ngjashëm me të parin, por ka një ndryshim të rëndësishëm.

apiVersion: v1
  kind: BuildConfig
  metadata:
    name: react-web-app-runtime
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: react-web-app-runtime:latest 
    source: 
      type: Image
      images:                              
        - from:
            kind: ImageStreamTag
            name: react-web-app-builder:latest 
          paths:
            - sourcePath: /opt/app-root/output/. 
              destinationDir: .  
    strategy: 
      sourceStrategy:
        from:
          kind: ImageStreamTag
          name: nginx-image-runtime:latest
        incremental: true
      type: Source
    triggers:
    - github:
        secret: ${GITHUB_WEBHOOK_SECRET}
      type: GitHub
    - type: ConfigChange
    - type: ImageChange
      imageChange: {}
    - type: ImageChange
      imageChange:
        from:
          kind: ImageStreamTag
          name: react-web-app-builder:latest

Pra ndaj, konfigurimi i dytĂ« i ndĂ«rtimit – react-web-app-runtime, fillon mjaft standardisht.

NĂ« vargun me etiketĂ«n 1 nuk ka asgjĂ« tĂ« re – thjesht thotĂ« qĂ« rezultati i ndĂ«rtimit vendoset nĂ« imazhin react-web-app-runtime.

Vargu me etiketĂ«n 2, si nĂ« konfigurimin e mĂ«parshĂ«m, tregon nga ku do tĂ« merret kodi burimor. Por vini re se kĂ«tu po themi se merret nga imazhi. Pra, nga imazhi qĂ« sapo krijuam – nga react-web-app-builder (i cituar nĂ« vargun me etiketĂ«n 3). SkedarĂ«t qĂ« duam tĂ« pĂ«rdorim ndodhen brenda imazhit dhe vendndodhja e tyre atje Ă«shtĂ« caktuar nĂ« vargun me etiketĂ«n 4, nĂ« rastin tonĂ« Ă«shtĂ« /opt/app-root/output/. Po tĂ« kujtoni, pikĂ«risht aty vendosen skedarĂ«t e gjeneruar nga rezultatet e ndĂ«rtimit tĂ« aplikacionit tonĂ«.

Folderi i destinacionit, i caktuar nĂ« afatin me etiketĂ«n 5 – Ă«shtĂ« thjesht katalogu aktual (kjo Ă«shtĂ« gjithçka, kujtojmĂ«, qĂ« rrotullohet brenda njĂ« gjĂ«je magjike tĂ« quajtur OpenShift, dhe jo nĂ« kompjuterin tuaj lokal).

Sekcioni strategy – vargu me etiketĂ«n 6 – Ă«shtĂ« gjithashtu i ngjashĂ«m me konfigurimin e parĂ« tĂ« ndĂ«rtimit. VetĂ«m kĂ«tĂ« herĂ« do tĂ« pĂ«rdorim nginx-image-runtime, i cili Ă«shtĂ« parĂ« tashmĂ« nĂ« seksionin ImageStream.

NĂ« fund, vargu me etiketĂ«n 7 – Ă«shtĂ« seksioni i triggers, i cili aktivizon kĂ«tĂ« ndĂ«rtim çdo herĂ« kur ndryshon imazhi react-web-app-builder.

PĂ«rndryshe, ky shabllon pĂ«rmban njĂ« konfigurim mjaft standard tĂ« shpĂ«rndarjes, si dhe gjĂ«ra qĂ« lidhen me shĂ«rbimet dhe rrugĂ«t, por ne nuk do tĂ« thellohemi nĂ« kĂ«tĂ«. Vini re se imazhi qĂ« do tĂ« shpĂ«rndahet – Ă«shtĂ« imazhi react-web-app-runtime.

Zbatimi i aplikacionit

Pra, pasi kemi hedhur një vështrim në shabllon, le të shohim se si ta përdorim atë për të shpërndarë aplikacionin.

Mund të përdorim mjetin klient OpenShift të quajtur oc, për të shpërndarë shabllonin tonë:

$ find . | grep openshiftio | grep application | xargs -n 1 oc apply -f

$ oc new-app --template react-web-app -p SOURCE_REPOSITORY_URL=https://github.com/lholmquist/react-web-app

Komanda e parĂ« nĂ« skrinin e mĂ«sipĂ«rm – Ă«shtĂ« njĂ« mĂ«nyrĂ« e qĂ«llimshme inxhinierike pĂ«r tĂ« gjetur shabllonin ./openshiftio/application.yaml.

Komanda e dytë thjesht krijon një aplikacion të ri mbi bazën e këtij shablloni.

Pas përfundimit të këtyre komandave, do të shohim se kemi dy ndërtime:

Aplikacione moderne në OpenShift, pjesa 2: ndërtimet e lidhura të ndërtimeve të zinxhirit

Dhe duke u kthyer në ekranin Overview, do të shohim pod-in që është nisur:

Aplikacione moderne në OpenShift, pjesa 2: ndërtimet e lidhura të ndërtimeve të zinxhirit

NjĂ« klikim nĂ« lidhje – dhe ne do tĂ« kalojmĂ« nĂ« aplikacionin tonĂ«, i cili pĂ«rbĂ«n njĂ« faqe aplikacioni React App sipas parazgjedhjes:

Aplikacione moderne në OpenShift, pjesa 2: ndërtimet e lidhura të ndërtimeve të zinxhirit

Shtesa 1

Për adhuruesit e Angular kemi gjithashtu shembulli i aplikacionit.

Shablloni këtu është i njëjtë, përveç variablës OUTPUT_DIR.

Shtesa 2

Në këtë artikull ne përdorëm si server web NGINX, por është mjaft e lehtë ta zëvendësoni me Apache, thjesht ndryshoni në skedarin e shabllonit imazhi NGINX në imazhi Apache.

Përfundim

Në pjesën e parë të kësaj serie ne treguam se si të shpërndajmë shpejt aplikacione moderne web në platformën OpenShift. Sot ne shqyrtuam se çfarë bën imazhi Web App dhe si mund të kombinohet me një server web të pastër si NGINX me ndihmën e ndërtimeve të lidhura (chained build) për të krijuar një ndërtim më të përshtatshëm për kushte prodhimi. Në artikullin tjetër, përfundimtar të kësaj serie, ne do të tregojmë se si të drejtoni një server zhvillimi për aplikacionin tuaj në OpenShift dhe të sigurojmë sinkronizimin e skedarëve lokalë dhe atyre të largët.

Përmbajtja e kësaj serie artikujsh

  • Pjesa 1: si tĂ« shpĂ«rndajmĂ« aplikacione moderne web vetĂ«m me disa hapa;
  • Pjesa 2: si tĂ« aplikoni imazhin e ri S2I sĂ« bashku me imazhin ekzistues tĂ« serverit HTTP, si NGINX, duke pĂ«rdorur ndĂ«rtimet e lidhura OpenShift, pĂ«r tĂ« organizuar shpĂ«rndarjen nĂ« prodhim;
  • Pjesa 3: si tĂ« drejtoni njĂ« server zhvillimi nĂ« platformĂ«n OpenShift pĂ«r aplikacionin tuaj dhe tĂ« sinkronizoni me sistemin e skedarĂ«ve lokal.

Burime të tjera

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster