Assemblaġġ dinamiku u skjerament ta 'immaġini Docker b'werf bl-użu ta' l-eżempju ta 'sit ta' dokumentazzjoni verżjoni

Diġà tkellimna dwar l-għodda GitOps tagħna aktar minn darba. werf, u din id-darba nixtiequ naqsmu l-esperjenza tagħna fl-immuntar tas-sit mad-dokumentazzjoni tal-proġett innifsu - werf.io (il-verżjoni Russa tagħha hija en.werf.io). Dan huwa sit statiku ordinarju, iżda l-assemblaġġ tiegħu huwa interessanti peress li huwa mibni bl-użu ta 'numru dinamiku ta' artifacts.

Assemblaġġ dinamiku u skjerament ta 'immaġini Docker b'werf bl-użu ta' l-eżempju ta 'sit ta' dokumentazzjoni verżjoni

Mur fl-sfumaturi ta 'l-istruttura tas-sit: ġenerazzjoni ta' menu komuni għall-verżjonijiet kollha, paġni b'informazzjoni dwar rilaxxi, eċċ. - aħna mhux se. Minflok, ejja niffukaw fuq il-kwistjonijiet u l-karatteristiċi tal-assemblaġġ dinamiku u ftit fuq il-proċessi CI/CD li jakkumpanjawhom.

Introduzzjoni: kif jaħdem is-sit

Biex tibda, id-dokumentazzjoni werf hija maħżuna flimkien mal-kodiċi tagħha. Dan jimponi ċerti rekwiżiti ta’ żvilupp li huma ġeneralment lil hinn mill-ambitu ta’ dan l-artikolu, iżda bħala minimu jista’ jingħad li:

  • Funzjonijiet ġodda tal-werf m'għandhomx jiġu rilaxxati mingħajr ma tiġi aġġornata d-dokumentazzjoni u, bil-maqlub, kwalunkwe tibdil fid-dokumentazzjoni timplika r-rilaxx ta' verżjoni ġdida tal-werf;
  • Il-proġett għandu żvilupp pjuttost intensiv: verżjonijiet ġodda jistgħu jiġu rilaxxati diversi drabi kuljum;
  • Kwalunkwe operazzjoni manwali biex jiġi skjerat sit b'verżjoni ġdida tad-dokumentazzjoni huma għall-inqas tedjanti;
  • Il-proġett jadotta approċċ semantiku verżjonijiet, b'5 kanali ta 'stabbiltà. Il-proċess ta 'rilaxx jinvolvi passaġġ sekwenzjali ta' verżjonijiet permezz ta 'kanali f'ordni ta' stabbiltà dejjem tiżdied: minn alfa għal solidu tal-blat;
  • Is-sit għandu verżjoni bil-lingwa Russa, li "tgħix u tiżviluppa" (jiġifieri, li l-kontenut tagħha huwa aġġornat) b'mod parallel mal-verżjoni prinċipali (jiġifieri, bil-lingwa Ingliża).

Biex taħbi din il-"kċina ta 'ġewwa" kollha mill-utent, toffrilu xi ħaġa li "taħdem biss", għamilna għodda separata ta 'installazzjoni u aġġornament tal-werf - dan hu multiwerf. Għandek bżonn biss li tispeċifika n-numru tar-rilaxx u l-kanal ta 'stabbiltà li inti lest biex tuża, u multiwerf se jiċċekkja jekk hemmx verżjoni ġdida fuq il-kanal u niżżlu jekk meħtieġ.

Fil-menu tal-għażla tal-verżjoni fuq il-websajt, l-aħħar verżjonijiet tal-werf huma disponibbli f'kull kanal. B'mod awtomatiku, bl-indirizz werf.io/dokumentazzjoni tiftaħ il-verżjoni tal-kanal l-aktar stabbli għall-aħħar rilaxx - hija wkoll indiċjata minn magni tat-tiftix. Id-dokumentazzjoni għall-kanal hija disponibbli f'indirizzi separati (pereżempju, werf.io/v1.0-beta/documentation għar-rilaxx beta 1.0).

B'kollox, is-sit għandu l-verżjonijiet li ġejjin disponibbli:

  1. root (jinfetaħ awtomatikament),
  2. għal kull kanal ta' aġġornament attiv ta' kull rilaxx (per eżempju, werf.io/v1.0-beta).

Biex tiġġenera verżjoni speċifika ta 'sit, b'mod ġenerali, huwa biżżejjed li tiġborha bl-użu Jekyllbilli taħdem fid-direttorju /docs werf repożitorju kmand korrispondenti (jekyll build), wara li taqleb għat-tikketta Git tal-verżjoni meħtieġa.

Fadal biss li żżid li:

  • l-utilità nnifisha (werf) tintuża għall-assemblaġġ;
  • Il-proċessi CI/CD huma mibnija fuq il-bażi ta 'GitLab CI;
  • u dan kollu, ovvjament, jimxi f'Kubernetes.

kompiti

Issa ejja nifformulaw kompiti li jqisu l-ispeċifiċitajiet kollha deskritti:

  1. Wara li tbiddel il-verżjoni werf fuq kwalunkwe kanal ta 'aġġornament dokumentazzjoni fuq is-sit għandha tiġi aġġornata awtomatikament.
  2. Għall-iżvilupp trid tkun kapaċi kultant ara verżjonijiet preview tas-sit.

Is-sit għandu jiġi kkompilat mill-ġdid wara li tinbidel il-verżjoni fuq kwalunkwe kanal mit-tikketti Git korrispondenti, iżda fil-proċess tal-bini tal-immaġni se jkollna l-karatteristiċi li ġejjin:

  • Peress li l-lista tal-verżjonijiet fuq il-kanali tinbidel, huwa meħtieġ biss li tinbena mill-ġdid id-dokumentazzjoni għall-kanali fejn il-verżjoni nbidlet. Wara kollox, il-bini mill-ġdid ta 'kollox mhux sabiħ ħafna.
  • Is-sett ta' kanali għar-rilaxxi jista' jinbidel. F'xi żmien, pereżempju, jista 'ma jkunx hemm verżjoni fuq il-kanali aktar stabbli mir-rilaxx ta' aċċess bikri 1.1, iżda maż-żmien dawn se jidhru - f'dan il-każ, m'għandekx tibdel l-assemblaġġ manwalment?

Jirriżulta li assemblaġġ jiddependi fuq it-tibdil tad-dejta esterna.

Реализация

Għażla ta' Approċċ

Inkella, tista' tħaddem kull verżjoni meħtieġa bħala pod separat f'Kubernetes. Din l-għażla timplika numru akbar ta 'oġġetti fil-cluster, li se jikbru biż-żieda fin-numru ta' rilaxxi ta 'werf stabbli. U dan, imbagħad, jimplika manutenzjoni aktar kumplessa: kull verżjoni għandha s-server HTTP tagħha stess, u b'tagħbija żgħira. Naturalment, dan jinvolvi wkoll spejjeż akbar tar-riżorsi.

Ħadna l-istess triq assemblaġġ tal-verżjonijiet kollha meħtieġa f'immaġni waħda. L-istatika kkumpilata tal-verżjonijiet kollha tas-sit tinsab f'kontenitur b'NGINX, u t-traffiku lejn l-Iskjerament korrispondenti jiġi permezz ta 'NGINX Ingress. Struttura sempliċi - applikazzjoni mingħajr stat - tippermettilek li tiskala faċilment l-Iskjerament (skond it-tagħbija) billi tuża Kubernetes innifsu.

Biex inkunu aktar preċiżi, qed niġbru żewġ immaġini: waħda għaċ-ċirkwit tal-produzzjoni, it-tieni hija waħda addizzjonali għaċ-ċirkwit dev. L-immaġni addizzjonali tintuża (mnedija) biss fuq iċ-ċirkwit dev flimkien ma 'dak prinċipali u fiha l-verżjoni tas-sit mill-impenn ta' reviżjoni, u r-rotot bejniethom isir bl-użu ta 'riżorsi Ingress.

werf vs git klonu u artifacts

Kif diġà ssemma, sabiex tiġġenera statika tas-sit għal verżjoni speċifika tad-dokumentazzjoni, trid tibni billi taqleb għat-tikketta tar-repożitorju xierqa. Tista 'wkoll tagħmel dan billi tikklona r-repożitorju kull darba li tibni, billi tagħżel it-tikketti xierqa minn lista. Madankollu, din hija operazzjoni pjuttost intensiva fir-riżorsi u, barra minn hekk, teħtieġ il-kitba ta 'struzzjonijiet mhux trivjali... Żvantaġġ serju ieħor huwa li b'dan l-approċċ m'hemm l-ebda mod biex tiġi cache xi ħaġa waqt l-assemblaġġ.

Hawnhekk l-utilità werf innifsu jiġi għall-għajnuna tagħna, implimentazzjoni caching intelliġenti u li jippermettilek tuża repożitorji esterni. L-użu ta 'werf biex iżżid kodiċi mir-repożitorju se tħaffef b'mod sinifikanti l-bini, għaliex werf essenzjalment jikklona r-repożitorju darba u mbagħad jesegwixxi biss fetch jekk meħtieġ. Barra minn hekk, meta nżidu dejta mir-repożitorju, nistgħu nagħżlu biss id-direttorji meħtieġa (fil-każ tagħna dan huwa d-direttorju docs), li se tnaqqas b'mod sinifikanti l-ammont ta 'dejta miżjuda.

Peress li Jekyll hija għodda ddisinjata għall-kumpilazzjoni ta’ data statika u mhix meħtieġa fl-immaġni finali, ikun loġiku li tiġi kkumpilata artifact werf, u fl-immaġni finali jimporta biss ir-riżultat tal-kumpilazzjoni.

Aħna niktbu werf.yaml

Għalhekk, iddeċidejna li se niġbru kull verżjoni f'artifatt werf separat. Madankollu aħna ma nafux kemm se jkun hemm minn dawn l-artifacts waqt l-assemblaġġ, għalhekk ma nistgħux niktbu konfigurazzjoni ta 'bini fiss (b'mod strett, xorta nistgħu, iżda mhux se tkun kompletament effettiva).

werf jippermettilek tuża Mur mudelli fil-fajl tal-konfigurazzjoni tiegħek (werf.yaml), u dan jagħmilha possibbli jiġġeneraw konfigurazzjoni fuq il-fly jiddependi fuq data esterna (dak li għandek bżonn!). Id-dejta esterna fil-każ tagħna hija informazzjoni dwar verżjonijiet u rilaxxi, li fuq il-bażi tagħha niġbru n-numru meħtieġ ta 'artifacts u bħala riżultat niksbu żewġ stampi: werf-doc и werf-dev biex taħdem fuq ċirkwiti differenti.

Id-dejta esterna tgħaddi minn varjabbli ambjentali. Hawnhekk hawn il-kompożizzjoni tagħhom:

  • RELEASES — linja b’lista ta’ rilaxxi u l-verżjoni attwali korrispondenti ta’ werf, fil-forma ta’ lista ta’ valuri separati bi spazju fil-format <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>. Eżempju: 1.0%v1.0.4-beta.20
  • CHANNELS — linja b’lista ta’ kanali u l-verżjoni kurrenti korrispondenti ta’ werf, fil-forma ta’ lista ta’ valuri separati bi spazju fil-format <КАНАЛ>%<НОМЕР_ВЕРСИИ>. Eżempju: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — werf release verżjoni li għandha tintwera awtomatikament fuq is-sit (mhux dejjem meħtieġ li tintwera d-dokumentazzjoni bl-ogħla numru ta’ rilaxx). Eżempju: v1.0.4-beta.20
  • REVIEW_SHA — hash tal-kommit tar-reviżjoni li minnu trid tibni l-verżjoni għall-linja tat-test.

Dawn il-varjabbli se jimtlew fil-pipeline GitLab CI, u kif eżattament miktub hawn taħt.

L-ewwelnett, għall-konvenjenza, aħna niddefinixxu fi werf.yaml Mur varjabbli tal-mudelli, assenjawhom valuri minn varjabbli ambjentali:

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

Id-deskrizzjoni tal-artifact għall-kompilazzjoni tal-verżjoni statika tas-sit hija ġeneralment l-istess għall-każijiet kollha li għandna bżonn (inkluż il-ġenerazzjoni tal-verżjoni għerq, kif ukoll il-verżjoni għaċ-ċirkwit dev). Għalhekk, aħna se nimxu fi blokka separata billi tuża l-funzjoni define - għall-użu mill-ġdid sussegwenti include. Aħna se ngħaddu l-argumenti li ġejjin lill-mudell:

  • Version — verżjoni ġġenerata (isem tat-tikketta);
  • Channel — l-isem tal-kanal ta' aġġornament li għalih jiġi ġġenerat l-artifatt;
  • Commit — kommit hash, jekk l-artifact jiġi ġġenerat għal impenn ta' reviżjoni;
  • kuntest.

Deskrizzjoni tal-Mudell tal-Artefatt

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

L-isem tal-artifatt għandu jkun uniku. Nistgħu niksbu dan, pereżempju, billi nżidu l-isem tal-kanal (il-valur tal-varjabbli .Channel) bħala suffiss għall-isem tal-artifatt: artifact: doc-{{ .Channel }}. Imma trid tifhem li meta timporta minn artifacts, ikollok bżonn tirreferi għall-istess ismijiet.

Meta tiddeskrivi artifatt, tintuża l-karatteristika werf li ġejja: immuntar. Immuntar li jindika d-direttorju tas-servizz build_dir jippermettilek li tissejvja l-cache Jekyll bejn il-pipeline runs, li tħaffef b'mod sinifikanti l-assemblaġġ mill-ġdid.

Inti jista 'wkoll innotajt l-użu tal-fajl releases.yml huwa fajl YAML b'data ta 'rilaxx mitluba minn Github.com (artifatt miksub meta tesegwixxi pipeline). Huwa meħtieġ meta tiġbor is-sit, iżda fil-kuntest tal-artiklu huwa interessanti għalina għax jiddependi mill-istat tiegħu assemblaġġ mill-ġdid ta’ artifact wieħed biss — artifact tal-verżjoni għerq tas-sit (mhux meħtieġ f'artifacts oħra).

Dan huwa implimentat bl-użu tad-dikjarazzjoni kondizzjonali if Mur mudelli u disinji {{ $Root.Files.Get "releases.yml" | sha256sum }} fl-istadju stadji. Taħdem kif ġej: meta tibni artifact għall-verżjoni għerq (varjabbli .Channel huwa daqs root) file hash releases.yml taffettwa l-firma tal-istadju kollu, peress li hija parti mill-isem tal-kompitu Ansible (parametru name). Għalhekk, meta tinbidel kontenut fajl releases.yml l-artifact korrispondenti se jerġa 'jinġabar.

Jekk jogħġbok oqgħod attent ukoll biex taħdem ma' repożitorju estern. Fl-immaġni ta 'artifact minn repożitorju tal-werf, id-direttorju biss huwa miżjud /docs, u skond il-parametri mgħoddija, id-dejta tat-tikketta meħtieġa jew impenn ta 'reviżjoni hija miżjuda immedjatament.

Biex tuża l-mudell tal-artifact biex tiġġenera deskrizzjoni tal-artifact tal-verżjonijiet trasferiti tal-kanali u r-rilaxxi, norganizzaw loop fuq il-varjabbli .WerfVersions в werf.yaml:

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

Għax il-linja se tiġġenera diversi artifacts (nittamaw li hekk), huwa meħtieġ li jittieħed kont tas-separatur bejniethom - is-sekwenza --- (Għal aktar informazzjoni dwar is-sintassi tal-fajl tal-konfigurazzjoni, ara dokumentazzjoni). Kif definit qabel, meta nsejħu mudell f'linja, ngħaddu l-parametri tal-verżjoni, l-URL u l-kuntest tal-għeruq.

Bl-istess mod, iżda mingħajr linja, insejħu l-mudell tal-artifact għal "każijiet speċjali": għall-verżjoni għerq, kif ukoll il-verżjoni mill-impenn tar-reviżjoni:

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

Jekk jogħġbok innota li l-artifact għall-impenn tar-reviżjoni jinbena biss jekk il-varjabbli tkun issettjata .WerfReviewCommit.

L-artifacts huma lesti - wasal iż-żmien li tibda timporta!

L-immaġni finali, iddisinjata biex taħdem fuq Kubernetes, hija NGINX regolari b'fajl ta 'konfigurazzjoni tas-server miżjud nginx.conf u statiku minn artifacts. Minbarra l-artifact tal-verżjoni għerq tas-sit, għandna bżonn nirrepetu l-linja fuq il-varjabbli .WerfVersions biex timporta artifacts tal-kanal u tirrilaxxa verżjonijiet + segwi r-regola tal-ismijiet tal-artifact li adottajna qabel. Peress li kull artifact jaħżen verżjonijiet tas-sit għal żewġ lingwi, aħna jimportawhom fil-postijiet ipprovduti mill-konfigurazzjoni.

Deskrizzjoni tal-immaġni finali 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 -}}

L-immaġni addizzjonali, li, flimkien ma 'dik prinċipali, hija mnedija fuq iċ-ċirkwit dev, fiha biss żewġ verżjonijiet tas-sit: il-verżjoni mill-impenn ta' reviżjoni u l-verżjoni għerq tas-sit (hemm assi ġenerali u, jekk tiftakar , rilaxx tad-data). Għalhekk, l-immaġni addizzjonali se tkun differenti minn dik prinċipali biss fit-taqsima tal-importazzjoni (u, ovvjament, fl-isem):

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

Kif innutat hawn fuq, l-artifact għall-impenn tar-reviżjoni se jiġi ġġenerat biss meta titħaddem il-varjabbli ambjentali stabbilit REVIEW_SHA. Ikun possibbli li l-immaġni werf-dev ma tiġġenera xejn jekk ma jkun hemm l-ebda varjabbli ambjentali REVIEW_SHA, iżda sabiex tindif bil-policies L-immaġini Docker f'werf ħadmu għall-immaġni werf-dev, aħna se nħalluha tinbena biss bl-artifact tal-verżjoni tal-għeruq (diġà hija mibnija xorta waħda), biex tissimplifika l-istruttura tal-pipeline.

L-assemblaġġ huwa lest! Ejja ngħaddu għal CI/CD u sfumaturi importanti.

Pipeline f'GitLab CI u karatteristiċi ta 'bini dinamiku

Meta nħaddmu l-bini għandna bżonn nissettjaw il-varjabbli ambjentali użati fihom werf.yaml. Dan ma japplikax għall-varjabbli REVIEW_SHA, li aħna se nissettjaw meta nsejħu pipeline mill-ganċ GitHub.

Aħna se niġġeneraw id-dejta esterna meħtieġa fi skript Bash generate_artifacts, li se jiġġenera żewġ artifacts tal-pipeline GitLab:

  • fajl releases.yml b'data ta' rilaxx,
  • fajl common_envs.sh, li jkun fih il-varjabbli ambjentali li jridu jiġu esportati.

Kontenut tal-fajl generate_artifacts issib fil tagħna repożitorji b'eżempji. Ir-riċeviment tad-dejta nnifisha mhuwiex is-suġġett tal-artikolu, iżda l-fajl common_envs.sh huwa importanti għalina, għaliex ix-xogħol tal-werf jiddependi minnu. Eżempju tal-kontenut tiegħu:

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'

Tista 'tuża l-output ta' tali skript, pereżempju, billi tuża l-funzjoni Bash source.

Issa tiġi l-parti divertenti. Sabiex kemm il-bini kif ukoll l-iskjerament tal-applikazzjoni jaħdmu b'mod korrett, huwa meħtieġ li jiġi żgurat li werf.yaml kien l-istess l-inqas fi ħdan pipeline wieħed. Jekk din il-kundizzjoni ma tiġix sodisfatta, allura l-firem tal-istadji li werf jikkalkula waqt l-assemblaġġ u, pereżempju, l-iskjerament, ikunu differenti. Dan iwassal għal żball fl-iskjerament, għaliex... l-immaġni meħtieġa għall-iskjerament se tkun nieqsa.

Fi kliem ieħor, jekk waqt l-assemblaġġ tal-immaġni tas-sit l-informazzjoni dwar ir-rilaxxi u l-verżjonijiet tkun l-istess, u fil-ħin tal-iskjerament tiġi rilaxxata verżjoni ġdida u l-varjabbli tal-ambjent għandhom valuri differenti, allura l-iskjerament ifalli bi żball: wara kollox, l-artifact tal-verżjoni l-ġdida għadha ma nbnietx.

Jekk ġenerazzjoni werf.yaml jiddependi fuq data esterna (per eżempju, lista ta 'verżjonijiet attwali, bħal fil-każ tagħna), allura l-kompożizzjoni u l-valuri ta' tali data għandhom jiġu rreġistrati fil-pipeline. Dan huwa speċjalment importanti jekk il-parametri esterni jinbidlu spiss.

Se nkunu tirċievi u tirreġistra data esterna fl-ewwel stadju tal-pipeline f'GitLab (Prebuild) u jittrasmettihom aktar fil-forma Artifatt GitLab CI. Dan jippermettilek tħaddem u terġa 'tibda l-impjiegi tal-pipeline (bini, skjerament, tindif) bl-istess konfigurazzjoni werf.yaml.

Kontenut tal-istadju Prebuild fajl .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

Wara li tkun qabad id-dejta esterna fl-artifatt, tista 'tibni u tuża l-istadji standard tal-pipeline GitLab CI: Ibni u Skjerament. Inniedu l-pipeline innifsu billi nużaw ganċijiet mir-repożitorju tal-Werf GitHub (jiġifieri, meta jkun hemm bidliet fir-repożitorju GitHub). Id-dejta għalihom tista 'tinstab fil-proprjetajiet tal-proġett GitLab fit-taqsima Settings CI/CD -> Pipeline triggers, u mbagħad oħloq il-Webhook korrispondenti f'GitHub (Settings -> Webhooks).

L-istadju tal-bini se jidher bħal dan:

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 se jżid żewġ artifacts mill-istadju għall-istadju tal-bini Prebuild, għalhekk nesportaw varjabbli b'dejta ta 'input ippreparata bl-użu tal-kostrutt source common_envs.sh. Nibdew l-istadju tal-bini fil-każijiet kollha, ħlief għat-tnedija tal-pipeline skont skeda. Skont l-iskeda, se nħaddmu pipeline għat-tindif - f'dan il-każ m'hemmx bżonn li twettaq l-assemblaġġ.

Fl-istadju tal-iskjerament, se niddeskrivu żewġ kompiti - separatament għall-iskjerament għal ċirkwiti ta 'produzzjoni u dev, bl-użu ta' mudell YAML:

.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

Il-kompiti essenzjalment ivarjaw biss billi jindikaw il-kuntest tal-cluster li fih werf għandu jwettaq l-iskjerament (WERF_KUBE_CONTEXT), u l-issettjar tal-varjabbli tal-ambjent tal-linja (environment.name и environment.url), li mbagħad jintużaw f'mudelli ta' chart Helm. Aħna mhux se nipprovdu l-kontenut tal-mudelli, għaliex... m'hemm xejn interessanti hemmhekk għas-suġġett inkwistjoni, iżda tista' ssibhom ġo repożitorji għall-artiklu.

Touch finali

Peress li l-verżjonijiet tal-werf huma rilaxxati spiss, immaġini ġodda se jinbnew ta 'spiss, u r-Reġistru Docker dejjem jikber. Għalhekk, huwa imperattiv li jiġi kkonfigurat it-tindif awtomatiku tal-immaġni bbażat fuq il-politiki. Huwa faċli ħafna li tagħmel.

Biex timplimenta ser ikollok bżonn:

  • Żid pass tat-tindif għal .gitlab-ci.yml;
  • Żid eżekuzzjoni perjodika ta 'kompitu ta' tindif;
  • Stabbilixxi varjabbli ambjentali b'token ta' aċċess għall-kitba.

Żieda ta 'stadju ta' tindif għal .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

Diġà rajna kważi dan kollu ftit ogħla - biss biex tnaddaf trid l-ewwel tidħol fir-Reġistru Docker b'token li għandu d-drittijiet li jħassar immaġini fir-Reġistru Docker (it-token tal-ħidma GitLab CI maħruġ awtomatikament ma jagħmilx). għandhom dawn id-drittijiet). It-token għandu jinħoloq f'GitLab minn qabel u l-valur tiegħu għandu jiġi speċifikat fil-varjabbli ambjentali WERF_IMAGES_CLEANUP_PASSWORD il-proġett (Settings CI/CD -> Varjabbli).

Iż-żieda ta 'kompitu ta' tindif bl-iskeda meħtieġa ssir fi CI/CD ->
Skedi
.

Dak hu: proġett fir-Reġistru Docker mhux se jkompli jikber kontinwament minn immaġini mhux użati.

Fl-aħħar tal-parti prattika, ħalluni nfakkarkom li listi sħaħ mill-artiklu huma disponibbli fi go:

Riżultat

  1. Irċevejna struttura ta 'assemblaġġ loġiku: artifact wieħed għal kull verżjoni.
  2. L-assemblaġġ huwa universali u ma jeħtieġx bidliet manwali meta verżjonijiet ġodda ta 'werf jiġu rilaxxati: id-dokumentazzjoni fuq il-websajt tiġi aġġornata awtomatikament.
  3. Żewġ stampi huma mmuntati għal kontorni differenti.
  4. Jaħdem malajr, għaliex Il-caching jintuża kemm jista 'jkun - meta tiġi rilaxxata verżjoni ġdida ta' werf jew ganċ GitHub jissejjaħ għal impenn ta 'reviżjoni, jinbena mill-ġdid biss l-artifact korrispondenti bil-verżjoni mibdula.
  5. M'hemmx għalfejn taħseb dwar it-tħassir ta 'immaġini mhux użati: it-tindif skont il-politiki tal-werf se jżomm ir-Reġistru Docker fl-ordni.

Sejbiet

  • L-użu ta 'werf jippermetti li l-assemblaġġ jaħdem malajr minħabba l-caching kemm tal-assemblaġġ innifsu kif ukoll il-caching meta taħdem ma' repożitorji esterni.
  • Il-ħidma ma 'repożitorji Git esterni telimina l-ħtieġa li r-repożitorju kollu jiġi kklonat kull darba jew tivvinta mill-ġdid ir-rota b'loġika ta' ottimizzazzjoni delikata. werf juża cache u jagħmel il-klonazzjoni darba biss, u mbagħad juża fetch u biss meta jkun meħtieġ.
  • Kapaċità li tuża mudelli Go fil-fajl tal-konfigurazzjoni tal-bini werf.yaml jippermettilek tiddeskrivi assemblaġġ li r-riżultat tiegħu jiddependi fuq data esterna.
  • L-użu tal-muntatura fil-werf iħaffef b'mod sinifikanti l-ġbir ta 'artifacts - minħabba l-cache, li huwa komuni għall-pipelines kollha.
  • werf jagħmilha faċli biex jiġi kkonfigurat it-tindif, li huwa speċjalment importanti meta tinbena b'mod dinamiku.

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment