DĂŒnaamiline Docker-piltide kogumine ja juurutamine werf abil versioonitud dokumentatsiooni veebisaidi nĂ€itel

Oleme juba korduvalt rÀÀkinud oma GitOps tööriistast werf, seekord tahame jagada kogemusi projekti dokumentatsiooniga saidi koostamisest — werf.io (tema venekeelne versioon — ru.werf.io). See on tavaline staatiline veebileht, kuid selle koostamine on huvitav selle poolest, et see on ĂŒles ehitatud dĂŒnaamiliste artefaktide arvuga.

DĂŒnaamiline Docker-piltide kogumine ja juurutamine werf abil versioonitud dokumentatsiooni veebisaidi nĂ€itel

Ei hakka sĂŒvenema saidi struktuuri nĂŒanssidesse: ĂŒhise menĂŒĂŒ genereerimine kĂ”igi versioonide jaoks, vĂ€ljalaskeinfot sisaldavad lehed jms — jÀÀme selle kĂ”rval. Selle asemel keskendume dĂŒnaamilise koosseisu kĂŒsimustele ja omadustele ning veidi ka CI/CD seotud protsessidele.

Sissejuhatus: kuidas veebisait on ĂŒles ehitatud

Alustame sellest, et werfi dokumentatsioon on salvestatud koos tema koodiga. See seab arendusele teatud nĂ”uded, mis ĂŒletavad ĂŒleĂŒldiselt selle artikli raamistikku, kuid vĂ€hemalt vĂ”ib öelda, et:

  • Werfi uued funktsioonid ei tohiks ilmuda ilma dokumentatsiooni uuendamiseta ja vastupidi, dokumentatsiooni muudatused eeldavad uue werfi versiooni vĂ€ljalaskmist;
  • Projektis toimub ĂŒsna intensiivne arendus: uusi versioone vĂ”ib vĂ€lja tulla mitu korda pĂ€evas;
  • Igasugused kĂ€sitsi teostatavad toimingud saidi juurutamiseks koos uue dokumentatsiooni versiooniga on vĂ€hemalt kurnavad;
  • Projektis on kasutusel semantilise versioonihalduse, kus on 5 stabiilsuse kanalit. VĂ€ljalaskmisprotsess hĂ”lmab versioonide jĂ€rkjĂ€rast liikumist kanalite kaudu stabiilsuse tĂ”stmise jĂ€rjekorras: alfaloomingust kuni rock-solid tasemeni;
  • Saidil on olemas venekeelne versioon, mis "elab ja areneb" (st selle sisu uuendatakse) paralleelselt peamise (st ingliskeelse) versiooniga.

Kuna soovime varjata kasutajalt kogu selle "siseellu", pakkudes talle seda, mis "lihtsalt töötab", oleme loonud eraldi installimise ja vĂ€rskendamise tööriista werf — see on multiwerf. Piisab, kui nĂ€itate vĂ€ljaandmise numbrit ja stabiilsuse kanalit, mida olete valmis kasutama, ja multiwerf kontrollib, kas kanalil on uus versioon, ning allalaadib selle vajadusel.

Versioonide valimise menĂŒĂŒs on saidil saadaval viimased werfi versioonid igas kanalil. Vaikselt, aadressil werf.io/documentation avatakse kĂ”ige stabiilsema kanali versioon viimase vĂ€ljaande jaoks — see on ka indekseeritud otsingumootorites. Kanali dokumentatsioon on saadaval eraldi aadressidel (nĂ€iteks, werf.io/v1.0-beta/documentation beta-vĂ€ljaande 1.0).

Kokku on saidil saadaval jÀrgmised versioonid:

  1. juurkataloog (avatakse vaikimisi),
  2. iga aktiivse vÀrskenduse kanali jaoks iga vÀljaande puhul (nÀiteks, werf.io/v1.0-beta).

Konkreetse saidi versiooni genereerimiseks piisab ĂŒleĂŒldiselt selle kompileerimise teostamisest vahenditega Jekyll, kĂ€ivitades vastava kĂ€su werfi kataloogis ( /docs jekyll build), eelnevalt lĂŒlitudes vajaliku versiooni Git-sildile.), прДЎĐČĐ°Ń€ĐžŃ‚Đ”Đ»ŃŒĐœĐŸ пДрДĐșлючОĐČшось ĐœĐ° Git-тДг ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸĐč ĐČДрсОО.

Peab veel lisama, et:

  • koostamiseks kasutatakse utiliiti (werf);
  • CI/CD-protsessid on ĂŒles ehitatud GitLabi CI pĂ”hjal;
  • ja kĂ”ik see töötab loomulikult Kuberneteses.

Ülesanded

NĂŒĂŒd formuleerime ĂŒlesanded, arvestades kogu eespool toodud spetsiifikat:

  1. PÀrast versiooni muutmist werfi mÔnel vÀrskenduste kanalil peab saidi dokumentatsioon automaatselt vÀrskendama.
  2. Arendamiseks peab olema vÔimalik aeg-ajalt vaadata saidi eelvaate versioone.

Veebisaidi ĂŒmberkompileerimist tuleb teha pĂ€rast versiooni muutmist igas kanalis vastavatest Git-mĂ€rkidest, kuid pildi loomise protsessis saame jĂ€rgmistest omadustest:

  • Kuna versioonide loetelu kanalites muutub, tuleb ĂŒmberkompileerida ainult dokumentatsioon neile kanalitele, kus versioon on muutunud. LĂ”ppude lĂ”puks ei ole kĂ”ike uuesti ĂŒmberkompileerimine just ilus.
  • VĂ€ljalaskekanalite komplekt vĂ”ib samuti muutuda. MĂ”nel hetkel, nĂ€iteks, ei pruugi olla versiooni kanalis, mis on stabiilsem kui varase juurdepÀÀsu versioon 1.1, kuid aja möödudes need ilmuvad - ei saa ju selle tĂ”ttu kĂ€sitsi koostamist muuta?

Selgub, et koostamine sÔltub muutuvatest vÀlistest andmetest.

Rakendus

LĂ€henemise valik

Ühe vĂ”imalusena vĂ”ib kĂ€ivitada iga vajaliku versiooni eraldi pod'ina Kuberneteses. See lahendus eeldab suuremat objektide arvu klastris, mis kasvab stabiilsete werf'i vĂ€ljalaskete arvu suurenedes. See tĂ€hendab aga keerukamat hooldust: iga versiooni jaoks tekib oma HTTP-server, millel on vĂ€ike koormus. Loomulikult toob see kaasa suuremad ressursikulud.

KĂ€isime oma teed kĂ”ikide vajalike versioonide kogumine ĂŒhes pildis. KĂ”ikide saidi versioonide kompileeritud staatika asub NGINX-i konteineris ning vastav liiklus jĂ”uab Deployment'ile lĂ€bi NGINX Ingress'i. Lihtne struktuur — staateless-rakendus — vĂ”imaldab kerge vaevaga skaleerida Deployment'i (koos koormusega) Kubernetes'i enda vahenditega.

Kuna olla tĂ€psem, kogume me kaks pilti: ĂŒks — tootmisvoolu jaoks, teine — tĂ€iendav, arendusvoolu jaoks. TĂ€iendav pilt kasutatakse (kĂ€ivitatakse) ainult arendusvoolus koos peamisega ning sisaldab saidi versiooni ĂŒlevaatamise commit'ist, samas kui marsruudistamine nende vahel toimub Ingress'i ressursside abil.

werf vs git clone ja artefaktid

Nagu juba mainitud, tuleb veebisaidi staatika genereerimiseks konkreetse dokumendi versiooni jaoks teha ehitus, vahetades vastavasse tag'i repos. Seda vĂ”iks teha ka, kloonides reposse iga kord ehituse ajal ja valides vastavad tag'id loendist. Kuid see on ĂŒsna ressursimahukas tegevus ja lisaks vajab keeruliste juhiste kirjutamist... Teine tĂ”sine miinus on see, et sellise lĂ€henemise korral ei ole vĂ”imalik ehituse ajal midagi vahemĂ€llu talletada.

Siin aitab meid utiliit werf, mis realiseerib nutikat vahemĂ€llu salvestamist ja vĂ”imaldab kasutada vĂ€list reposid. Werf'i kasutamine koodi lisamiseks reposse kiirendab ehitust oluliselt, kuna werf teeb pĂ”himĂ”tteliselt kloonimise reposse ainult ĂŒks kord ja seejĂ€rel tĂ€idab ainult fetch vajaduse korral. Lisaks, andmete lisamisel reposse saame valida vaid vajalikud kataloogid (meie puhul on see kataloog docs), mis vĂ€hendab oluliselt lisatavate andmete mahtu.

Kuna Jekyll on tööriist, mis on mÔeldud staatika kompileerimiseks ja ei ole lÔpppildis vajalik, oleks mÔistlik teha kompileerimine werf-i artefaktis, ja lÔpppildis importida ainult kompileerimise tulemus.

Kirjutame werf.yaml

Seega oleme otsustanud, et kompileerime iga versiooni eraldi werf-i artefakti. Siiski, me ei tea, kui palju neid artefakte ehitamisel tuleb, seega ei saa me kirjutada fikseeritud ehitusk.Configuatsiooni (tegelikult saame, kuid see ei oleks tÔhus).

werf vĂ”imaldab kasutada Go-malle oma konfiguratsioonifailis (werf.yaml), mis annab vĂ”imaluse generate config ‘on the fly’ sĂ”ltuvalt vĂ€listest andmetest (mida vajame!). VĂ€listeks andmeteks on meie puhul versioonide ja vĂ€ljaannete teave, mille alusel kogume vajaliku arvu artefakte ja saame tulemusena kaks pilti: werf-doc ja werf-dev mille kĂ€ivitamiseks erinevates ringides.

VĂ€limised andmed edastatakse keskkonnamuutujate kaudu. Siin on nende koostisosad:

  • RELEASES — string, mis sisaldab vĂ€ljaannete nimekirja ja nende vastavat jooksvaid werf versiooni, loetletuna tĂŒhikute kaudu vÀÀrtuste loendina formaadis %. NĂ€ide: 1.0%v1.0.4-beta.20
  • KANALID — rida kanalite loetlemiseks ja vastava werf'i versiooniga, vÀÀrtuste loetelu tĂŒhikute kaudu formaadis %. NĂ€ide: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — werf'i vĂ€ljalaskeversioon, mis kuvatakse vaikimisi veebilehel (ei pruugi alati kuvada dokumentatsiooni kĂ”rgeimale vĂ€ljaannetele). NĂ€ide: v1.0.4-beta.20
  • REVIEW_SHA — review-commit'i hash, millest versioon testiringi jaoks kokku panna.

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

Esmalt mugavuse huvides mÀÀrame werf.yaml Go-muutujate ĂŒlesannetes, omistades neile vÀÀrtused keskkonnamuutujatest:

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

Arhitektuuri kirjeldamine, et koostada versiooni staatika veebilehe jaoks, on kĂ”igi vajalike meie jaoks juhtumite puhul sama (sealhulgas juureversiooni genereerimine ja versioon dev-kontuurile). SeetĂ”ttu paneme selle eraldi plokki mÀÀrata — edaspidiseks korduvkasutamiseks kasutades include. Malli edastame jĂ€rgmised argumendid:

  • Versioon — genereeritud versioon (sildi nimi);
  • Kanal — vĂ€rskenduste kanali nime, 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 }}

Artefakti nimetus peab olema ainulaadne. Selle saavutamiseks saame nÀiteks lisada kanali nime (muutuja vÀÀrtus .Channel) artefakti nime suffiksina: artifact: doc-{{ .Channel }}. Kuid tuleb mÔista, et artefaktide importimisel tuleb viidata sama nimetusele.

Artefakti kirjeldamisel kasutatakse sellist vÔimalust nagu werf, nimelt mounting. Mountimisega, mis mÀÀrab teeninduskausta build_dir , saab sÀilitada Jekylli vahemÀlu pipeline'i kÀivituste vahel, mis kiirendab uuesti koostamist oluliselt.

Te vĂ”isite samuti mĂ€rgata faili releases.yml — see on YAML-fail, mis sisaldab andmeid vĂ€ljaanne kohta ja mida kĂŒsitakse github.com (artefakt, mis saadakse pipeline'i töö kĂ€igus). See on vajalik saidi koostamisel, kuid artikli kontekstis on see meie jaoks huvitav, kuna selle seisund mĂ”jutab ainult ĂŒhe artefakti uuesti koostamist — juurversiooni saidi artefakti (teistes artefaktides ei ole see vajalik).

See on teostatud tingimusliku operaatori if Go-mallide ja konstruktsiooni {{ $Root.Files.Get "releases.yml" | sha256sum }} etapis faasis. See töötab jĂ€rgmiselt: juurversiooni artefakti koostamisel (muutuja .Channel äžș root) faili rĂ€sivÀÀrtus releases.yml mĂ”jutab kogu etapi signatuuri, kuna see on osa Ansible ĂŒlesande nimest (parameeter name). Seega, kui muudame sisu faile releases.yml , vastav artefakt saab uuesti ehitatud.

Pange tÀhele ka tööd vÀlise reposiga. Artefakti pildile repozitooriumist werf, lisatakse ainult kataloog /docs, kus sÔltuvalt edastatud parameetritest lisatakse andmed kohe vajaliku sildi vÔi review-commit'i kohta.

Kui soovite kasutada artefakti mallina edastatud versioonide kanalite ja vĂ€ljalaskete kirjelduste genereerimiseks, korraldame tsĂŒkli muutuja .WerfVersions ĂŒhes werf.yaml:

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

Kuna tsĂŒkkel genereerib mitmeid artefakte (loodame seda), tuleb arvesse vĂ”tta nende vahel olevat eraldajat — jĂ€rjestus --- (konfiguratsioonifaili sĂŒntaksist vt dokumentatsioonis). Nagu eelnevalt kokku leppisime, edastame malle kutsumisel versiooni, URL-i ja juurkonteksti parameetrid.

Sarnaselt, kuid juba ilma tsĂŒklita, kutsume artefakti malli "erijuhtumite" jaoks: juurversiooni ja samuti review-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 }}

Pange tĂ€hele, et ĂŒlevaate commit'i artefakt kogutakse ainult siis, kui muutuja .WerfReviewCommit.

Artefaktid on valmis — aeg importimiseks!

LĂ”plik pilt, mis on mĂ”eldud töötama Kubernetes'is, on tavaline NGINX, kuhu on lisatud serveri konfiguratsioonifail nginx.conf ja staatika artefaktidest. Lisaks pĂ”hiversiooni artefaktile peame kordama tsĂŒklit muutuja .WerfVersions ĂŒmber importimisel kanalite ja vĂ€ljaannete artefaktide jaoks + jĂ€rgima artefaktide nimetamisseisu, mille me varem kokku leppisime. Kuna iga artefakt salvestab saidi versioonid kahes keeles, importime need kohtadesse, mida on ette nĂ€htud konfiguratsioonis.

Werf-doc lÔpppildi kirjeldus

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Seadistamine /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 -}}

TĂ€iendav pilt, mis kĂ€ivitatakse koos peamisega dev-kontuuris, sisaldab ainult kahte versiooni veebisaidist: versiooni ĂŒlevaate commitist ja peamise versiooni (seal on ĂŒhised ressursid ja, kui mĂ€letate, andmed vĂ€ljaandmistest). Seega erineb tĂ€iendav pilt peamisest ainult impordi sektsiooni poolest (no ja, loomulikult 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 juba eespool mainitud, genereeritakse review-commit'i artefakt ainult siis, kui keskkonna muutuja on seadistatud REVIEW_SHA. Werf-dev pilti oleks vĂ”inud ĂŒldse mitte genereerida, kui keskkonna muutujat ei ole REVIEW_SHA, kuid selleks, et poliitikate kohaselt puhastamine Docker-pilte werf’is, töötaks werf-dev'i pilt, jĂ€tame selle kogumise vaid pĂ”hiversiooni artefaktiga (nii vĂ”i teisiti on see juba kokku pandud), et lihtsustada pipeline'i struktuuri.

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

Pipeline GitLab CI-s ja dĂŒnaamilise kogumise eripĂ€ra

Kogumise kÀivitamisel peame seadistama keskkonna muutujad, mida kasutatakse werf.yaml. See ei puuduta muutujaid REVIEW_SHA, mille seadistame GitHub'i hook'i kaudu pipeline'i kÀivitamisel.

Vajalikud vÀlised andmed viime Bash-skripti generate_artifacts, mis genereerib kaks GitLab pipeline'i artefakti:

  • fail releases.yml vĂ€ljaande andmetega,
  • fail common_envs.sh, sisaldav keskkonnamuutujaid eksportimiseks.

Faili sisu generate_artifacts leiate meie nÀidiste hoidlast. Andmete saamine ei ole artikli teema, kuid fail common_envs.sh on meile oluline, sest sellel sÔltub werf'i töö. 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'

Seda skripti saab kasutada nÀiteks Bash-funktsiooni abil source.

Ja nĂŒĂŒd kĂ”ige huvitavam. Et nii ehitus kui ka rakenduse juurutamine toimiksid Ă”igesti, on vajalik tagada, et werf.yaml oleks samad vĂ€hemalt ĂŒhe pipeline'i raames. Kui seda tingimust ei tĂ€ideta, siis on werf'i arvutatud etappide allkirjad, mis on vajalikud ehitamiseks ja nĂ€iteks juurutamiseks, erinevad. See pĂ”hjustab juurutamisviga, kuna vajalik juurutamispilt puudub.

TeisisÔnu, kui saidi pildi ehitamise ajal on versioonide ja vÀljalasketeave sama, aga juurutamise hetkel tuleb vÀlja uus versioon ning keskkonnamuutujad omavad teisi vÀÀrtusi, siis juurutamine ebaÔnnestub: uus versioon ei ole veel kokku pandud.

Kui genereerimine werf.yaml sĂ”ltub vĂ€listest andmetest (nt, kehtivate versioonide nimekirjast, nagu meie puhul), seega peavad sellised andmed olema fikseeritud pipeline'i raames. See on eriti oluline, kui vĂ€listingimused muutuvad ĂŒsna tihti.

Me hakkame saama ja fikseerima vĂ€listandmeid pipeline'i esimeses etapis GitLabis (Prebuild) ja edastama need edasi GitLab CI artefakti. See vĂ”imaldab kĂ€ivitada ja uuesti kĂ€ivitada pipeline'i ĂŒlesandeid (konstruktsioon, paigaldamine, puhastus) sama konfiguratsiooniga werf.yaml.

Etapi sisu Prebuild faile .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Àlistanded artefakis, saab teostada konstruktsiooni ja paigaldamist, kasutades GitLab CI standardseid etappe: Build ja Deploy. Pipeline'i kÀivitame me GitHubi repository'st werf (st. kui muudatused tehakse GitHubi repository's). Andmed nende jaoks saab vÔtta GitLabi projekti omadustest jaotisest CI / CD Settings -> Pipeline triggers, ja seejÀrel loome GitHubis vastava Webhook'i (Settings -> Webhooks).

Konstruktsiooni etapp nÀeb vÀlja jÀrgmine:

Ehita:
  etapp: ehita
  skript:
    - tĂŒĂŒp multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - tĂŒĂŒp werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf build-and-publish --stages-storage :local
  vÀlja arvatud:
    refs:
      - ajakavad
  sÔltuvused:
    - Eelkontroll

GitLab lisab ehitusetappi kaks artefakti eelkontrollist Prebuild, nii et eksportime muutujaid ettevalmistatud sisendandmetega, kasutades konstruktsiooni source common_envs.sh. KĂ€ivitame ehitusetapi igasugustes olukordades, vĂ€lja arvatud ajakava alusel. Ajakava alusel kĂ€ivitatakse meil puhtuse tööprotsess — sel juhul pole ehitust vaja teostada.

Deployment-etapis kirjeldame kahte ĂŒlesannet - eraldi ĂŒmbritsemiseks production- ja dev-kontuuridele, 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 sisuliselt ainult klastrikonteksti mÀÀramise poolest, kuhu werf peab deploy’d tegema (WERF_KUBE_CONTEXT), ja keskkonna muutujate seadistamise poolest (environment.name ja environment.url), mida kasutatakse seejĂ€rel Helm-chart'ide mallides. Mallide sisu ei too, kuna seal pole midagi huvitavat kĂ€sitletud teema jaoks, aga vĂ”ite need leida artikli reposti.

Viimane puudutus

Kuna werf vĂ€rskendused ilmuvad ĂŒsna tihti, siis uusi pilte luuakse sageli ning Docker Registry kasvab pidevalt. SeetĂ”ttu on oluline seadistada automaatne piltide puhastamine poliitikate jĂ€rgi. See on vĂ€ga lihtne.

Teostamiseks on vajalik:

  • Lisa puhastamise etapp .gitlab-ci.yml;
  • Lisa puhastamisĂŒlesande regulaarne tĂ€itmine;
  • Seadista keskkonnamuutus kirjutamise pÀÀsupiletiga.

Lisame puhastamise etapi .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

Peaaegu kĂ”ik see on juba varem nĂ€htud — puhastamiseks tuleb Docker Registry'sse eelnevalt autentida pÀÀsupiletiga, millel on Ă”igused piltide kustutamiseks Docker Registry's (automaatsetele GitLabi CI tööde vĂ€ljastatud pÀÀsupiletitel ei ole selliseid Ă”igusi). PÀÀsupilet tuleb GitLabis eelnevalt luua ja selle vÀÀrtus keskkonnamuutujas mÀÀrata. WERF_IMAGES_CLEANUP_PASSWORD projekt (CI/CD Settings -> Variables).

PuhastamisĂŒlesande lisamine vajaliku ajakava jĂ€rgi toimub CI/CD ->
Ajakavad
.

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

Praktilise osa lÔpetuseks tuletan meelde, et tÀielikud loetelud artiklist on saadaval Git:

Tulemus

  1. Oleme saanud loogilise kogumise struktuuri: ĂŒks artefakt ĂŒhe versiooni kohta.
  2. Kogumine on universaalne ega nÔua kÀsitsi muudatusi uute werf versioonide ilmumisel: dokumentatsioon veebis uuendatakse automaatselt.
  3. Kogutakse kaks pilti erinevate kontuuride jaoks.
  4. Töötab kiiresti, kuna kasutada maksimaalselt vahemĂ€lu — uue werf versiooni ilmumisel vĂ”i GitHubi hook'i aktiveerimisel review-commit'i jaoks — uuendatakse ainult vastava artefakti, mille versioon on muutunud,.
  5. Ei pea muretsema kasutamata piltide eemaldamise pÀrast: werf'i poliitikate jÀrgi puhastamine hoiab Docker Registrys korras.

JĂ€reldused

  • Werf'i kasutamine vĂ”imaldab kogumisel töötada kiiresti, tĂ€nu nii kogumise enda kui ka vĂ€liste hoidlate töö kĂ€igus toimuvatele vahemĂ€ludele.
  • Töötamine vĂ€liste Git-hoidlate kaudu vabastab vajadusest kloonida hoidlat iga kord tĂ€ielikult vĂ”i leiutada jalgratast keeruka optimeerimise loogikaga. Werf kasutab vahemĂ€lu ja teeb kloonimist ainult kord, edaspidi kasutab fetch ja ainult vajadusel.
  • Go-mallide kasutamise vĂ”imalus kogumise konfiguratsioonifailis werf.yaml vĂ”imaldab kirjeldada kogumist, mille tulemus sĂ”ltub vĂ€listest andmetest.
  • MontaaĆŸide kasutamine werfis kiirendab oluliselt artefaktide kogumist — tĂ€nu kettale, mis on kĂ”igi pipeline'ide jaoks ĂŒhine.
  • werf vĂ”imaldab lihtsalt seadistada puhastust, mis on eriti oluline dĂŒnaamilise kogumise korral.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster