Dockeri kujutiste dĂŒnaamiline kokkupanek ja juurutamine werf-iga, kasutades versioonitud dokumentatsiooni saidi nĂ€idet

Oleme oma GitOps tööriistast juba mitu korda rÀÀkinud. werf, ja seekord tahaksime jagada kogemust veebisaidi kokkupanekust koos projekti enda dokumentatsiooniga - werf.io (selle venekeelne versioon on ru.werf.io). See on tavaline staatiline sait, kuid selle kokkupanek on huvitav selle poolest, et see on ehitatud dĂŒnaamilise hulga artefaktide abil.

Dockeri kujutiste dĂŒnaamiline kokkupanek ja juurutamine werf-iga, kasutades versioonitud dokumentatsiooni saidi nĂ€idet

Me ei sĂŒvene saidi struktuuri nĂŒanssidesse: kĂ”igi versioonide jaoks ĂŒhise menĂŒĂŒ genereerimisse, versioonide kohta kĂ€iva teabelehe loomisesse jne. Selle asemel keskendume dĂŒnaamilise assembleri probleemidele ja funktsioonidele ning veidi ka sellega kaasnevatele CI/CD protsessidele.

Sissejuhatus: Kuidas sait töötab

Alustame sellest, et WERF-i dokumentatsioon salvestatakse koos selle koodiga. See seab arendusele teatud nĂ”uded, mis ĂŒldiselt jÀÀvad selle artikli raamidest vĂ€lja, aga vĂ€hemalt saame öelda, et:

  • Uusi Werf-funktsioone ei tohiks avaldada ilma dokumentatsiooni uuendamata ja vastupidi, kĂ”ik muudatused dokumentatsioonis tĂ€hendavad Werf-i uue versiooni avaldamist;
  • Projektil on ĂŒsna intensiivne arendustegevus: uusi versioone saab vĂ€lja anda mitu korda pĂ€evas;
  • KĂ”ik kĂ€sitsi tehtavad toimingud saidi juurutamiseks uue dokumentatsiooniversiooniga on vĂ€hemalt tĂŒĂŒtud;
  • Projekt kasutab semantilist lĂ€henemist versioonide koostamine, 5 stabiilsuskanaliga. VĂ€ljalaskeprotsess hĂ”lmab versioonide jĂ€rjestikust lĂ€bimist kanalite kaudu stabiilsuse suurenemise jĂ€rjekorras: alfast kivikĂ”vaks;
  • Saidil on venekeelne versioon, mis „elab ja areneb” (st mille sisu uueneb) paralleelselt pĂ”hiversiooniga (st ingliskeelsega).

Et varjata kogu seda „sisemist tööd“ kasutaja eest ja pakkuda talle midagi, mis „lihtsalt töötab“, tegime eraldi tööriist Werfi installimiseks ja vĂ€rskendamiseks - Kas multiwerfSa pead lihtsalt mÀÀrama vĂ€ljalaske numbri ja stabiilsuskanali, mida oled valmis kasutama, ning multiwerf kontrollib, kas kanalil on uus versioon ja vajadusel laadib selle alla.

Werfi uusimad versioonid on saadaval iga kanali versioonivaliku menĂŒĂŒs saidil. Vaikimisi aadressil werf.io/dokumentatsioon avatakse uusima versiooni kĂ”ige stabiilsem kanaliversioon – seda indekseerivad ka otsingumootorid. Kanali dokumentatsioon on saadaval eraldi aadressidel (nĂ€iteks werf.io/v1.0-beta/dokumentatsioon beetaversiooni 1.0 jaoks).

Kokku on saidil saadaval jÀrgmised versioonid:

  1. root (avaneb vaikimisi),
  2. iga vÀljalaske iga aktiivse uuenduskanali kohta (nt werf.io/v1.0-beta).

Saidi konkreetse versiooni genereerimiseks piisab ĂŒldiselt selle kompileerimisest, kasutades Jekyll, töötab kataloogis /docs werf hoidla vastav kĂ€sk (jekyll build), olles eelnevalt vajaliku versiooni Git-sildile lĂŒlitunud.

JÀÀb ĂŒle vaid lisada, et:

  • montaaĆŸiks kasutatakse utiliiti ennast (werf);
  • CI/CD protsessid on ĂŒles ehitatud GitLab CI baasil;
  • ja kĂ”ik see töötab muidugi Kuberneteses.

ĂŒlesanded

NĂŒĂŒd sĂ”nastame ĂŒlesanded, mis vĂ”tavad arvesse kĂ”iki kirjeldatud eripĂ€rasid:

  1. PĂ€rast Werf-versiooni muutmist mis tahes uuenduskanalil saidi dokumentatsioon peaks automaatselt uuenema.
  2. Arenemiseks pead sa vahel suutma vaata saidi eelvaateid.

Saidi uuesti kompileerimine tuleb lÀbi viia pÀrast mis tahes kanali versiooni muutmist vastavatest Giti siltidest, kuid pildi kokkupaneku kÀigus saame jÀrgmised funktsioonid:

  • Kuna kanalite versioonide loend muutub, on vaja dokumentatsioon uuesti luua ainult nende kanalite jaoks, kus versioon on muutunud. LĂ”ppude lĂ”puks pole kĂ”ige nullist uuesti loomine eriti ilus.
  • VĂ€ljalasete kanalite komplekt vĂ”ib muutuda. NĂ€iteks ei pruugi mingil ajahetkel olla kanalites versiooni, mis oleks stabiilsem kui varajase juurdepÀÀsuga 1.1 vĂ€ljalase, kuid need ilmuvad aja jooksul – sel juhul ei saa jĂ€rku kĂ€sitsi muuta, eks?

Selgub, et assamblee sÔltub vÀliste andmete muutmisest.

Đ Đ”Đ°Đ»ĐžĐ·Đ°Ń†ĐžŃ

LĂ€henemisviisi valimine

Teise vÔimalusena saate iga vajaliku versiooni kÀivitada eraldi podina Kuberneteses. See valik tÀhendab klastris suuremat objektide arvu, mis kasvab koos stabiilsete WERF-versioonide arvu suurenemisega. Ja see omakorda tÀhendab keerukamat hooldust: igal versioonil on oma HTTP-server vÀikese koormusega. Loomulikult toob see kaasa ka suuremad ressursikulud.

Me lĂ€ksime sama teed kĂ”igi vajalike versioonide jĂ€rgud ĂŒhes pildisSaidi kĂ”igi versioonide kompileeritud staatika asub NGINX-iga konteineris ja liiklus vastavasse juurutusse tuleb NGINX Ingressi kaudu. Lihtne struktuur – olekuteta rakendus – vĂ”imaldab teil juurutust (sĂ”ltuvalt koormusest) Kubernetes'i enda abil hĂ”lpsalt skaleerida.

TĂ€psemalt öeldes ehitame kaks pilti: ĂŒhe tootmisahela jaoks ja teise arendusahela jaoks. Lisapilti kasutatakse (kĂ€itatakse) ainult arendusahelas koos pĂ”hipildiga ning see sisaldab saidi versiooni ĂŒlevaate commit'ist ja nende vaheline marsruutimine toimub Ingress-ressursside abil.

Werf vs Git kloon ja artefaktid

Nagu mainitud, peate dokumentatsiooni konkreetse versiooni saidi staatiliste andmete genereerimiseks ehitama, lĂŒlitudes vastavale repositooriumi sildile. Seda saab teha ka repositooriumi iga ehitamise ajal kloonides, valides loendist vastavad sildid. See on aga ĂŒsna ressursimahukas toiming ja nĂ”uab lisaks mittetriviaalsete juhiste kirjutamist... Teine tĂ”sine puudus on see, et selle lĂ€henemisviisi korral pole ehitamise ajal vĂ”imalik midagi vahemĂ€llu salvestada.

Siin tuleb meile appi Werfi utiliit ise, rakendades nutikas vahemĂ€llu salvestamine ja vĂ”imaldab teil kasutada vĂ€lised repositooriumid. Repositooriumist koodi lisamine funktsiooniga werf kiirendab oluliselt ehitust, kuna werf kloonib repositooriumi sisuliselt ĂŒks kord ja seejĂ€rel kĂ€ivitub ainult fetch vajadusel. Lisaks saame hoidlast andmeid lisades valida ainult vajalikud kataloogid (meie puhul on see kataloog docs), mis vĂ€hendab oluliselt lisatavate andmete hulka.

Kuna Jekyll on staatiliste failide kompileerimiseks loodud tööriist ja seda pole lÔplikus pildis vaja, oleks loogiline see kompileerida artefakti werfja lÔplikul pildil impordi ainult kompileerimise tulemus.

Me kirjutame werf.yaml

Seega otsustasime iga versiooni koostada eraldi Werf-artefaktina. Siiski me me ei tea, kui palju neid esemeid kokkupaneku ajal tekib, seega me ei saa kirjutada fikseeritud ehituskonfiguratsiooni (rangelt vÔttes saame, aga see poleks eriti efektiivne).

werf vÔimaldab teil kasutada Mine mallidele oma konfiguratsioonifailis (werf.yaml) ja see teeb vÔimalikuks genereeri konfiguratsioon "lennult" sÔltuvalt vÀlisandmetest (mida me vajame!). Meie puhul on vÀlisandmed teave versioonide ja vÀljalasete kohta, mille pÔhjal kogume vajaliku arvu esemeid ja saame tulemuseks kaks pilti: werf-doc О werf-dev erinevate vooluringide kÀivitamiseks.

VÀlised andmed edastatakse keskkonnamuutujate kaudu. Nende koostis on jÀrgmine:

  • RELEASES — rida vĂ€ljalasete loendi ja vastava WERFi praeguse versiooniga, mis on tĂŒhikutega eraldatud vÀÀrtuste loend kujul <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>... NĂ€ide: 1.0%v1.0.4-beta.20
  • CHANNELS — rida kanalite loendi ja vastava WERFi praeguse versiooniga, mis on tĂŒhikutega eraldatud vÀÀrtuste loendi kujul vormingus <КАНАЛ>%<НОМЕР_ВЕРСИИ>... NĂ€ide: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — werf vĂ€ljalaske versiooni kuvamine saidil vaikimisi (dokumentatsiooni kuvamine suurima vĂ€ljalaske numbri jĂ€rgi pole alati vajalik). NĂ€ide: v1.0.4-beta.20
  • REVIEW_SHA — ĂŒlevaatuse commit'i rĂ€si, millest testringi versioon tuleks ehitada.

Need muutujad tÀidetakse GitLabi CI torujuhtmes ja tÀpset kirjeldust leiate allpool.

Esiteks, mugavuse huvides, mÀÀratleme werf.yaml Mine mallimuutujatele, mÀÀrates neile keskkonnamuutujate vÀÀrtused:

{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }}

Saidi staatilise versiooni kompileerimise artefakti kirjeldus on ĂŒldiselt kĂ”igil vajalikel juhtudel sama (sh nii juurversiooni kui ka dev-contouri versiooni genereerimine). SeetĂ”ttu viime selle funktsiooni abil eraldi plokki. define — hilisemaks taaskasutamiseks abiga includeEdastame mallile jĂ€rgmised argumendid:

  • Version — genereeritud versioon (sildi nimi);
  • Channel — uuenduskanali nimi, mille jaoks artefakt genereeritakse;
  • Commit — commit hash, kui artefakt genereeritakse ĂŒlevaatuse commit'i jaoks;
  • kontekst.

Artefakti malli kirjeldus

{{- define "doc_artifact" -}}
{{- $Root := index . "Root" -}}
artifact: doc-{{ .Channel }}
from: jekyll/builder:3
mount:
- from: build_dir
  to: /usr/local/bundle
ansible:
  install:
  - shell: |
      export PATH=/usr/jekyll/bin/:$PATH
  - name: "Install Dependencies"
    shell: bundle install
    args:
      executable: /bin/bash
      chdir: /app/docs
  beforeSetup:
{{- if .Commit }}
  - shell: echo "Review SHA - {{ .Commit }}."
{{- end }}
{{- if eq .Channel "root" }}
  - name: "releases.yml HASH: {{ $Root.Files.Get "releases.yml" | sha256sum }}"
    copy:
      content: |
{{ $Root.Files.Get "releases.yml" | indent 8 }}
      dest:  /app/docs/_data/releases.yml
{{- else }}
  - file:
      path: /app/docs/_data/releases.yml
      state: touch
{{- end }}
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/
    - /app/ru_site/
  - file:
      dest: /app/docs/pages_ru/cli
      state: link
      src: /app/docs/pages/cli
  - shell: |
      echo -e "werfVersion: {{ .Version }}nwerfChannel: {{ .Channel }}" > /tmp/_config_additional.yml
      export PATH=/usr/jekyll/bin/:$PATH
{{- if and (ne .Version "review") (ne .Channel "root") }}
{{- $_ := set . "BaseURL" ( printf "v%s" .Channel ) }}
{{- else if ne .Channel "root" }}
{{- $_ := set . "BaseURL" .Channel }}
{{- end }}
      jekyll build -s /app/docs  -d /app/_main_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/tmp/_config_additional.yml
      jekyll build -s /app/docs  -d /app/_ru_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/app/docs/_config_ru.yml,/tmp/_config_additional.yml
    args:
      executable: /bin/bash
      chdir: /app/docs
git:
- url: https://github.com/flant/werf.git
  to: /app/
  owner: jekyll
  group: jekyll
{{- if .Commit }}
  commit: {{ .Commit }}
{{- else }}
  tag: {{ .Version }}
{{- end }}
  stageDependencies:
    install: ['docs/Gemfile','docs/Gemfile.lock']
    beforeSetup: '**/*'
  includePaths: 'docs'
  excludePaths: '**/*.sh'
{{- end }}

Artefakti nimi peab olema unikaalne. Selle saavutamiseks vÔime nÀiteks lisada kanali nime (muutuja vÀÀrtus .Channel) artefakti nime jÀrelliitena: artifact: doc-{{ .Channel }}Kuid peate mÔistma, et artefaktidest importimisel peate viitama samadele nimedele.

Artefakti kirjeldamisel kasutatakse jÀrgmist werf-tunnust: paigaldusPaigaldamine mÀÀratud teenusekataloogiga. build_dir vÔimaldab teil sÀilitada Jekylli vahemÀlu torujuhtme kÀivitamiste vahel, mis kiirendab oluliselt kokkupanekut.

VĂ”ib-olla olete mĂ€rganud ka faili kasutamist releases.yml — on YAML-fail, mille vĂ€ljalaskeandmeid on taotletud Github.com (torujuhtme kĂ€ivitamisel saadud artefakt). Seda on vaja saidi kompileerimisel, kuid artikli kontekstis on see meile huvitav, kuna selle olek sĂ”ltub ainult ĂŒhe artefakti uuesti kokkupanek — saidi juurversiooni artefakt (seda pole teistes artefaktides vaja).

See rakendatakse tingimusliku operaatori abil. if Mine mallidele ja konstruktsioonidele {{ $Root.Files.Get "releases.yml" | sha256sum }} etapis etapidSee toimib nii: juurversiooni artefakti loomisel (muutuja .Channel vĂ”rdub root) faili rĂ€si releases.yml mĂ”jutab kogu etapi signatuuri, kuna see on Ansible'i ĂŒlesande nime komponent (parameeter name). Seega, kui muutute sisu faili releases.yml vastav artefakt pannakse uuesti kokku.

Palun pöörake tĂ€helepanu ka vĂ€lise hoidlaga töötamisele. Artefakti pildil saidilt Werf-hoidlad, lisatakse ainult kataloog /docsja olenevalt edastatud parameetritest lisatakse koheselt vajaliku sildi vĂ”i ĂŒlevaate commit'i andmed.

Artefakti malli kasutamiseks ĂŒlekantud kanali versioonide ja vĂ€ljalasete artefakti kirjelduse genereerimiseks korraldame tsĂŒkli muutujate kaupa .WerfVersions ĐČ werf.yaml:

{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}

Kuna tsĂŒkkel genereerib mitu artefakti (loodame nii), on vaja arvestada nende eraldajaga - jĂ€rjestus --- (lisateavet konfiguratsioonifaili sĂŒntaksi kohta leiate jaotisest dokumentatsioon). Nagu me varem defineerisime, edastame tsĂŒklis malli kutsumisel versiooniparameetrid, URL-i ja juurkonteksti.

Samamoodi, aga ilma tsĂŒklita, nimetame artefakti malli "erilisteks juhtudeks": nii juurversiooni kui ka ĂŒlevaatuse commit'i versiooni jaoks:

{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root  | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root  | include "doc_artifact" }}
{{- end }}

Pane tĂ€hele, et ĂŒlevaatuse kinnituse artefakt luuakse ainult siis, kui muutuja on seatud. .WerfReviewCommit.

Artefaktid on valmis – aeg importima hakata!

Kuberneteses töötamiseks mĂ”eldud lĂ”plik pilt on tavaline NGINX, millele on lisatud serveri konfiguratsioonifail. nginx.conf ja staatika artefaktidest. Lisaks saidi juurversiooni artefaktile peame tsĂŒklit kordama ka muutuja kaupa .WerfVersions Kanali ja vĂ€ljalaskeversiooni artefaktide importimiseks + jĂ€rgige varem vastu vĂ”etud artefaktide nimetamise reeglit. Kuna iga artefakt salvestab saidi versioonid kahes keeles, impordime need konfiguratsioonis etteantud asukohtadesse.

LÔpliku werf-doc pildi kirjeldus

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Setup /etc/nginx/nginx.conf"
    copy:
      content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/assets
    - /app/ru_site/assets
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_main_site
  to: /app/main_site/v{{ $Channel }}
  before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_ru_site
  to: /app/ru_site/v{{ $Channel }}
  before: setup
{{ end -}}

Lisapilt, mis kĂ€ivitatakse arendusringkonnas koos pĂ”hipildiga, sisaldab ainult kahte saidi versiooni: ĂŒlevaatemuudatuse versiooni ja saidi juurversiooni (see sisaldab ĂŒhiseid ressursse ja, kui mĂ€letate, siis ka vĂ€ljalaskeandmeid). Seega erineb lisapilt pĂ”hipildist ainult impordiosa (ja muidugi nime) poolest:

image: werf-dev
...
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{- if .WerfReviewCommit  }}
- artifact: doc-review
  add: /app/_main_site
  to: /app/main_site/review
  before: setup
- artifact: doc-review
  add: /app/_ru_site
  to: /app/ru_site/review
  before: setup
{{- end }}

Nagu eespool mĂ€rgitud, genereeritakse ĂŒlevaatuse kinnituse artefakt ainult keskkonnamuutuja set kĂ€ivitamisel. REVIEW_SHAKui keskkonnamuutujat pole, oleks vĂ”imalik werf-dev-kujutist ĂŒldse mitte genereerida. REVIEW_SHA, aga selleks, et koristamine eeskirjade jĂ€rgi Werf-i Dockeri kujutised toimisid werf-dev kujutise puhul, jĂ€tame selle ehitamiseks ainult juurversiooni artefakti (see on niikuinii juba ehitatud), et lihtsustada torujuhtme struktuuri.

Ehitus on valmis! Liigume edasi CI/CD ja oluliste nĂŒansside juurde.

GitLabi CI torujuhe ja dĂŒnaamilise ehituse funktsioonid

Ehituse kÀivitamisel peame mÀÀrama keskkonnamuutujad, mida kasutatakse werf.yamlSee ei kehti muutuja REVIEW_SHA kohta, mille me mÀÀrame torujuhtme kutsumisel GitHubi konksu kaudu.

Vajalike vĂ€liste andmete moodustamise viime ĂŒle Bash-skripti. generate_artifacts, mis genereerib kaks GitLabi torujuhtme artefakti:

  • faili releases.yml koos vĂ€ljalaskeandmetega
  • faili common_envs.sh, mis sisaldab eksporditavaid keskkonnamuutujaid.

Faili sisu generate_artifacts leiad meie nÀidetega repositooriumidAndmete kogumine ise ei ole artikli teema, vaid fail. common_envs.sh on meile oluline, kuna sellest sÔltub Werfi toimimine. NÀide selle sisust:

export RELEASES='1.0%v1.0.6-4'
export CHANNELS='1.0-alpha%v1.0.7-1 1.0-beta%v1.0.7-1 1.0-ea%v1.0.6-4 1.0-stable%v1.0.6-4 1.0-rock-solid%v1.0.6-4'
export ROOT_VERSION='v1.0.6-4'

Sellise skripti vÀljundit saab kasutada nÀiteks Bash-funktsiooni abil. source.

NĂŒĂŒd tuleb kĂ”ige huvitavam osa. Selleks, et nii rakenduse kokkupanek kui ka juurutamine toimiksid korrektselt, on vaja veenduda, et werf.yaml oli sama vĂ€hemalt ĂŒhe torujuhtme seesKui see tingimus ei ole tĂ€idetud, siis on Werfi poolt assembleri ja nĂ€iteks juurutamise ajal arvutatud etapi signatuurid erinevad. See viib juurutamisveani, kuna juurutamiseks vajalik kujutis puudub.

TeisisÔnu, kui saidi kujutise kokkupaneku ajal on teave vÀljaannete ja versioonide kohta sama ning juurutamise ajal avaldatakse uus versioon ja keskkonnamuutujatel on erinevad vÀÀrtused, siis lÔpeb juurutamine veaga: uue versiooni artefakti pole ju veel kokku pandud.

Kui pĂ”lvkond werf.yaml sĂ”ltub vĂ€listest andmetest (nĂ€iteks praeguste versioonide loendist, nagu meie puhul), siis tuleks selliste andmete koostis ja vÀÀrtused torujuhtmes registreerida. See on eriti oluline, kui vĂ€lised parameetrid muutuvad ĂŒsna sageli.

Me saame vĂ€liste andmete vastuvĂ”tmine ja salvestamine GitLabi torujuhtme esimeses etapis (Eelnevalt koostatud) ja edastage need edasi kujul GitLabi CI artefaktidSee vĂ”imaldab teil sama konfiguratsiooniga kĂ€ivitada ja taaskĂ€ivitada torujuhtme ĂŒlesandeid (ehita, juurutada, puhastada). werf.yaml.

Lava sisu Eelnevalt koostatud faili .gitlab-ci.yml:

Prebuild:
  stage: prebuild
  script:
    - bash ./generate_artifacts 1> common_envs.sh
    - cat ./common_envs.sh
  artifacts:
    paths:
      - releases.yml
      - common_envs.sh
    expire_in: 2 week

Kui artefaktis on fikseeritud vÀlised andmed, saate selle luua ja juurutada GitLabi CI torujuhtme standardsete etappide abil: loomine ja juurutamine. Torujuhtme ise kÀivitame Werfi GitHubi repositooriumi konksude abil (st kui GitHubi repositooriumis on muudatusi). Nende andmed saab vÔtta GitLabi projekti omadustest jaotises CI/CD seaded -> Pipeline'i pÀÀstikudja seejÀrel looge vastav veebikonks GitHubis (Seaded -> Veebikonksud).

Ehitusetapp nÀeb vÀlja selline:

Build:
  stage: build
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf build-and-publish --stages-storage :local
  except:
    refs:
      - schedules
  dependencies:
    - Prebuild

GitLab lisab ehitusetapile kaks etapi artefakti Eelnevalt koostatud, seega ekspordime muutujad ettevalmistatud sisendandmetega konstruktsiooni abil source common_envs.shKĂ€ivitame ehitusetapi kĂ”igil juhtudel, vĂ€lja arvatud torujuhtme kĂ€ivitamine vastavalt ajakavale. Graafiku kohaselt kĂ€ivitame torujuhtme puhastamiseks – sel juhul pole ehitust vaja teostada.

Juurutamisetapis kirjeldame kahte ĂŒlesannet – eraldi juurutamiseks tootmis- ja arendusringkondadesse, kasutades YAML-malli:

.base_deploy: &base_deploy
  stage: deploy
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf deploy --stages-storage :local
  dependencies:
    - Prebuild
  except:
    refs:
      - schedules

Deploy to Production:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: prod
  environment:
    name: production
    url: werf.io
  only:
    refs:
      - master
  except:
    variables:
      - $REVIEW_SHA
    refs:
      - schedules

Deploy to Test:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: dev
  environment:
    name: test
    url: werf.test.flant.com
  except:
    refs:
      - schedules
  only:
    variables:
      - $REVIEW_SHA

Ülesanded erinevad pĂ”himĂ”tteliselt ainult klastri konteksti nĂ€itamise poolest, kuhu Werf peaks juurutamise teostama (WERF_KUBE_CONTEXT) ja kontuuri keskkonnamuutujate mÀÀramine (environment.name Đž environment.url), mida seejĂ€rel kasutatakse Helmi diagrammimallides. Me ei avalda mallide sisu, kuna vaadeldava teema kohta pole seal midagi huvitavat, kuid need leiate siit artikli repositooriumid.

LÔplik puudutus

Kuna WERF-i versioone avaldatakse ĂŒsna tihti, luuakse sageli uusi kujutisi ja Dockeri register kasvab pidevalt. SeetĂ”ttu on vaja seadistada automaatne kujutiste puhastamine poliitikate abil. Seda on vĂ€ga lihtne teha.

Rakendamiseks vajate:

  • Lisage puhastusetapp .gitlab-ci.yml;
  • Lisage puhastusĂŒlesande perioodiline tĂ€itmine;
  • Seadistage keskkonnamuutuja kirjutamisĂ”igusega tunnusega.

Lisa puhastusetapp .gitlab-ci.yml:

Cleanup:
  stage: cleanup
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - docker login -u nobody -p ${WERF_IMAGES_CLEANUP_PASSWORD} ${WERF_IMAGES_REPO}
    - werf cleanup --stages-storage :local
  only:
    refs:
      - schedules

Oleme peaaegu kĂ”ike seda eespool juba nĂ€inud – ainult et selle puhastamiseks peate esmalt Docker Registrysse sisse logima tokeniga, millel on Ă”igused Docker Registrys pilte kustutada (GitLab CI ĂŒlesande automaatselt vĂ€ljastatud tokenil selliseid Ă”igusi pole). Token tuleb GitLabis eelnevalt luua ja selle vÀÀrtus tuleb keskkonnamuutujas mÀÀrata. WERF_IMAGES_CLEANUP_PASSWORD projekti (CI/CD seaded -> Muutujad).

NĂ”utava ajakavaga puhastusĂŒlesande lisamine toimub CI/CD ->
Kavad
.

See on kÔik: teie Dockeri registriprojekt ei kasva enam pidevalt kasutamata piltidest.

Praktilise osa lÔpetuseks tahaksin teile meelde tuletada, et artikli tÀielikud loetelud on saadaval aadressil Git:

Tulemus

  1. Saime loogilise assamblee struktuuri: ĂŒks artefakt versiooni kohta.
  2. Assamblee on universaalne ega vaja Werfi uute versioonide vÀljaandmisel kÀsitsi muudatusi: saidi dokumentatsioon uueneb automaatselt.
  3. Erinevate kontuuride jaoks kogutakse kaks pilti.
  4. See toimib kiiresti, kuna vahemĂ€llu salvestamist kasutatakse maksimaalselt – kui avaldatakse uus werfi versioon vĂ”i kutsutakse GitHubi konksu ĂŒlevaatuse commit'iks, luuakse uuesti ainult vastav artefakt koos muudetud versiooniga.
  5. Pole vaja muretseda kasutamata piltide kustutamise pÀrast: Werfi poliitikapÔhine puhastus hoiab teie Dockeri registri korras.

JĂ€reldused

  • Werfi kasutamine vĂ”imaldab ehitusel kiiresti töötada tĂ€nu nii ehituse enda kui ka vĂ€liste repositooriumidega töötamise vahemĂ€llu salvestamisele.
  • VĂ€liste Giti repositooriumidega töötamine vĂ€listab vajaduse repositooriumi iga kord tĂ€ielikult kloonida vĂ”i keerulise optimeerimisloogika abil jalgratast leiutada. Werf kasutab vahemĂ€lu ja kloonib ainult ĂŒks kord ning seejĂ€rel kasutab fetch ja ainult siis, kui see on hĂ€davajalik.
  • VĂ”imalus kasutada Go malle ehituskonfiguratsioonifailis werf.yaml vĂ”imaldab kirjeldada assambleed, mille tulemus sĂ”ltub vĂ€listest andmetest.
  • Werfis paigaldamise kasutamine kiirendab oluliselt artefaktide kogumist - tĂ€nu vahemĂ€lule, mis on kĂ”igile torujuhtmetele ĂŒhine.
  • werf teeb puhastamise seadistamise lihtsaks, mis on eriti oluline dĂŒnaamiliste versioonide puhul.

PS

Loe ka meie blogist:

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster