DĂŒnaamiline Docker-piltide koostamine ja deployimine werf'i abil versioonitud dokumentatsiooni saidi nĂ€itel

Oleme juba korduvalt rÀÀkinud oma GitOps-tööriistast werf, kuid seekord soovime jagada kogemusi projekti dokumentatsiooniga saidi koostamisest — werf.io (tema venekeelne versioon — ru.werf.io). See on tavaline staatiline sait, kuid selle kogumine on huvitav, kuna see on ĂŒles ehitatud dĂŒnaamilise arvu artefaktide kasutamisega.

DĂŒnaamiline Docker-piltide koostamine ja deployimine werf'i abil versioonitud dokumentatsiooni saidi nĂ€itel

Saidistruktuuri nĂŒanssidele: kĂ”igi versioonide jaoks ĂŒhtse menĂŒĂŒ genereerimine, vĂ€ljalaskeinfo lehed jne — ei hakka laskuma. Selle asemel keskendume dĂŒnaamilise kogumise kĂŒsimustele ja omadustele ning veidi ka sellega seotud CI/CD protsessidele.

Sissejuhatus: kuidas sait töötab

Alustame sellest, et dokumentatsioon werf'i kohta hoitakse koos tema koodiga. See seab arendusele teatud nĂ”uded, mis ĂŒletavad kĂ€esoleva artikli raame, kuid vĂ€hemalt vĂ”ib öelda, et:

  • Uued werf'i funktsioonid ei tohi ilmuda ilma dokumentatsiooni vĂ€rskendamiseta ja vastupidi, dokumentatsiooni muutused eeldavad uue werf'i versiooni vĂ€ljalaskmist;
  • Projektis on ĂŒsna intensiivne arendus: uusi versioone vĂ”ib tulla mitu korda pĂ€evas;
  • KĂ€igu kaudu uue dokumentatsiooni versiooniga saidi juurutamiseks manuaalsed toimingud on vĂ€hemalt vĂ€sitavad;
  • Projektis on vastu vĂ”etud semantilise lĂ€henemisega versioonihalduse, viie stabiilsuskanaliga. VĂ€ljalaskeprotsess hĂ”lmab versioonide jĂ€rjestikust lĂ€bimist kanalite kaudu stabiilsuse tĂ”stmise jĂ€rjekorras: alphas kuni rock-solid;
  • Saidil on venekeelne versioon, mis "elab ja areneb" (st mille sisu uuendatakse) paralleelselt pĂ”hiversiooniga (st ingliskeelse versiooniga).

Kuna peame kasutajalt kogu selle "sisemise köögi" varjama, pakkudes talle lihtsalt toimivat lahendust, oleme teinud eraldi installi ja vĂ€rskendamise tööriista werf'i jaoks — see on multiwerf. Piisab ainult vabastamisnumbrist ja stabiilsuskanali valimisest, mida olete valmis kasutama, ja multiwerf kontrollib, kas kanalil on uus versioon ja laadib selle vajadusel alla.

Saitide versioonide valimise menĂŒĂŒs on saadaval viimased werf'i versioonid igas kanalis. Vaikimisi avatakse aadressil werf.io/documentation kĂ”ige stabiilsema kanali versioon viimasele vĂ€ljaandele — samuti indekseeritakse see otsingumootorites. Kanalite dokumentatsioon on saadaval eraldi aadressidel (nĂ€iteks, werf.io/v1.0-beta/documentation beta vĂ€ljaande 1.0 jaoks).

KokkuvÔttes on saidil saadaval jÀrgmised versioonid:

  1. juure (avajalik),
  2. iga aktiivse vÀrskenduse kanali jaoks iga versiooni jaoks (nÀiteks, werf.io/v1.0-beta).

Spetsiifilise veebilehe versiooni genereerimiseks piisab ĂŒldjuhul selle kompileerimise tegemisest Jekyll, kĂ€ivitades vastava kĂ€su kataloogis /docs werf'i hoidlas (jekyll build), enne kui vahetate vajalikule versioonile Git-sildi.

Olgu lisatud, et:

  • kompileerimisel kasutatakse ise utiliiti (werf);
  • CI/CD protsessid on rajatud GitLab CI peale;
  • ja see kĂ”ik töötab muidugi Kuberneteses.

Ülesanded

Formuleerime nĂŒĂŒd ĂŒlesanded, arvestades kogu kirjeldatud spetsiifikat:

  1. PÀrast werf'i versiooni vahetamist igal vÀrskenduste kanalil dokumendid veebilehe peal peavad automaatselt uuenduma.
  2. Arenduseks peab olema vÔimalus aeg-ajalt vaadata veebilehe eelvaateid.

Veebilehe ĂŒmberkompileerimine peab toimuma pĂ€rast versiooni vahetamist igal kanalil vastavatelt Git-siltidelt, kuid pildi koostamise protsessis saame jĂ€rgmised omadused:

  • Kuna versioonide loetelu kanalites muutub, tuleb ĂŒmberkompileerimise teha ainult nende dokumentide jaoks, kus versioon on muutunud. LĂ”ppude lĂ”puks ei ole ilus kĂ”ike uuesti kokku panna.
  • Vabade versioonide komplekt vĂ”ib muutuda. Teatud hetkel vĂ”ib nĂ€iteks mitte olla versiooni stabiilsemates kanalites, nagu varakult juurdepÀÀs 1.1, kuid aja jooksul need ilmuvad — ei ole ju mĂ”tet sellisel juhul kogumist kĂ€sitsi muuta?

Selgub, et kompileerimine sÔltub muutuvaid vÀliseid andmeid.

Rakendamine

LĂ€henemisviisi valik

Alternatiivina vÔib iga vajaliku versiooni kÀivitada eraldi pod'ina Kuberneteses. Selline lahendus hÔlmab suuremat objekti arvu klastris, mis kasvab koos wersi stabiilsete vÀljaannetega. Ja see omakorda toob kaasa keerukama hoolduse: igal versioonil on oma HTTP-server, kuid vÀikese koormusega. Muidugi toob see endaga rohkem ressursikulu.

Me lĂ€ksime teed kĂ”igi vajalike versioonide kokku kompileerimise ĂŒhe pildina. KĂ”ikide veebilehe versioonide kompileeritud staatika asub NGINX konteineris ja vastav liiklus jĂ”uab vastava rakenduse kaudu NGINX Ingress'i. Lihtne struktuur — stateless-rakendus — vĂ”imaldab kergesti skaleerida rakendust (sĂ”ltuvalt koormusest) Kubernetes'i enda vahenditega.

Kui olla tĂ€psem, siis kogume kaks pilti: ĂŒks production-joone jaoks, teine — lisaks, dev-joone jaoks. TĂ€iendavat pilti kasutatakse (kĂ€ivitatakse) ainult dev-joonel koos pĂ”higa ning see sisaldab veebilehe versiooni ĂŒlevaate commit'ist, samas kui suunamine nende vahel toimub Ingress-resursside kaudu.

werf vs git clone ja artefaktid

Nagu juba mainitud, et genereerida veebilehe staatika konkreetse dokumentatsiooni versiooni jaoks, tuleb teha ĂŒlesehitus, lĂŒlitudes vastavasse repositooriumi silti. Seda oleks vĂ”imalik teha ka repositooriumi kloonimise teel iga kord ĂŒlesehitamise ajal, valides sobivad sildid loendist. Siiski on see ĂŒsna ressursimahukas tegevus ning nĂ”uab keerukate juhiste kirjutamist... Teine tĂ”sine miinus on see, et sellisel lĂ€henemisel pole vĂ”imalik midagi ĂŒlesehitamise ajal vahemĂ€llu salvestada.

Siin tuleb meile appi itse utiliit werf, mis rakendab nutikat vahemĂ€llu salvestamist ja vĂ”imaldab kasutada vĂ€lishoidlaid. Werfi kasutamine koodi lisamiseks repositooriumist kiirendab ĂŒlesehitust mĂ€rgatavalt, kuna werf kloonib repositooriumi pĂ”himĂ”tteliselt ĂŒhe korra ja seejĂ€rel teeb ta seda fetch vajadusel. Lisaks, andmete lisamisel repositooriumist saame valida ainult vajalikud kataloogid (meie puhul on see kataloog docs), mis vĂ€hendab oluliselt lisatavate andmete hulka.

Kuna Jekyll on tööriist staatika kompileerimiseks ja pole vajalik lÔpppildis, oleks mÔistlik teostada kompileerimine werf artefaktis, ja lÔpppildisse importida ainult kompileerimise tulemus..

Kirjutame werf.yaml

Nii et oleme otsustanud, et kompileerime iga versiooni eraldi werf artefakti. Kuid me ei tea, kui palju neist artefaktidest ĂŒlesehitamise ajal tuleb, seetĂ”ttu ei saa me kirjutada fikseeritud ĂŒlesehituse konfiguratsiooni (tegelikult saame, aga see pole kuigi efektiivne).

werf vĂ”imaldab kasutada Go-malle oma konfiguratsioonifailis (werf.yaml), mis annab vĂ”imaluse luua konfi "reĆŸiimis" sĂ”ltuvalt vĂ€listest andmetest (just seda, mida vajame!). VĂ€listena esindavad meie puhul versioonide ja vĂ€ljaannete teave, mille pĂ”hjal koondame vajaliku arvu artefakte ja saame tulemuseks kaks pilti: werf-doc ja werf-dev erinevatel joonetel kĂ€ivitamiseks.

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

  • RELEASES — rida vabastuste loendist ja vastava versiooni werf'i praegusest versioonist, loendina koos vÀÀrtuste vahelise tĂŒhikuga formaadis %. NĂ€idis: 1.0%v1.0.4-beta.20
  • CHANNELS — rida kanalite loendist ja vastava versiooni werf'i praegusest versioonist, loendina koos vÀÀrtuste vahelise tĂŒhikuga formaadis %. NĂ€idis: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — werf'i versioon, mis kuvatakse vaikimisi veebilehel (ei ole alati vajalik kuvada dokumentatsiooni kĂ”rgeima versiooni jĂ€rgi). NĂ€ide: v1.0.4-beta.20
  • REVIEW_SHA — review-commit'i hash, millest tuleb genereerida versioon testimise kontuurile.

Need muutujad tĂ€idetakse GitLab CI pipeline'is, ja kuidas tĂ€pselt — on allpool kirjeldatud.

Esmalt, mugavuse huvides, mÀÀrame werf.yaml Go-muutujate, andes neile vÀÀrtused keskkonna muutujatest:

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

Artefaktiloend versiooni staatikas on peaaegu kĂ”igis vajalikutes juhtudel (sealhulgas, juureversiooni ja dev-kontuuride versioonide genereerimisel) sama. SeetĂ”ttu toome selle eraldi plokki funktsiooni kaudu define — edasise uuesti kasutamise vĂ”imaldamiseks include. Mallile edastame jĂ€rgmised argumendid:

  • Version — genereeritud versioon (sildi nimi);
  • Kanal — uuenduste kanali nimi, mille jaoks artefakt genereeritakse;
  • Commit — commit'i hash, kui artefakt genereeritakse review-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 }}

Artefaktil peab olema ainulaadne. Selle saavutamiseks saame nÀiteks lisada kanali nime (muutuja .Channel) artefakti nime sufiksina: artifact: doc-{{ .Channel }}. Kuid tuleb mÔista, et artefaktid importimisel tuleb viidata samadele nimedele.

Artefakti kirjelduseks kasutatakse werf'i funktsiooni mounting. MÀÀrates teenuse kausta build_dir , saab Jekyll'i cache'i sÀilitada pipeline'ide kÀivituste vahel, mis kiirendab oluliselt uuesti koostamist..

Samuti vĂ”isite mĂ€rgata faili releases.yml — see on YAML-fail, mis sisaldab andmeid versioonide kohta, mis pĂ€rinevad github.com (artefakt, mis saadakse pipeline'i kĂ€ivitamise kĂ€igus). See on vajalik saidi koostamisel, aga artiklis on meie jaoks see huvitav, et selle seisund mĂ”jutab ainult ĂŒhe artefakti uuesti koostamist — artefakti, mis on peamise versiooni sait (muid esemeid ei ole vaja).

See on realiseeritud tingimuslikku operaatorit kasutades if Go-mallid ja konstruktsioon {{ $Root.Files.Get "releases.yml" | sha256sum }} staadiumis etapp. See how it works: during the assembly of the artifact for the root version (variable .Channel vÔrdne root) the file hash releases.yml affects the signature of the entire stage, as it is a component of the Ansible task name (parameter nimi). Thus, when changing the content failist releases.yml the corresponding artifact will be rebuilt.

Also note the work with the external repository. In the artifact image from the werf repository, only the directory /docsis added, depending on the provided parameters, the data of the required tag or review commit is added.

To use the artifact template for generating descriptions of the artifact for the given versions of channels and releases, we organize a loop over the variable .WerfVersions ja werf.yaml:

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

Since the loop will generate several artifacts (we hope for this), we need to consider the separator between them — the sequence --- (for more details on the configuration file syntax see dokumentatsioon). As established earlier, when calling the template in the loop, we pass the parameters of the version, URL, and root context.

Similarly, but without a loop, we call the artifact template for 'special cases': for the root version, as well as for the version from the review commit:

{{ 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 }}

Note that the artifact for the review commit will only be assembled if the variable is set .WerfReviewCommit.

The artifacts are ready — it's time to tackle the import!

The final image intended for deployment in Kubernetes is a regular NGINX, into which a server configuration file nginx.conf and static files from the artifacts are added. In addition to the root version artifact of the site, we need to repeat the loop over the variable .WerfVersions for importing the artifacts of the channel and release versions + adhere to the naming rule for artifacts, which we accepted earlier. Since each artifact stores site versions for two languages, we import them into the locations provided by the configuration.

Description of the final image werf-doc

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 -}}

LisandvĂ€ljund, mis koos pĂ”himĂ”ttelisega kĂ€ivitatakse dev-kontuuris, sisaldab ainult kahte versiooni veebilehest: versiooni review-kohustusest ja veebilehe juurveebiversioon (seal on ĂŒhised varad ja, kui mĂ€letate, andmed versioonide kohta). Seega erineb lisandvĂ€ljund pĂ”himĂ”ttelisest ainult importimise sektsiooni poolest (ja loomulikult nimest):

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 juba eespool tĂ€hele pandud, genereeritakse review-kohustuse artefakt ainult siis, kui on seadistatud keskkonnamuutuja REVIEW_SHA. Üldiselt ei oleks werf-dev vĂ€ljundi genereerimist ĂŒldse vaja, kui keskkonnamuutujat pole REVIEW_SHA, kuid selleks, et poliitikat mööda koristamine Docker-vĂ€ljundites werfis töötaks werf-dev-i puhul, jĂ€tame selle toimetama ainult juurveebiversiooni artefaktiga (niikuinii on see juba koostatud), et lihtsustada torustiku struktuuri.

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

Torustik GitLab CI-s ja dĂŒnaamilise koostamise eripĂ€rad

Koostamise kÀivitamisel peame seadistama keskkonnamuutujad, mida kasutatakse werf.yaml. See ei hÔlma muutujaid REVIEW_SHA, mille seadistame torustiku kÀivitamisel GitHubi kettast.

Vajaduste vÀliste andmete genereerimise viime Bash-skriptisse generate_artifacts, mis genereerib kaks artefakti GitLabi torustikus:

  • fail releases.yml versioonide andmetega,
  • fail common_envs.sh, mis sisaldab ekspordiks mĂ”eldud keskkonnamuutujaid.

Faili sisu generate_artifacts leiate meie nÀidisveebide repos. Andmete hankimine ei ole artikli teema, kuid fail common_envs.sh on meie jaoks oluline, kuna see mÔjutab werfi tööd. NÀidis tema 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'

Seda skripti vÀljundit saab kasutada nÀiteks Bash-funktsiooni kaudu source.

Ja nĂŒĂŒd kĂ”ige huvitavam osa. Et nii rakenduse koostamine kui ka juurutamine töötaksid Ă”igesti, on hĂ€davajalik tagada, et werf.yaml oli on ĂŒhesugune vĂ€hemalt ĂŒhes pipeline'is. Kui seda tingimust ei tĂ€ideta, siis kudu stages'i allkirjad, mida werf koostamisel ja nĂ€iteks juurutamisel arvutab, on erinevad. See toob kaasa juurutusvea, kuna vajalik juurutamiseks mĂ”eldud pilt puudub.

TeisisĂ”nu, kui saidi pildi koostamise ajal on vĂ€ljaannete ja versioonide teave ĂŒks, kuid juurutamise hetkel ilmub uus versioon ja keskkonna muutujatel on muud vÀÀrtused, siis juurutus ebaĂ”nnestub: uus versioon pole veel koostatud.

Kui genereerimine werf.yaml sĂ”ltub vĂ€listest andmetest (nĂ€iteks kehtivate versioonide nimekirjast, nagu meie puhul), siis selliste andmete koosseis ja vÀÀrtused peavad olema fikseeritud pipeline'i raames. See on eriti oluline, kui vĂ€lised parameetrid muutuvad ĂŒsna sageli.

Me saame vĂ€liseid andmeid hankida ja fikseerida pipeline'i esimeses etapis GitLabis (Prebuild) ja edastame need edasi GitLab CI arhiivina. See vĂ”imaldab kĂ€ivitada ja uuesti kĂ€ivitada pipeline'i ĂŒlesandeid (koostamine, juurutamine, puhastamine) sama konfiguratsiooni alusel werf.yaml.

Etapi sisu Prebuild failist .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

Fikseerides vĂ€lised andmed arhivaidina, saab lĂ€bi viia koostamise ja juurutamise kasutades GitLab CI standardseid etappe: Build ja Deploy. Me kĂ€ivitame pipeline'i GitHubi werfi repositooriumi hĂŒdrofooride kaudu (st. muudatuste korral GitHubis). Nende jaoks saab andmeid vĂ”tta GitLab projekti seadete alt, andmeosa CI / CD seadistused -> Pipeline'i kĂ€ivitajad, seejĂ€rel loome GitHubis vastava Webhook'i (Settings -> Webhooks).

Koostamisetapp nÀeb vÀlja jÀrgmine:

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 koostamisetappi kaks arhivaati eelnevalt staadiumist Prebuild, nii et eksporteerime muutujad ettevalmistatud sisendandmete kaudu source common_envs.sh. KĂ€ivitame kogumise etappi kĂ”igis olukordades, vĂ€lja arvatud ajastatud torujuhtme kĂ€ivitamise puhul. Ajakava alusel kĂ€ivitatakse meil torujuhe puhastamiseks — sel juhul ei ole kogumine vajalik.

Deployimise etapis kirjeldame kahte ĂŒlesannet — eraldi production- ja dev-kontuuride deployimiseks, kasutades YAML-malli:

.base_deploy: &base_deploy
  etapp: deploy
  skript:
    - 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
  sÔltuvused:
    - Eelnevalt ehitatud
  vÀlja arvatud:
    refs:
      - schedules

Deploy to Production:
  <<: *base_deploy
  muutujad:
    WERF_KUBE_CONTEXT: prod
  keskkond:
    nimi: production
    url: werf.io
  ainult:
    refs:
      - master
  vÀlja arvatud:
    muutujad:
      - $REVIEW_SHA
    refs:
      - schedules

Deploy to Test:
  <<: *base_deploy
  muutujad:
    WERF_KUBE_CONTEXT: dev
  keskkond:
    nimi: test
    url: werf.test.flant.com
  vÀlja arvatud:
    refs:
      - schedules
  ainult:
    muutujad:
      - $REVIEW_SHA

Ülesanded erinevad pĂ”himĂ”tteliselt ainult klastrikonteksti mÀÀramise poolest, kuhu werf peaks deployima (WERF_KUBE_CONTEXT), ja keskkonna muutujate mÀÀramise (environment.name ja environment.url), mis seejĂ€rel kasutatakse Helm-uudiste mallides. Mallide sisu ei hakka tooma, kuna seal ei ole meie arutatud teema jaoks midagi huvitavat, kuid neid saate leida artikli hoidlast.

LÔppviimistlus

Kuna werfi versioonid ilmuvad ĂŒsna tihti, ilmuvad ka uued pildid tihti ning Docker Registry suureneb pidevalt. SeetĂ”ttu on kohustuslik konfigureerida piltide automaatne puhastamine poliitikate jĂ€rgi. Seda on vĂ€ga lihtne teha.

Rakendamiseks on vajalik:

  • Lisada puhastamise etapp .gitlab-ci.yml;
  • Lisada puhastamise ĂŒlesande perioodiline tĂ€itmine;
  • Seada keskkonnamuutuja kirjutamiseks oma juurdepÀÀsu tokeniga.

Lisame puhastamise etapi .gitlab-ci.yml:

Cleanup:
  etapp: cleanup
  skript:
    - 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
  ainult:
    refs:
      - schedules

Peaaegu kĂ”ik, mida me juba varem nĂ€gime — puhastamiseks tuleb eelnevalt Docker Registry'sse autoriseeruda tokeniga, mis omab Ă”igusi piltide kustutamiseks Docker Registry's (automaatsetelt genereeritud tokenitel, mis on GitLabi CI ĂŒlesannete jaoks vĂ€lja antud, selliseid Ă”igusi ei ole). Token tuleb eelnevalt GitLabis registreerida ja selle vÀÀrtus mÀÀrata keskkonnamuutujas WERF_IMAGES_CLEANUP_PASSWORD projekti (CI/CD seadistused -> Muutujad).

Puhastamise ĂŒlesande lisamine vajaliku ajastusega toimub CI/CD ->
Ajakavad
.

KÔik: projekt Docker Registry's ei kasva enam pidevalt kasutamata piltide tÔttu.

Praktika lÔpus meenutan, et artikli tÀielikud nimekirjad on saadaval Git:

Tulemus

  1. Meil on loogiline ehitusstruktuur: ĂŒks artefakt ĂŒhe versiooni jaoks.
  2. Kogumine on universaalne ja ei vaja kÀsitsi muudatusi uute werf versioonide vÀljalaskmisel: dokumentatsioon veebilehel vÀrskendatakse automaatselt.
  3. Kogutakse kaks pilti erinevate kontuuride jaoks.
  4. Töötab kiiresti, kuna maksimaalselt kasutatakse vahemĂ€lu — uue werf versiooni vĂ€ljalaskmisel vĂ”i GitHub hook'i kutsumise ajal review-commit'i jaoks — toimub ainult vastava artefakti ĂŒmberkoostmine muudetud versiooniga.
  5. Ei pea muretsema kasutamata piltide eemaldamise pÀrast: werf poliitikate jÀrgi puhastamine toetab korda Docker Registry's.

JĂ€reldused

  • Werf'i kasutamine vĂ”imaldab kogemisel töötada kiiresti, tĂ€nu nii koondamise vahemĂ€lule kui ka vĂ€liste hoidlate töö kĂ€igus toimuvatele vahemĂ€ludele.
  • Töötamine vĂ€liste Git-hoidlate puhul vabastab vajadusest kloonida hoidlat iga kord tĂ€ielikult vĂ”i leiutada ratast nutika optimeerimisloogikaga. werf kasutab vahemĂ€lu ja kloonib ainult ĂŒhe korra ning seejĂ€rel kasutab fetch ja ainult vajadusel.
  • Go-mallide kasutamise vĂ”imalus ehituskonfiguratsiooni failis werf.yaml vĂ”imaldab kirjeldada ehitamist, mille tulemus sĂ”ltub vĂ€listest andmetest.
  • Werf'i mountimist kasutamine kiirendab oluliselt artefaktide kogumist — tĂ€nu vahemĂ€lule, mis on ĂŒhine kĂ”igi pipeline'ide jaoks.
  • Werf lihtsustab puhastamise seadistamist, mis on eriti oluline dĂŒnaamilise kogumise korral.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster