Kusangana kwakasimba uye kutumirwa kweDocker mifananidzo ine werf uchishandisa muenzaniso weiyo shanduro yezvinyorwa saiti

Isu takatotaura nezve yedu GitOps chishandiso kanopfuura kamwe werf, uye panguva ino tinoda kugovera ruzivo rwekuunganidza webhusaiti nezvinyorwa zvepurojekiti pachayo - werf.io (yayo Russian vhezheni ndeye ru.werf.io) Iyi inzvimbo yenguva dzose inomira, asi kuungana kwayo kunonakidza nekuti yakavakwa uchishandisa nhamba inochinja yezvigadzirwa.

Kusangana kwakasimba uye kutumirwa kweDocker mifananidzo ine werf uchishandisa muenzaniso weiyo shanduro yezvinyorwa saiti

Hatisi kuzopinda mune nuances yechimiro chesaiti: kugadzira menyu yakajairwa kune ese mavhezheni, peji ine ruzivo nezve kuburitswa, etc. Pane kudaro, isu tichaisa pfungwa pazvinhu uye maficha ekusangana kwakasimba uye zvishoma pane inoperekedza CI / CD maitiro.

Nhanganyaya: Mashandiro anoita saiti

Ngatitange nenyaya yekuti werf zvinyorwa zvinochengetwa pamwe chete nekodhi yayo. Izvi zvinoisa zvimwe zvinodiwa pakusimudzira, izvo zvinowanzopfuura chiyero chechinyorwa ichi, asi zvirinani tinogona kutaura kuti:

  • Zvitsva zvewerf hazvifanirwe kuburitswa pasina kugadzirisa zvinyorwa uye, neimwe nzira, chero shanduko muzvinyorwa zvinoreva kuburitswa kweshanduro itsva yewerf;
  • Iyo purojekiti ine budiriro yakadzikama: shanduro nyowani dzinogona kuburitswa kakawanda pazuva;
  • Chero mashandisirwo emaoko ekuendesa saiti ine vhezheni itsva yezvinyorwa zvinonetesa;
  • Iyo purojekiti inotora semantic maitiro shanduro, ine 5 yakagadzikana migero. Iyo yekuburitsa maitiro inosanganisira sequential ndima yeshanduro kuburikidza nemachani kuitira kuwedzera kugadzikana: kubva kune alpha kusvika padombo-rakasimba;
  • Nzvimbo iyi ine vhezheni yemutauro weRussia, iyo "inorarama uye inovandudza" (kureva izvo zviri mukati zvakagadziridzwa) zvinoenderana neiyo huru (i.e. Chirungu-mutauro) vhezheni.

Kuvanza izvi zvese "kushanda kwemukati" kubva kumushandisi, tichimupa chimwe chinhu "chinoshanda chete", takagadzira patsanura chishandiso chekuisa nekuvandudza werf - ichi chi multiwerf. Iwe unongoda kutsanangura nhamba yekuburitsa uye chiteshi chekugadzikana chawakagadzirira kushandisa, uye multiwerf inoongorora kana paine vhezheni nyowani pachiteshi uye kuidhawunirodha kana zvichidikanwa.

Iyo yazvino vhezheni yewerf inowanikwa mune yega yega vhezheni yekusarudza menyu pane saiti. By default, pa werf.io/documentation iyo yakanyanya kugadzikana chiteshi vhezheni yekuburitswa kwazvino inovhurwa - zvakare inorongedzerwa neinjini dzekutsvaga. Zvinyorwa zvechiteshi zvinowanikwa pamakero akasiyana (semuenzaniso, werf.io/v1.0-beta/documentation ye beta kuburitswa 1.0).

Pakazara, saiti ine zvinotevera shanduro dziripo:

  1. mudzi (inovhura by default),
  2. kune yega yega inoshanda yekuvandudza chiteshi chekuburitswa kwega kwega (e.g. werf.io/v1.0-beta).

Kugadzira imwe shanduro yesaiti, kazhinji, zvakakwana kuiunganidza uchishandisa Jekyll, ichimhanya mudhairekitori /docs werf repository inoenderana command (jekyll build), wakambochinja kuGit tag yeshanduro inodiwa.

Zvinongosara kuwedzera kuti:

  • iyo yekushandisa pachayo (werf) inoshandiswa pakuungana;
  • CI/CD maitiro akavakirwa pahwaro hweGitLab CI;
  • uye zvese izvi, hongu, zvinomhanya muKubernetes.

mabasa

Zvino ngatigadzirei mabasa anofunga nezvese zvakatsanangurwa zvakatsanangurwa:

  1. Mushure mekushandura iyo werf vhezheni pane chero chiteshi chekuvandudza zvinyorwa pasaiti zvinofanirwa kuvandudzwa otomatiki.
  2. Kukudziridza iwe unofanirwa kukwanisa dzimwe nguva ona zvitarisiko zvesaiti.

Kudzokorodza kwesaiti kunofanirwa kuitwa mushure mekushandura vhezheni pane chero chiteshi kubva kune inoenderana Git tag, asi panguva yekuunganidza mufananidzo tinowana anotevera maficha:

  • Sezvo rondedzero yeshanduro pachiteshi ichichinja, zvinongodiwa chete kuvaka patsva zvinyorwa zvezviteshi zvakachinja shanduro. Mushure mezvose, kuvakazve zvese kubva pakutanga hakuna kunaka kwazvo.
  • Seti yemachaneli ekuburitswa inogona kuchinja. Pane imwe nguva nekufamba kwenguva, semuenzaniso, panogona kunge pasina shanduro pamatanho akanyanya kugadzikana kupfuura yekutanga-yekuwana 1.1 kuburitswa, asi ivo vanozoonekwa nekufamba kwenguva - haugone kushandura kuvaka nemaoko mune iyi kesi, handiti?

Icho chinopera icho gungano rinoenderana nekuchinja data rekunze.

Kutevedzera

Kusarudza nzira

Neimwe nzira, iwe unogona kumhanya yega yega inodiwa vhezheni seyakaparadzana pod muKubernetes. Iyi sarudzo inoreva huwandu hukuru hwezvinhu zviri musumbu, izvo zvinokura nekuwedzera kwehuwandu hwekutsiga werf kuburitswa. Uye izvi, zvakare, zvinoreva kugadzirisa kwakaoma: imwe neimwe vhezheni ine yayo HTTP server, ine mutoro mudiki. Ehe, izvi zvinosanganisirawo mari yakawanda yekushandisa.

Takaenda nenzira imwe cheteyo inovaka yemhando dzese dzinodiwa mumufananidzo mumwe. Iyo yakasanganiswa statics yeese mavhezheni esaiti iri mumudziyo une NGINX, uye traffic kune inoenderana Deployment inouya kuburikidza neNGINX Ingress. Chimiro chakareruka - chishandiso chisingaverengeki - chinokutendera kuti ukwire nyore Deployment (zvichienderana nemutoro) uchishandisa Kubernetes pachayo.

Kuti tive zvakanyatsojeka, tinovaka mifananidzo miviri: imwe yedunhu rekugadzira, yechipiri ndeyekuwedzera, yedev circuit. Iyo yekuwedzera mufananidzo unoshandiswa (run) chete padev wedunhu pamwe chete neiyo huru uye ine vhezheni yesaiti kubva pakuita ongororo, uye nzira pakati pavo inoitwa uchishandisa Ingress zviwanikwa.

werf vs git clone uye zvigadzirwa

Sezvambotaurwa, kugadzira saiti statics yeiyo chaiyo vhezheni yezvinyorwa, iwe unofanirwa kuvaka nekuchinja kune inoenderana repository tag. Iwe unogona zvakare kuita izvi nekugadzira iyo repository nguva yega yaunovaka, uchisarudza anoenderana ma tag kubva pane iyo rondedzero. Zvisinei, iyi ibasa rakanyatsogadziriswa uye, nekuwedzera, inoda kunyora mirairo isiri-diki ... Chimwe chinokanganisa chakakomba ndechokuti nenzira iyi, hapana nzira yekuvhara chero chinhu panguva yekuvaka.

Pano iyo werf utility pachayo inouya kuzotibatsira, kuita smart caching uye inokubvumira kushandisa kunze repositories. Kushandisa werf kuwedzera kodhi kubva kune repository kunomhanyisa zvakanyanya kuvaka, sezvo werf ichinyatso gadzira iyo repository kamwe chete yobva yamhanya. chete fetch kana zvakakodzera. Uye zvakare, kana tichiwedzera data kubva kune repository, isu tinogona kusarudza chete anodiwa madhairekitori (munyaya yedu, iyi ndiyo dhairekitori. docs), izvo zvichaderedza zvakanyanya kuwanda kwe data yakawedzerwa.

Sezvo Jekyll chiri chishandiso chakagadzirirwa kuunganidza static mafaera uye hachidiwe mumufananidzo wekupedzisira, zvingave zvine musoro kuunganidza mukati. artifact werf, uye mumufananidzo wokupedzisira pinza chete mhinduro yekubatanidza.

Tinonyora werf.yaml

Saka, takasarudza kuti tichaunganidza vhezheni yega yega mune yakaparadzana werf artifact. Zvisinei, isu hatizivi kuti zvingani zvezvinhu izvi zvichange zviripo panguva yegungano, saka isu hatigone kunyora yakagadziriswa kuvaka dhizaini (kunyatso kutaura, tinogona, asi hazvizonyatso shanda).

werf inobvumidza iwe kushandisa Enda matemplate mufaira rako rekugadzirisa (werf.yaml), uye izvi zvinoita kuti zvikwanisike gadzira config "pane nhunzi" zvichienderana nedata rekunze (zvatinoda!). Kwatiri, data yekunze iruzivo nezve shanduro uye kuburitswa, zvichibva pane yatinounganidza iyo inodiwa nhamba yezvigadzirwa uye titore mifananidzo miviri semhedzisiro: werf-doc и werf-dev yekutanga pamatunhu akasiyana.

Mashoko ekunze anopfuudzwa kuburikidza nemamiriro ezvinhu akasiyana. Heino maitiro avo:

  • RELEASES - mutsara une runyorwa rwekuburitswa uye inoenderana yazvino vhezheni yewerf, senge nzvimbo-yakapatsanurwa runyorwa rwezvakakosha mufomati <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>. Muenzaniso: 1.0%v1.0.4-beta.20
  • CHANNELS - mutsara une runyorwa rwezviteshi uye inoenderana yazvino vhezheni yewerf, muchimiro chenzvimbo-yakapatsanurwa runyorwa rwezvakakosha mufomati <КАНАЛ>%<НОМЕР_ВЕРСИИ>. Muenzaniso: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION - werf kuburitsa vhezheni kuratidza nekumisikidza pane saiti (hazvina basa nguva dzose kuratidza zvinyorwa nenhamba yepamusoro yekuburitsa). Muenzaniso: v1.0.4-beta.20
  • REVIEW_SHA - iyo hashi yekudzokorora kuzvipira kubva iyo vhezheni yedunhu rekuyedza inofanira kuvakwa.

Aya akasiyana achave akagarwa muGitLab CI pombi, uye kuti chaizvo zvinotsanangurwa pazasi.

Chokutanga pane zvose, kuti zvive nyore, ngatitsanangurire werf.yaml Enda ma template akasiyana nekuvapa kukosha kubva kune zvakatipoteredza zvinosiyana:

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

Tsananguro yeiyo artifact yekugadzira iyo static vhezheni yesaiti kazhinji yakafanana kune ese nyaya dzatinoda (kusanganisira kugadzira iyo midzi vhezheni, pamwe neshanduro yedev-contour). Naizvozvo, isu tichaitora kune imwe yakaparadzana block tichishandisa basa define - kuti ushandise zvakare uchibatsirwa ne include. Isu tichapfuudza zvinotevera nharo kune template:

  • Version - iyo yakagadzirwa vhezheni (tag zita);
  • Channel - zita reiyo chiteshi chekuvandudza icho chinogadzirwa;
  • Commit - ita hashi, kana iyo artifact yakagadzirwa kuti iongorore;
  • context.

Tsanangudzo yeiyo artifact template

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

Zita rezvivakwa rinofanirwa kunge rakasiyana. Tinogona kuita izvi, semuenzaniso, nekuwedzera zita rechiteshi (iyo inoshanduka kukosha .Channel) sechivakashure kuzita rezvinyorwa: artifact: doc-{{ .Channel }}. Asi iwe unofanirwa kunzwisisa kuti kana uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchifanirwa, iwe unofanirwa kutaura kune iwo mazita akafanana.

Kana uchitsanangura chigadzirwa, zvinotevera werf chimiro chinoshandiswa: mounting. Kuiswa nedhairekitori rebasa rakatsanangurwa build_dir inokutendera iwe kuchengetedza iyo Jekyll cache pakati pepombi inomhanya, iyo zvakanyanya kukurumidza kuunganidzazve.

Iwe unogona zvakare kuona kushandiswa kwefaira releases.yml - ifaira reYAML rine data rekuburitsa rakakumbirwa kubva Github.com (chigadzirwa chakawanikwa pakuita pombi). Inodiwa pakuronga saiti, asi muchirevo chechinyorwa, inonakidza kwatiri nekuti mamiriro ayo anoenderana kubatanidzwazve kwechinhu chimwe chete - artifact yemudzi vhezheni yesaiti (haidiwe mune zvimwe zvigadzirwa).

Izvi zvinoitwa uchishandisa conditional opareta. if Enda matemplate uye gadzira {{ $Root.Files.Get "releases.yml" | sha256sum }} pachikuva matanho. Inoshanda seizvi: kana uchivaka chigadzirwa cheiyo midzi vhezheni (variable .Channel yakaenzana root) faira hashi releases.yml inokanganisa siginecha yechikamu chose, sezvo chiri chikamu cheAnsible basa zita (parameter name) Saka, kana kuchinja zviri mukati faira releases.yml chigadzirwa chinowirirana chichabatanidzwa zvakare.

Ndokumbirawo utarise kushanda nekunze repository. Mumufananidzo we artifact kubva werf repositories, dhairekitori chete rinowedzerwa /docs, uye zvichienderana nematanho apfuura, iyo data yeinodiwa tag kana yekudzokorora kuzvipira inowedzerwa nekukurumidza.

Kuti ushandise iyo artifact template kugadzira iyo artifact tsananguro yeakatamiswa chiteshi shanduro uye kuburitswa, isu tinoronga loop nekusiyana. .WerfVersions в werf.yaml:

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

Sezvo kutenderera kuchizogadzira akati wandei artifacts (tinovimba kudaro), zvinodikanwa kuti titarise iyo inoparadzanisa pakati pavo - iyo inoteedzana. --- (kuti uwane rumwe ruzivo nezve iyo yekumisikidza faira syntax, ona zvinyorwa) Sezvatakatsanangura pakutanga, kana tichidaidza template muchiuno, tinopfuudza iyo vhezheni paramita, URL uye mudzi mamiriro.

Saizvozvo, asi pasina kutenderera, isu tinodaidza iyo artifact template ye "yakakosha kesi": yeiyo vhezheni yemidzi, pamwe neshanduro kubva muchibvumirano chekuongorora:

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

Ziva kuti iyo artifact yekudzokorora kuzvipira inongovakwa chete kana iyo shanduko yaiswa. .WerfReviewCommit.

Izvo zvigadzirwa zvagadzirira - nguva yekutanga kuunza kunze!

Mufananidzo wekupedzisira wakanangana kumhanya paKubernetes ndeye yenguva dzose NGINX ine server yekumisikidza faira yakawedzerwa kwairi. nginx.conf uye statics kubva kune artifacts. Pamusoro peiyo artifact yemudzi vhezheni yesaiti, isu tinofanirwa kudzokorora kutenderera nekusiyana .WerfVersions kupinza chiteshi uye kuburitsa vhezheni zvigadzirwa + tevera iyo artifact yekutumidza mutemo watakatora kare. Sezvo chigadzirwa chega chega chichichengeta shanduro dzesaiti yemitauro miviri, tinoipinza kunzvimbo dzakapihwa nekumisikidzwa.

Tsanangudzo yemufananidzo wekupedzisira 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 -}}

Iyo yekuwedzera mufananidzo, iyo inotangwa pane dev-circuit pamwe chete neiyo huru, ine chete shanduro mbiri dzesaiti: iyo vhezheni kubva mukuita ongororo uye mudzi vhezheni yesaiti (iyo ine zvinhu zvakajairika uye, kana uchirangarira, buritsa data). Nokudaro, mufananidzo wekuwedzera uchasiyana kubva kune mukuru chete muchikamu chekutumira (uye, zvechokwadi, zita):

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

Sezvataurwa pamusoro apa, iyo artifact yekudzokorora kuzvipira inongogadzirwa kana ichimhanyisa yakasarudzika nharaunda REVIEW_SHA. Zvingakwanisika kusagadzira iyo werf-dev mufananidzo zvachose kana pasina nharaunda inoshanduka REVIEW_SHA, asi kuti kuchenesa nemitemo Docker mifananidzo mu werf yakashandira iyo werf-dev mufananidzo, isu tichaisiya ichivakwa chete nemudzi vhezheni artifact (yakatovakwa zvakadaro), kurerutsa iyo pombi chimiro.

Chigadzirwa chakagadzirira! Ngatienderei kuCI/CD uye akakosha nuances.

Pipeline muGitLab CI uye maficha ane simba kuvaka

Paunenge uchimhanyisa kuvaka, isu tinofanirwa kuseta nharaunda dzakasiyana dzinoshandiswa mukati werf.yaml. Izvi hazvishande kune REVIEW_SHA shanduko, yatichaisa kana tichidaidza pombi kubva kuGitHub hook.

Isu tichafambisa kuumbwa kweiyo inodiwa yekunze data kune Bash script generate_artifacts, iyo ichagadzira maviri GitLab pombi artifacts:

  • faira releases.yml ine data rekuburitsa,
  • faira common_envs.sh, ine zvakatipoteredza zvakasiyana-siyana zvekutengesa kunze.

Zvinyorwa zvemafaira generate_artifacts uchawana mune yedu repositories nemienzaniso. Iyo data yekutora pachayo haisi nyaya yechinyorwa, asi faira common_envs.sh kwakakosha kwatiri, nekuti kushanda kwewerf kunoenderana nazvo. Muenzaniso wezviri mukati maro:

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'

Kubuda kwechinyorwa chakadaro kunogona kushandiswa, semuenzaniso, kushandisa basa reBash source.

Zvino kunouya chikamu chinonyanya kufadza. Kuti zvese kuungana uye kutumirwa kwechikumbiro kushande nemazvo, zvinodikanwa kuve nechokwadi kuti werf.yaml yakanga iri zvimwe chete zvishoma mukati mepiipi imwe. Kana mamiriro aya asina kusangana, ipapo masiginecha echikuva ayo werf anoverenga panguva yegungano uye, semuenzaniso, kutumirwa, achave akasiyana. Izvi zvinotungamira kukanganisa kwekutumira, sezvo mufananidzo unodiwa pakutumirwa uchashaikwa.

Mune mamwe mazwi, kana panguva yekusangana kwechifananidzo chesaiti ruzivo rwekuburitswa uye shanduro dzakafanana, uye panguva yekutumirwa shanduro itsva inoburitswa uye mamiriro ekunze ane maitiro akasiyana, ipapo kutumirwa kunopera nekukanganisa: mushure mezvose, iyo artifact yeshanduro itsva haisati yaunganidzwa.

Kana chizvarwa werf.yaml zvinoenderana nedata rekunze (somuenzaniso, runyoro rweshanduro dzemazuva ano, sezvatiri isu), ipapo kuumbwa uye kukosha kweiyo data kunofanirwa kunyorwa mukati mepombi. Izvi zvinonyanya kukosha kana ekunze maparameter achichinja kazhinji.

Tichadaro gamuchira uye rekodha data rekunze pachikamu chekutanga chepombi muGitLab (Prebuild) uye woaendesa mberi mune fomu GitLab CI zvigadzirwa. Izvi zvinokutendera kuti umhanye uye utangezve mabasa epombi (kuvaka, kuendesa, kuchenesa) nekumisikidzwa kwakafanana mu. werf.yaml.

Zviri mukati medariro Prebuild faira .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

Kuve wakamisikidza data rekunze mune artifact, unogona kuvaka uye kuendesa uchishandisa akajairwa nhanho dzeGitLab CI pombi: Vaka uye Deploy. Isu tinotangisa pombi yacho pachayo tichishandisa hoko kubva kune werf GitHub repository (kureva kana paine shanduko mune repository paGitHub). Iyo data kwavari inogona kutorwa kubva kuGitLab purojekiti zvivakwa muchikamu CI/CD Zvirongwa -> Pipeline zvinokonzeresa, uye wobva wagadzira iyo inoenderana Webhook muGitHub (Zvirongwa -> Webhooks).

Nhanho yekugadzira ichaita seizvi:

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 ichawedzera maviri artifacts kubva padanho kusvika padanho rekuvaka Prebuild, saka isu tinotumira kunze zvakasiyana neakagadzirirwa data data tichishandisa kuvaka source common_envs.sh. Isu tinotangisa nhanho yekuvaka mune zvese zviitiko kunze kwekuvhura iyo pombi pane yakarongwa. Pachirongwa, isu tichavhura pombi yekuchenesa - hapana chikonzero chekuita kuvaka mune iyi kesi.

Padanho rekuendesa, isu tichatsanangura mabasa maviri - akasiyana kuti aendeswe kukugadzira uye dev maseketi, tichishandisa YAML template:

.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

Iwo mabasa anonyanya kusiyana chete muchiratidzo che cluster mamiriro umo werf inofanirwa kuita deployment (WERF_KUBE_CONTEXT), uye kuseta iyo contour nharaunda zvinosiyana (environment.name и environment.url), ayo anobva ashandiswa muHelm chati matemplate. Hatisi kuzopa zviri mukati mematemplate, sezvo pasina chinhu chinonakidza chemusoro uri kutariswa, asi unogona kuzviwana mukati. repositories kuchinyorwa.

kubata kwekupedzisira

Sezvo shanduro dzewerf dzichiburitswa kazhinji, mifananidzo mitsva ichavakwa kazhinji, uye Docker Registry inogara ichikura. Naizvozvo, zvinodikanwa kumisikidza otomatiki yekuchenesa mifananidzo nemapolicy. Zviri nyore chaizvo kuita.

Kuti ushandise, iwe uchada:

  • Wedzera danho rekuchenesa kune .gitlab-ci.yml;
  • Wedzera nguva nenguva yekuita basa rekuchenesa;
  • Gadzirisa shanduko yemamiriro ekunze ine chiratidzo chekunyora.

Wedzera danho rekuchenesa kune .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

Isu takatoona zvingangoita zvese izvi pamusoro - chete kuti uzvichenese, unofanirwa kutanga wapinda muDocker Registry nechiratidzo chine kodzero yekudzima mifananidzo muDocker Registry (chiratidzo chakapihwa otomatiki cheGitLab CI basa harina kodzero dzakadaro). Chiratidzo chinofanira kugadzirwa muGitLab pachine nguva uye kukosha kwayo kunofanirwa kutsanangurwa mune nharaunda inoshanduka WERF_IMAGES_CLEANUP_PASSWORD chirongwa (CI/CD Settings -> Variables).

Kuwedzera basa rekuchenesa nehurongwa hunodiwa hunoitwa mukati CI/CD ->
Schedules
.

Ndizvozvo: yako Docker Registry purojekiti haichazogara ichikura kubva pamifananidzo isina kushandiswa.

Mukupedzisa kwechikamu chinoshanda, ndinoda kukuyeuchidza kuti zvizere zvinyorwa kubva muchinyorwa zvinowanikwa mukati Git:

mugumisiro

  1. Isu tine dhizaini yegungano ine musoro: imwe artifact pashanduro.
  2. Iyo gungano ndeyepasirese uye haidi shanduko yemanyorero kana shanduro itsva dzewerf dzaburitswa: zvinyorwa zviri pasaiti zvinogadziridzwa otomatiki.
  3. Mifananidzo miviri inounganidzwa kune akasiyana contours.
  4. Inoshanda nekukasira nekuti caching inoshandiswa kusvika padanho repamusoro - kana vhezheni nyowani yewerf ikaburitswa kana GitHub hook ichidanwa kuti iite ongororo, chete dhizaini inoenderana neshanduro yakashandurwa inovakwazve.
  5. Hapana chikonzero chekunetseka nezvekudzima mifananidzo isina kushandiswa: werf policy-based cleanup inochengeta yako Docker Registry yakachena.

zvakawanikwa

  • Kushandisa werf kunobvumira kuvaka kushanda nekukurumidza nekuda kwecaching yezvivakwa pachayo uye caching kana uchishanda nekunze repositori.
  • Kushanda nekunze kweGit repositori kunobvisa kukosha kwekubatanidza iyo repository nguva dzese zvachose kana kudzoreredza vhiri rine hunyengeri optimization logic. werf inoshandisa cache uye clones kamwe chete, uyezve inoshandisa fetch uye chete pazvinenge zvakakodzera.
  • Kugona kushandisa Go matemplate mukuvaka kumisikidza faira werf.yaml inokubvumira kuti utsanangure gungano rine chigumisiro chinoenderana nekunze data.
  • Kushandisa kukwidziridzwa mu werf kunomhanyisa zvakanyanya kuunganidzwa kwezvigadzirwa - nekuda kwecache, iyo inowanikwa kune ese mapaipi.
  • werf inoita kuti zvive nyore kumisikidza kuchenesa, iyo inonyanya kukosha kune ane simba anovaka.

PS

Verenga zvakare pablog yedu:

Source: www.habr.com

Tenga inovimbika yekutambira kwemasaiti ane DDoS dziviriro, VPS VDS maseva 🔥 Tenga webhusaiti yakavimbika ine dziviriro yeDDoS, maseva eVPS VDS | ProHoster