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

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 , 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 Sa 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 avatakse uusima versiooni kĂ”ige stabiilsem kanaliversioon â seda indekseerivad ka otsingumootorid. Kanali dokumentatsioon on saadaval eraldi aadressidel (nĂ€iteks beetaversiooni 1.0 jaoks).
Kokku on saidil saadaval jÀrgmised versioonid:
- root (avaneb vaikimisi),
- iga vÀljalaske iga aktiivse uuenduskanali kohta (nt ).
Saidi konkreetse versiooni genereerimiseks piisab ĂŒldiselt selle kompileerimisest, kasutades , 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:
- PĂ€rast Werf-versiooni muutmist mis tahes uuenduskanalil saidi dokumentatsioon peaks automaatselt uuenema.
- 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 . 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 ja 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 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: Paigaldamine 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 (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 See 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 , 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 ). 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 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.ymlkoos vÀljalaskeandmetega - faili
common_envs.sh, mis sisaldab eksporditavaid keskkonnamuutujaid.
Faili sisu generate_artifacts leiad meie Andmete 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 weekKui 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 .
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 :
- ;
- .
Tulemus
- Saime loogilise assamblee struktuuri: ĂŒks artefakt versiooni kohta.
- Assamblee on universaalne ega vaja Werfi uute versioonide vÀljaandmisel kÀsitsi muudatusi: saidi dokumentatsioon uueneb automaatselt.
- Erinevate kontuuride jaoks kogutakse kaks pilti.
- 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.
- 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
fetchja ainult siis, kui see on hÀdavajalik. - VÔimalus kasutada Go malle ehituskonfiguratsioonifailis
werf.yamlvĂ”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
