Dagoeneko behin baino gehiagotan hitz egin dugu gure GitOps tresnari buruz. , eta oraingoan proiektuaren beraren dokumentazioarekin gunea muntatzen dugun esperientzia partekatu nahi dugu - (bere errusierazko bertsioa da ). Gune estatiko arrunta da, baina bere muntaia interesgarria da artefaktu kopuru dinamiko bat erabiliz eraikitzen baita.

Sartu gunearen egituraren ñabarduretan: bertsio guztietarako menu komun bat sortzea, bertsioei buruzko informazioa duten orrialdeak, etab. - ez dugu egingo. Horren ordez, zentratu gaitezen muntaketa dinamikoaren gai eta ezaugarrietan eta apur bat dakarten CI/CD prozesuetan.
Sarrera: gunearen funtzionamendua
Hasteko, werf dokumentazioa bere kodearekin batera gordetzen da. Honek, oro har, artikulu honen esparrutik kanpo geratzen diren garapen-baldintza batzuk ezartzen ditu, baina gutxienez zera esan daiteke:
- Ez dira werf funtzio berriak kaleratu behar dokumentazioa eguneratu gabe eta, alderantziz, dokumentazioan egindako aldaketak werf-en bertsio berri bat kaleratzea dakar;
- Proiektuak nahiko garapen intentsiboa du: egunean hainbat aldiz kaleratu daitezke bertsio berriak;
- Dokumentazio bertsio berri bat duen gune bat zabaltzeko eskuzko eragiketak gutxienez neketsuak dira;
- Proiektuak ikuspegi semantiko bat hartzen du , 5 egonkortasun kanalekin. Askapen-prozesuak bertsioak kanaletan zehar sekuentzialki igarotzea dakar, gero eta egonkortasun handiagoaren arabera: alfatik harri solidora;
- Guneak errusierazko bertsioa du, "bizi eta garatzen" dena (hau da, edukia eguneratzen dena) bertsio nagusiarekin batera (hau da, ingelesezkoa).
“Barruko sukalde” hori guztia erabiltzaileari ezkutatzeko, “funtzionatzen duen” zerbait eskainiz, egin genuen werf instalatzeko eta eguneratzeko tresna bereizi - Is . Erabiltzeko prest zauden bertsio-zenbakia eta egonkortasun-kanala zehaztu besterik ez duzu behar, eta multiwerf-ek kanalean bertsio berririk dagoen egiaztatuko du eta behar izanez gero deskargatuko du.
Webguneko bertsioak aukeratzeko menuan, kanal bakoitzean werf-en azken bertsioak daude eskuragarri. Berez, helbidearen arabera azken bertsiorako kanal egonkorrenaren bertsioa irekitzen da - bilatzaileek ere indexatzen dute. Kanalaren dokumentazioa helbide ezberdinetan dago eskuragarri (adibidez, 1.0 beta bertsiorako).
Guztira, webguneak bertsio hauek ditu eskuragarri:
- root (lehenespenez irekitzen da),
- bertsio bakoitzeko eguneratze-kanal aktibo bakoitzeko (adibidez, ).
Gune baten bertsio zehatz bat sortzeko, oro har, nahikoa da hura erabiliz konpilatzea direktorioa exekutatuz /docs werf biltegia dagokion komandoa (jekyll build), beharrezko bertsioaren Git etiketara aldatu ondoren.
Hau gehitzea besterik ez da geratzen:
- erabilgarritasuna bera (werf) erabiltzen da muntatzeko;
- CI/CD prozesuak GitLab CI-n oinarrituta eraikitzen dira;
- eta hori guztia, noski, Kubernetesen exekutatzen da.
zereginak
Orain formula ditzagun deskribatutako berezitasun guztiak kontuan hartzen dituzten zereginak:
- Edozein eguneratze kanaletan werf bertsioa aldatu ondoren webguneko dokumentazioa automatikoki eguneratu behar da.
- Garapenerako gai izan behar duzu batzuetan ikusi webgunearen aurrebista bertsioak.
Gunea birkonpilatu behar da edozein kanaletan dagozkion Git etiketatatik bertsioa aldatu ondoren, baina irudia eraikitzeko prozesuan ezaugarri hauek lortuko ditugu:
- Kanalen bertsioen zerrenda aldatzen denez, bertsioa aldatu den kanalen dokumentazioa berreraikitzea baino ez da beharrezkoa. Azken finean, dena berriro berreraikitzea ez da oso polita.
- Argitalpenetarako kanalen multzoa alda daiteke. Uneren batean, adibidez, baliteke kanaletan sarbide goiztiarra 1.1 bertsioa baino bertsio egonkorragorik egotea, baina denborarekin agertuko dira; kasu honetan, ez al zenuke muntaia eskuz aldatu behar?
Izarrekin bihurtzen da muntaia kanpoko datuak aldatzearen araberakoa da.
Inplementazioa
Ikuspegi bat aukeratzea
Bestela, beharrezkoa den bertsio bakoitza kubernetes-en ontzi bereizi gisa exekutatu dezakezu. Aukera honek klusterrean objektu-kopuru handiagoa suposatzen du, werf-en kaleratze egonkorren kopurua handitu ahala haziko dena. Eta horrek, aldi berean, mantentze konplexuagoa dakar: bertsio bakoitzak bere HTTP zerbitzaria du, eta karga txikiarekin. Jakina, horrek baliabide kostu handiagoak ere dakartza.
Bide bera hartu genuen beharrezko bertsio guztiak irudi bakarrean biltzea. Gunearen bertsio guztien konpilatutako estatika NGINX duen edukiontzi batean dago, eta dagokion Inplementaziorako trafikoa NGINX Ingress-en bidez dator. Egitura sinple batek (aberririk gabeko aplikazio bat) Kubernetes bera erabiliz Inplementazioa erraz eskalatu dezakezu (kargaren arabera).
Zehatzago esateko, bi irudi biltzen ari gara: bata produkzio-zirkuiturako, bigarrena gehigarri bat garatzeko zirkuiturako. Irudi gehigarria dev zirkuituan bakarrik erabiltzen da (abian) nagusiarekin batera eta webgunearen bertsioa berrikuspen-konpromisoa dauka, eta haien arteko bideratzea Ingress baliabideak erabiliz egiten da.
werf vs git klona eta artefaktuak
Esan bezala, dokumentazioaren bertsio zehatz baterako gune estatikoak sortzeko, biltegi-etiketa egokira aldatuz eraiki behar duzu. Hau ere egin dezakezu biltegia eraikitzen duzun bakoitzean klonatuz, zerrenda batetik etiketa egokiak hautatuz. Dena den, baliabideak asko behar dituen eragiketa da eta, gainera, argibide ez-hutsak idaztea eskatzen du... Beste desabantaila larri bat da ikuspegi honekin ez dagoela modurik muntaian zehar zerbait cachean gordetzeko.
Hemen werf utility bera datorkigu laguntza, inplementatzen cache adimenduna eta erabiltzeko aukera ematen dizu . Biltegiko kodea gehitzeko werf erabiltzeak nabarmen azkartuko du eraikuntza, zeren werf funtsean biltegia behin klonatzen du eta gero exekutatzen du bakarrik fetch Beharrezkoa bada. Gainera, biltegiko datuak gehitzean, beharrezkoak diren direktorioak soilik hauta ditzakegu (gure kasuan hau direktorioa da. docs), gehitutako datu kopurua nabarmen murriztuko duena.
Jekyll datu estatikoak biltzeko diseinatutako tresna bat denez eta azken irudian beharrezkoa ez denez, logikoa litzateke hemen biltzea. , eta azken irudian inportatu konpilazioaren emaitza soilik.
Werf.yaml idazten dugu
Beraz, bertsio bakoitza werf artefaktu batean bilduko genuela erabaki genuen. Hala ere guk ez dakigu zenbat artefaktu hauek izango diren muntatzean, beraz, ezin dugu eraikitze konfigurazio finkorik idatzi (zorrotz esanda, oraindik egin dezakegu, baina ez da guztiz eraginkorra izango).
werf-ek erabiltzeko aukera ematen dizu zure konfigurazio fitxategian (werf.yaml), eta honek posible egiten du konfigurazioa sortu hegan kanpoko datuen arabera (behar duzuna!). Gure kasuan kanpoko datuak bertsioei eta kaleratzeei buruzko informazioa dira, eta horren arabera behar diren artefaktu kopurua biltzen dugu eta, ondorioz, bi irudi lortzen ditugu: werf-doc и werf-dev zirkuitu ezberdinetan ibiltzeko.
Kanpoko datuak ingurune-aldagaietatik pasatzen dira. Hona hemen haien osaera:
-
RELEASES- kaleratzeen zerrenda eta dagokion werf-en uneko bertsioa dituen lerroa, formatuan espazioz bereizitako balioen zerrenda moduan<НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>... Adibidea:1.0%v1.0.4-beta.20 -
CHANNELS- kanalen zerrenda eta dagokion werf-en uneko bertsioa dituen lerroa, formatuan espazioz bereizitako balioen zerrenda moduan<КАНАЛ>%<НОМЕР_ВЕРСИИ>... Adibidea:1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22 -
ROOT_VERSION— werf bertsioa lehenespenez bistaratzeko gunean (ez da beti beharrezkoa dokumentazioa kaleratze-zenbaki handienarekin bistaratzea). Adibidea:v1.0.4-beta.20 -
REVIEW_SHA— Berrikuspen-konpromisoaren hash, bertatik probaren begiztarako bertsioa eraiki behar duzun.
Aldagai hauek GitLab CI kanalizazioan beteko dira, eta behean nola idazten den zehazki.
Lehenik eta behin, erosotasunerako, in definitzen dugu werf.yaml Joan txantiloi-aldagaiak, ingurune-aldagaietatik balioak esleitu:
{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }} Gunearen bertsio estatikoa konpilatzeko artefaktuaren deskribapena, oro har, berdina da behar ditugun kasu guztietan (rootaren bertsioa sortzea barne, baita garatzeko zirkuituaren bertsioa ere). Hori dela eta, beste bloke batera eramango dugu funtzioa erabiliz define - gero berrerabiltzeko include. Argumentu hauek pasatuko dizkiogu txantiloiari:
-
Version— sortutako bertsioa (etiketa izena); -
Channel— artefaktua sortzen den eguneratze-kanalaren izena; -
Commit— konprometitu hash, artefaktua berrikuspen-konpromiso baterako sortzen bada; - testuingurua.
Artifact txantiloiaren deskribapena
{{- 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 }} Artefaktuaren izenak bakarra izan behar du. Hori lor dezakegu, adibidez, kanalaren izena gehituz (aldagaiaren balioa .Channel) artefaktuaren izenaren atzizki gisa: artifact: doc-{{ .Channel }}. Baina ulertu behar duzu artefaktuetatik inportatzean, izen berdinak aipatu beharko dituzula.
Artefaktu bat deskribatzean, werf ezaugarri hau erabiltzen da: . Zerbitzu-direktorioa adierazten duen muntaketa build_dir kanalizazioen artean Jekyll cachea gordetzeko aukera ematen du, hau da nabarmen bizkortzen du berriro muntatzea.
Baliteke fitxategiaren erabileraz ere nabaritzea releases.yml YAML fitxategi bat da, bertatik eskatutako kaleratze-datuak dituena (tubide bat exekutatzen denean lortutako artefaktua). Beharrezkoa da gunea osatzerakoan, baina artikuluaren testuinguruan interesgarria da guretzat, bere egoeraren araberakoa delako artefaktu bakarra birmuntatzea — gunearen erro bertsioaren artefaktua (ez da beharrezkoa beste artefaktu batzuetan).
Hau baldintzapeko adierazpena erabiliz gauzatzen da if Joan txantiloiak eta diseinuak {{ $Root.Files.Get "releases.yml" | sha256sum }} eszenatokian . Honela funtzionatzen du: root bertsiorako artefaktu bat eraikitzean (aldagaia .Channel berdina da root) fitxategi hash releases.yml etapa osoaren sinadurari eragiten dio, Ansible zereginaren izenaren parte baita (parametroa name). Horrela, aldatzean edukia fitxategia releases.yml dagokion artefaktua berriro muntatuko da.
Mesedez, arreta jarri kanpoko biltegi batekin lan egiteari. Artefaktu baten irudian , direktorioa bakarrik gehitzen da /docs, eta gainditutako parametroen arabera, beharrezkoa den etiketaren edo berrikuspen-konpromisoaren datuak berehala gehitzen dira.
Artefaktu txantiloia kanalen eta bertsio transferituen artefaktuaren deskribapena sortzeko erabiltzeko, aldagaiaren begizta bat antolatu dugu. .WerfVersions в werf.yaml:
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}} Zeren begiztak hainbat artefaktu sortuko ditu (espero dugu), haien arteko bereizlea kontuan hartu behar da - sekuentzia --- (Konfigurazio-fitxategiaren sintaxiari buruzko informazio gehiago lortzeko, ikus ). Lehenago definitu den bezala, txantiloi bati begizta batean deitzean, bertsio-parametroak, URLa eta root testuingurua pasatzen ditugu.
Era berean, baina begiztarik gabe, artefaktuaren txantiloiari "kasu berezietarako" deitzen diogu: erroko bertsiorako, baita berrikuspen-konpromisorako bertsiorako ere:
{{ 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 }} Kontuan izan berrikuspen-konpromisorako artefaktua aldagaia ezarrita badago soilik eraikiko dela .WerfReviewCommit.
Artefaktuak prest daude - inportatzen hasteko ordua da!
Azken irudia, Kubernetesen exekutatzeko diseinatuta, NGINX arrunta da, zerbitzariaren konfigurazio fitxategia gehituta nginx.conf eta artefaktuetatik estatikoa. Gunearen erro bertsioaren artefaktuaz gain, aldagaiaren begizta errepikatu behar dugu .WerfVersions kanaleko eta kaleratzeko bertsioen artefaktuak inportatzeko + jarraitu lehenago onartu genuen artefaktuak izendatzeko araua. Artefaktu bakoitzak bi hizkuntzatarako webgunearen bertsioak gordetzen dituenez, konfigurazioak eskaintzen dituen tokietara inportatzen ditugu.
Azken irudiaren deskribapena 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 -}}Irudi gehigarriak, nagusiarekin batera, garapen-zirkuituan abiarazten dena, webgunearen bi bertsio baino ez ditu: berrikuspen-konpromisoaren bertsioa eta gunearen root bertsioa (aktibo orokorrak daude eta, gogoratzen baduzu, , kaleratu datuak). Horrela, irudi gehigarria inportazio atalean (eta, noski, izenean) bakarrik desberdina izango da nagusiarekiko:
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 }} Goian adierazi bezala, berrikuspen-konpromisorako artefaktua ezarriko ingurune-aldagaia exekutatzen denean bakarrik sortuko da REVIEW_SHA. Posible litzateke werf-dev irudia batere ez sortzea ingurune-aldagairik ez badago REVIEW_SHA, baina ahal izateko Docker-en werf-eko irudiek werf-dev irudirako funtzionatu zuten, root bertsioaren artefaktuarekin soilik eraikitzeko utziko dugu (hala ere eraikita dago), kanalizazio-egitura sinplifikatzeko.
Batzarra prest dago! Joan gaitezen CI/CDra eta ñabardura garrantzitsuetara.
Pipeline GitLab CI-n eta eraikuntza dinamikoaren ezaugarriak
Eraikuntza exekutatzen denean erabilitako ingurune-aldagaiak ezarri behar ditugu werf.yaml. Hau ez zaio aplikatzen REVIEW_SHA aldagaiari, GitHub kakotik kanalizazioa deitzean ezarriko duguna.
Beharrezko kanpoko datuak Bash script batean sortuko ditugu generate_artifacts, GitLab kanalizazio bi artefaktu sortuko dituena:
- fitxategia
releases.ymlkaleratze datuekin, - fitxategia
common_envs.sh, esportatu beharreko ingurune-aldagaiak dituena.
Fitxategien edukia generate_artifacts gurean aurkituko duzu . Datuak jasotzea bera ez da artikuluaren gaia, fitxategia baizik common_envs.sh garrantzitsua da guretzat, zeren werf-en lana horren menpe dago. Bere edukiaren adibide bat:
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' Horrelako script baten irteera erabil dezakezu, adibidez, Bash funtzioa erabiliz source.
Orain parte dibertigarria dator. Aplikazioaren eraikuntza eta hedapena behar bezala funtzionatzeko, beharrezkoa da hori ziurtatzea werf.yaml It zen berdina behintzat hodi baten barruan. Baldintza hori betetzen ez bada, werf-ek muntaian eta, adibidez, zabaltzean kalkulatzen dituen etapen sinadurak desberdinak izango dira. Horrek inplementazio-errore bat ekarriko du, zeren... zabaltzeko behar den irudia faltako da.
Beste era batera esanda, gunearen irudia muntatzean kaleratzeei eta bertsioei buruzko informazioa berdina bada, eta zabaltzeko unean bertsio berri bat askatzen bada eta ingurune-aldagaiek balio desberdinak badituzte, orduan inplementazioak huts egingo du errore batekin: azken finean, bertsio berriaren artefaktua oraindik ez da eraiki.
Belaunaldia bada werf.yaml kanpoko datuen araberakoa da (adibidez, egungo bertsioen zerrenda, gure kasuan bezala), orduan datu horien konposizioa eta balioak kanalizazioan erregistratu behar dira. Hau bereziki garrantzitsua da kanpoko parametroak sarritan aldatzen badira.
egingo dugu kanpoko datuak jaso eta erregistratu GitLab-en kanalizazioaren lehen fasean (Aurrez eraikitzea) eta gehiago transmititu forman GitLab CI artefaktua. Honek kanalizazio lanak (eraiki, zabaldu, garbitu) exekutatu eta berrabiarazi ahal izango dituzu konfigurazio berarekin werf.yaml.
Eszenatokiaren edukiak Aurrez eraikitzea fitxategia .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 weekArtifaktuan kanpoko datuak jaso ondoren, GitLab CI kanalizazio fase estandarrak erabiliz eraiki eta zabaldu dezakezu: Eraiki eta zabaldu. Pipelinea bera abiarazten dugu werf GitHub biltegiko kakoak erabiliz (hau da, GitHub biltegian aldaketak daudenean). Horien datuak ataleko GitLab proiektuaren propietateetan aurki daitezke CI/CD ezarpenak -> Pipeline abiarazleak, eta gero sortu dagokion Webhook GitHub-en (Ezarpenak -> Webhooks).
Eraikuntza fasea honela izango da:
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-ek bi artefaktu gehituko ditu eszenatokitik eraikitze fasera Aurrez eraikitzea, beraz, prestatutako sarrerako datuekin aldagaiak esportatzen ditugu eraikuntza erabiliz source common_envs.sh. Eraikuntza-etapa hasten dugu kasu guztietan, hoditeria programazio baten arabera abiarazteko izan ezik. Egitarauaren arabera, garbiketarako hodi bat egingo dugu; kasu honetan, ez da muntaketa egin beharrik.
Inplementazio-etapan, bi zeregin deskribatuko ditugu - bereizita ekoizpen- eta garapen-zirkuituetara hedatzeko, YAML txantiloi bat erabiliz:
.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 Zereginak, funtsean, werf-ek hedapena egin behar duen kluster-testuingurua adieraztean baino ez dira (WERF_KUBE_CONTEXT), eta begizta inguruneko aldagaiak ezarri (environment.name и environment.url), Helm diagramen txantiloietan erabiltzen direnak. Ez dugu txantiloien edukia emango, zeren... ez dago ezer interesgarririk gaiari dagokionez, baina bertan aurki ditzakezu .
Azken ukitua
Werf bertsioak sarritan kaleratzen direnez, irudi berriak maiz eraikiko dira eta Docker Erregistroa etengabe haziko da. Hori dela eta, ezinbestekoa da politiken arabera irudien garbiketa automatikoa konfiguratzea. Oso erraza da egitea.
Ezartzeko:
- Gehitu garbiketa-urrats bat
.gitlab-ci.yml; - Gehitu garbiketa-lan baten aldizkako exekuzioa;
- Konfiguratu ingurune-aldagai bat idazteko sarbide-token batekin.
Garbiketa fasea gehitzea .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
Dagoeneko ia hori guztia apur bat gorago ikusi dugu - garbitzeko bakarrik Docker Erregistroan saioa hasi behar duzu Docker Erregistroko irudiak ezabatzeko eskubideak dituen token batekin (automatikoki jaulkitako GitLab CI zereginaren tokenak ez du eskubide horiek izan). Tokena aldez aurretik GitLab-en sortu behar da eta bere balioa ingurune-aldagaian zehaztu behar da WERF_IMAGES_CLEANUP_PASSWORD proiektua (CI/CD ezarpenak -> Aldagaiak).
Beharrezko ordutegiarekin garbiketa-zeregin bat gehitzen da CI/CD ->
ordutegiak.
Hori da: Docker Erregistroko proiektu bat ez da etengabe haziko erabili gabeko irudietatik.
Zati praktikoaren amaieran, gogorarazten dizut artikuluaren zerrenda osoa eskuragarri dagoela hemen :
- ;
- .
Emaitza
- Batzar-egitura logiko bat jaso genuen: bertsio bakoitzeko artefaktu bat.
- Muntaia unibertsala da eta ez du eskuzko aldaketarik behar werf-en bertsio berriak kaleratzen direnean: webguneko dokumentazioa automatikoki eguneratzen da.
- Bi irudi muntatzen dira ingerada ezberdinetarako.
- Azkar funtzionatzen du, zeren Cachea ahalik eta gehien erabiltzen da - werf-en bertsio berri bat askatzen denean edo GitHub-en kako bat berrikusteko konpromisoa deitzen denean, aldatutako bertsioarekin dagokion artefaktua soilik berreraikitzen da.
- Ez da pentsatu behar erabili gabeko irudiak ezabatzean: werf politiken arabera garbitzeak Docker Erregistroa ordenatuta mantenduko du.
Findings
- Werf erabiltzeak muntaia azkar funtzionatzea ahalbidetzen du, bai muntaia bera eta kanpoko biltegiekin lan egitean cachean gordeta dagoelako.
- Kanpoko Git biltegiekin lan egiteak biltegi osoa klonatu edo gurpila berrasmatu beharra ezabatzen du optimizazio-logika zailarekin. werf-ek cache bat erabiltzen du eta behin bakarrik egiten du klonazioa, eta gero erabiltzen du
fetcheta beharrezkoa denean bakarrik. - Eraikitzeko konfigurazio fitxategian Go txantiloiak erabiltzeko gaitasuna
werf.yamlemaitza kanpoko datuen araberakoa den muntaia deskribatzeko aukera ematen du. - Muntatzea werf-en erabiltzeak artefaktuen bilduma nabarmen bizkortzen du - hodi guztietan ohikoa den cachearen ondorioz.
- werf-ek garbiketa konfiguratzea errazten du, eta hori bereziki garrantzitsua da dinamikoki eraikitzen denean.
PS
Irakurri ere gure blogean:
- «»;
- «»;
- «»;
- «'.
Iturria: www.habr.com
