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

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 , 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 . 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 avatakse kĂ”ige stabiilsema kanali versioon viimase vĂ€ljaande jaoks â see on ka indekseeritud otsingumootorites. Kanali dokumentatsioon on saadaval eraldi aadressidel (nĂ€iteks, beta-vĂ€ljaande 1.0).
Kokku on saidil saadaval jÀrgmised versioonid:
- juurkataloog (avatakse vaikimisi),
- iga aktiivse vÀrskenduse kanali jaoks iga vÀljaande puhul (nÀiteks, ).
Konkreetse saidi versiooni genereerimiseks piisab ĂŒleĂŒldiselt selle kompileerimise teostamisest vahenditega , 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:
- PÀrast versiooni muutmist werfi mÔnel vÀrskenduste kanalil peab saidi dokumentatsioon automaatselt vÀrskendama.
- 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 . 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 , 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 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 . 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 (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 . 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 , 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 ). 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 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.ymlvÀljaande andmetega, - fail
common_envs.sh, sisaldav keskkonnamuutujaid eksportimiseks.
Faili sisu generate_artifacts leiate meie . 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 weekFikseerides 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 .
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 :
- ;
- .
Tulemus
- Oleme saanud loogilise kogumise struktuuri: ĂŒks artefakt ĂŒhe versiooni kohta.
- Kogumine on universaalne ega nÔua kÀsitsi muudatusi uute werf versioonide ilmumisel: dokumentatsioon veebis uuendatakse automaatselt.
- Kogutakse kaks pilti erinevate kontuuride jaoks.
- 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,.
- 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
fetchja ainult vajadusel. - Go-mallide kasutamise vÔimalus kogumise konfiguratsioonifailis
werf.yamlvĂ”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
