Fivoriambe sy fametrahana sary Docker miaraka amin'ny werf amin'ny alàlan'ny ohatra amin'ny tranokalan-drakitra misy version

Efa niresaka momba ny fitaovana GitOps izahay mihoatra ny indray mandeha. werf, ary amin'ity indray mitoraka ity dia te hizara ny traikefanay amin'ny fanangonana ny tranokala miaraka amin'ny antontan-taratasy momba ny tetikasa izahay - werf.io (ny dikan-teny Rosiana dia en.werf.io). Tranonkala static tsotra ity, saingy mahaliana ny fivorian'izy io satria namboarina tamin'ny artifact maro be.

Fivoriambe sy fametrahana sary Docker miaraka amin'ny werf amin'ny alàlan'ny ohatra amin'ny tranokalan-drakitra misy version

Midira ao amin'ny firafitry ny tranokala: mamorona menu mahazatra ho an'ny dikan-teny rehetra, pejy misy fampahalalana momba ny famoahana, sns. - tsy hanao izany izahay. Andao kosa hifantoka amin'ireo olana sy endri-javatra amin'ny fivoriambe mavitrika ary kely amin'ny fizotran'ny CI/CD miaraka aminy.

Fampidirana: ny fomba fiasan'ny tranokala

Hanombohana, ny antontan-taratasy werf dia voatahiry miaraka amin'ny kaody. Izany dia mametraka fepetra takiana amin'ny fampandrosoana izay amin'ny ankapobeny mihoatra ny faritr'ity lahatsoratra ity, saingy farafaharatsiny dia azo lazaina fa:

  • Ny fiasan'ny werf vaovao dia tsy tokony havoaka raha tsy misy fanavaozana ny antontan-taratasy ary, mifanohitra amin'izany, ny fiovana rehetra ao amin'ny antontan-taratasy dia midika ny famoahana dikan-teny vaovao amin'ny werf;
  • Ny tetikasa dia manana fivoarana somary mafimafy kokoa: ny dikan-teny vaovao dia azo avoaka imbetsaka isan'andro;
  • Mandreraka farafaharatsiny ny asa atao amin'ny tanana amin'ny fametrahana vohikala misy antontan-taratasy vaovao;
  • Ny tetikasa dia mampiasa fomba fiasa semantika versioning, misy fantsona fitoniana 5. Ny dingan'ny famoahana dia misy andalan-teny misesy amin'ny alàlan'ny fantsona mba hampitomboana ny fitoniana: manomboka amin'ny alpha mankany rock-solid;
  • Ny tranonkala dia manana dikan-teny Rosiana, izay "miaina sy mivoatra" (izany hoe ny votoatiny izay nohavaozina) mifanaraka amin'ny dikan-teny fototra (izany hoe, amin'ny teny anglisy).

Mba hanafenana an'ity "dakozia anatiny" rehetra ity amin'ny mpampiasa, manolotra azy zavatra izay "miasa fotsiny", dia nanao izahay misaraka werf fitaovana fametrahana sy fanavaozana - ity dia multiwerf. Ilainao fotsiny ny mamaritra ny laharan'ny famoahana sy ny fantsona fitoniana izay vonona hampiasainao, ary ny multiwerf dia hanamarina raha misy dikan-teny vaovao ao amin'ny fantsona ary alaina raha ilaina izany.

Ao amin'ny menio fifantenana dikan-teny ao amin'ny tranokala, ny dikan-teny farany amin'ny werf dia misy amin'ny fantsona tsirairay. Amin'ny alàlan'ny default, amin'ny adiresy werf.io/documentation mivoha ny dikan-tenin'ny fantsona marin-toerana indrindra ho an'ny famoahana farany - voatondron'ny milina fikarohana ihany koa izy io. Ny antontan-taratasy momba ny fantsona dia misy amin'ny adiresy samihafa (ohatra, werf.io/v1.0-beta/documentation ho an'ny famoahana beta 1.0).

Amin'ny fitambarany, manana ireto dikan-teny manaraka ireto ny tranokala:

  1. faka (misokatra amin'ny alàlan'ny default),
  2. ho an'ny fantsona fanavaozana mavitrika isaky ny famoahana (ohatra, werf.io/v1.0-beta).

Mba hamoronana dikan-teny manokana amin'ny tranokala iray, amin'ny ankapobeny, dia ampy ny manangona azy amin'ny fampiasana Jekyllamin'ny fandehanana ao amin'ny lahatahiry /docs werf repository mifanaraka amin'ny baiko (jekyll build), rehefa avy nifindra tany amin'ny Git tag an'ny dikan-teny ilaina.

Mbola ampiana ihany hoe:

  • ny fitaovana (werf) dia ampiasaina amin'ny fivoriambe;
  • Ny fizotry ny CI/CD dia miorina amin'ny GitLab CI;
  • ary izany rehetra izany, mazava ho azy, dia mandeha ao amin'ny Kubernetes.

asa

Andeha isika izao hamolavola asa izay mandinika ireo fepetra voafaritra rehetra:

  1. Rehefa avy nanova ny dikan-werf amin'ny fantsona fanavaozana rehetra ny antontan-taratasy ao amin'ny tranokala dia tokony havaozina ho azy.
  2. Ho an'ny fampandrosoana dia mila mahay ianao indraindray jereo ny dikan-tenin'ny tranonkala.

Ny tranokala dia tsy maintsy averina averina aorian'ny fanovana ny dikan-teny amin'ny fantsona rehetra avy amin'ny marika Git mifanaraka amin'izany, fa eo am-pananganana ny sary dia hahazo ireto endri-javatra manaraka ireto isika:

  • Satria miova ny lisitry ny dikan-teny amin'ny fantsona, dia ilaina ihany ny manangana ny antontan-taratasy ho an'ny fantsona izay niova ny dikan-. Rehefa dinihina tokoa, ny fanamboarana ny zava-drehetra indray dia tsy dia mahafinaritra.
  • Mety hiova ny fitambaran'ny fantsona famoahana. Amin'ny fotoana iray, ohatra, dia mety tsy hisy dikan-teny miorina kokoa noho ny famoahana 1.1 vao haingana, fa rehefa mandeha ny fotoana dia hiseho izy ireo - amin'ity tranga ity, tsy tokony hanova ny fivoriambe amin'ny tanana ve ianao?

Mipoitra izany ny fivoriambe dia miankina amin'ny fanovana angona ivelany.

fanatanterahana

Mifidy fomba fiasa

Raha tsy izany, azonao atao ny mampandeha ny dikan-teny ilaina ho toy ny pod misaraka amin'ny Kubernetes. Ity safidy ity dia midika zavatra betsaka kokoa ao amin'ny cluster, izay hitombo miaraka amin'ny fitomboan'ny isan'ny famoahana werf stable. Ary izany, kosa, dia midika fikojakojana sarotra kokoa: ny dikan-teny tsirairay dia manana mpizara HTTP azy manokana, ary misy entana kely. Mazava ho azy fa mitaky sandan'ny loharanon-karena lehibe kokoa izany.

Niara-dalana izahay fanangonana ny dikan-teny rehetra ilaina amin'ny sary iray. Ny statika voaangona amin'ny dikan-teny rehetra amin'ny tranokala dia hita ao anaty container misy NGINX, ary ny fifamoivoizana mankany amin'ny Deployment mifanaraka amin'izany dia avy amin'ny NGINX Ingress. Firafitra tsotra - fampiharana tsy misy fanjakana - mamela anao hamaritra mora foana ny Deployment (miankina amin'ny entana) amin'ny fampiasana Kubernetes mihitsy.

Raha ho marimarina kokoa, dia manangona sary roa izahay: ny iray ho an'ny faritra famokarana, ny faharoa dia fanampiny ho an'ny faritra dev. Ny sary fanampiny dia ampiasaina (natomboka) afa-tsy amin'ny faritra dev miaraka amin'ny lehibe iray ary misy ny dikan-tranonkala avy amin'ny commit famerenana, ary ny fandehanana eo anelanelan'izy ireo dia atao amin'ny alàlan'ny loharano Ingress.

werf vs git clone sy artifacts

Araka ny efa voalaza, mba hamoronana statika amin'ny tranokala ho an'ny dikan-teny manokana amin'ny antontan-taratasy dia mila manangana ianao amin'ny alàlan'ny fifindrana amin'ny tenifototra mety. Azonao atao koa ny manao izany amin'ny alàlan'ny fametahana ny tahiry isaky ny manangana ianao, mifantina ireo marika mifanaraka amin'ny lisitra. Na izany aza, ity dia fampandehanana miompana amin'ny loharanon-karena ary, ankoatra izany, dia mila manoratra toromarika tsy misy dikany ... Ny fatiantoka lehibe iray hafa dia ny tsy fisian'ny fomba fitahirizana zavatra mandritra ny fivoriambe.

Eto ny werf utility dia tonga manampy antsika, manatanteraka smart caching ary mamela anao hampiasa repository ivelany. Ny fampiasana werf hanampiana kaody avy amin'ny tahiry dia hanafaingana ny fananganana, satria werf dia manao klone indray mandeha ny tahiry ary avy eo dia manatanteraka ihany fetch raha ilaina. Ho fanampin'izay, rehefa manampy angona avy amin'ny tahiry dia tsy afaka misafidy afa-tsy ny lahatahiry ilaina isika (amin'ny tranga misy antsika dia ity ny lahatahiry docs), izay hampihena be ny habetsaky ny angona fanampiny.

Koa satria Jekyll dia fitaovana natao hanangonana angona static ary tsy ilaina amin'ny sary farany, dia mety ho lojika ny fanangonana amin'ny werf artifact, ary amin'ny sary farany ampidiro ihany ny vokatra fanangonana.

Manoratra werf.yaml izahay

Noho izany, nanapa-kevitra izahay fa hanangona ny dikan-teny tsirairay ao anaty artifact werf misaraka. Na izany aza isika tsy fantatray hoe firy amin'ireo artifact ireo no hisy mandritra ny fivoriambe, noho izany dia tsy afaka manoratra rindrankajy fananganana raikitra izahay (amin'ny teny hentitra, mbola afaka, saingy tsy hahomby tanteraka izany).

werf mamela anao hampiasa Mandehana môdely ao amin'ny fisienao (werf.yaml), ary izany no mahatonga izany mamorona config amin'ny lalitra miankina amin'ny data ivelany (izay ilainao!). Ny angon-drakitra ivelany amin'ny tranga misy anay dia fampahalalana momba ny dikan-teny sy famoahana, mifototra amin'ny fanangonana ny isan'ny artifact ilaina ary vokatr'izany dia mahazo sary roa izahay: werf-doc и werf-dev mihazakazaka amin'ny faritra samihafa.

Ny angona ivelany dia mandalo amin'ny fari-piainan'ny tontolo iainana. Ity ny composition'izy ireo:

  • RELEASES - tsipika misy lisitry ny famoahana sy ny dikan-teny mifandraika amin'izao fotoana izao amin'ny werf, amin'ny endrika lisitry ny soatoavina misaraka amin'ny endrika <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>... ohatra: 1.0%v1.0.4-beta.20
  • CHANNELS - tsipika misy lisitry ny fantsona sy ny dikan-teny mifandraika amin'izao fotoana izao amin'ny werf, amin'ny endrika lisitry ny soatoavina misaraka amin'ny endrika <КАНАЛ>%<НОМЕР_ВЕРСИИ>... ohatra: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION - dikan-teny famoahana werf aseho amin'ny alàlan'ny default amin'ny tranokala (tsy ilaina foana ny mampiseho antontan-taratasy amin'ny isa avo indrindra). Ohatra: v1.0.4-beta.20
  • REVIEW_SHA - hash amin'ny commit famerenana izay ilainao hananganana ny kinova ho an'ny loop test.

Hofenoina ao amin'ny pipeline GitLab CI ireo fari-pahalalana ireo, ary ahoana ny fanoratana marina eto ambany.

Voalohany indrindra, ho an'ny fanamorana, dia mamaritra ny in werf.yaml Mandehana variana môdely, manendry azy ireo sanda avy amin'ny fari-piainan'ny tontolo iainana:

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

Ny fanoritsoritana ny artifact amin'ny fanangonana ny dikan-teny static amin'ny tranokala dia mitovy amin'ny tranga rehetra ilaintsika (anisan'izany ny famoronana ny dikan-teny fototra, ary koa ny dikan-teny ho an'ny circuit dev). Noho izany, hamindra azy amin'ny sakana mitokana isika amin'ny fampiasana ny fiasa define - ho an'ny fampiasana indray manaraka include. Handefa ireto hevitra manaraka ireto amin'ny môdely izahay:

  • Version - dikan-teny noforonina (anaran'ny marika);
  • Channel - ny anaran'ny fantsona fanavaozana izay namoronana ny artifact;
  • Commit - commit hash, raha ny artifact dia noforonina ho an'ny famerenana famerenana;
  • contexte.

Famaritana ny Template Artifact

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

Tsy maintsy miavaka ny anaran'ny artifact. Azontsika atao izany, ohatra, amin'ny fampidirana ny anaran'ny fantsona (ny sandan'ny variable .Channel) ho tovana amin'ny anaran'ny artifact: artifact: doc-{{ .Channel }}. Saingy mila mahatakatra ianao fa rehefa manafatra avy amin'ny artifacts dia mila manondro anarana mitovy ianao.

Rehefa manoritsoritra artifact dia ireto endri-javatra werf manaraka ireto no ampiasaina: fitomboan'ny. Fametrahana manondro ny lisitry ny serivisy build_dir mamela anao hamonjy ny cache Jekyll eo anelanelan'ny fantsona fantsona, izay tena manafaingana ny reassembly.

Mety ho voamarikao koa ny fampiasana ilay rakitra releases.yml dia rakitra YAML misy angona famoahana nangatahana github.com (artifact azo rehefa manatanteraka fantsona). Ilaina izany rehefa manangona ny tranokala, fa amin'ny tontolon'ny lahatsoratra dia mahaliana antsika izany satria miankina amin'ny toerany famerenana indray ny artifact iray ihany - artifact amin'ny dikan-teny fototry ny tranokala (tsy ilaina amin'ny artifacts hafa).

Izany dia ampiharina amin'ny fampiasana ny fanambarana misy fepetra if Mandehana modely sy endrika {{ $Root.Files.Get "releases.yml" | sha256sum }} an-tsehatra dingana. Izy io dia miasa toy izao manaraka izao: rehefa manangana artifact ho an'ny version root (variable .Channel mitovy amin'ny root) rakitra hash releases.yml dia misy fiantraikany amin'ny sonia ny dingana manontolo, satria anisan'ny anaran'ny asa Ansible (parameter name). Araka izany, rehefa miova votoaty rakitra releases.yml ny artifact mifanaraka amin'izany dia hatambatra indray.

Azafady, tandremo ihany koa ny miasa miaraka amin'ny tahiry ivelany. Ao amin'ny sarin'ny artifact avy amin'ny werf repository, ny lahatahiry ihany no ampiana /docs, ary miankina amin'ny mari-pamantarana nandalo, dia ampiana avy hatrany ny angon-drakitra momba ny marika ilaina na commit famerenana.

Raha hampiasa ny môdely artifact mba hamoronana famaritana ny artifact amin'ny dikan-teny nafindra amin'ny fantsona sy famoahana, dia mandamina tsipika momba ny fari-piainana izahay. .WerfVersions в werf.yaml:

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

SATRIA Ny loop dia hamorona artifacts maromaro (manantena izahay fa izany), ilaina ny mandinika ny separator eo anelanelan'izy ireo - ny filaharana --- (Raha mila fanazavana fanampiny momba ny syntax file configuration dia jereo tahirin-kevitra). Araka ny voafaritra teo aloha, rehefa miantso môdely ao anaty tadivavarana isika dia mandalo ny mari-pamantarana dikan-teny, URL ary fotony fototra.

Toy izany koa, saingy tsy misy loop, dia antsoinay ny môdely artifact ho an'ny "tranga manokana": ho an'ny dikan-teny fototra, ary koa ny dikan-teny avy amin'ny famerenana:

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

Azafady, mariho fa ny artifact ho an'ny commit famerenana dia hamboarina raha toa ka napetraka ny variable .WerfReviewCommit.

Efa vonona ny artifacts - fotoana hanombohana manafatra!

Ny sary farany, natao hihazakazaka amin'ny Kubernetes, dia NGINX mahazatra miaraka amin'ny rakitra fanamafisam-peo fanampiny nginx.conf ary static avy amin'ny artifacts. Ho fanampin'ny artifact amin'ny dikan-teny fototry ny tranokala dia mila mamerina ny loop amin'ny variable isika .WerfVersions hanafatra artifacts amin'ny fantsona sy famoahana dikan-teny + araho ny fitsipika nomena anarana artifact izay noraisinay teo aloha. Koa satria ny artifact tsirairay dia mitahiry ny dikan-tranonkala ho an'ny fiteny roa, manafatra azy ireo any amin'ny toerana omen'ny tefy.

Famaritana ny sary farany 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 -}}

Ny sary fanampiny, izay, miaraka amin'ny lehibe indrindra, dia natomboka tao amin'ny faritra dev, dia tsy misy afa-tsy dikan-teny roa amin'ny tranokala: ny dikan-teny avy amin'ny famerenana commit sy ny dikan-teny fototry ny tranokala (misy fananana ankapobeny ary, raha tadidinao , famoahana data). Noho izany, ny sary fanampiny dia tsy hitovy amin'ny lehibe amin'ny fizarana fanafarana (ary, mazava ho azy, amin'ny anarana):

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

Araka ny nomarihina etsy ambony, ny artifact ho an'ny commit famerenana dia hatsangana raha tsy rehefa mandeha ny fari-piainan'ny tontolo iainana REVIEW_SHA. Azo atao ny tsy mamorona sary werf-dev mihitsy raha tsy misy fari-piainan'ny tontolo iainana REVIEW_SHA, fa mba fanadiovana amin'ny politika Ny sary Docker ao amin'ny werf dia niasa ho an'ny sary werf-dev, avelantsika hamboarina miaraka amin'ny artifact dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-teny tsara}}?

Efa vonona ny fivoriambe! Andao hiroso amin'ny CI/CD sy ireo nuance manan-danja.

Pipeline ao amin'ny GitLab CI sy ny endri-javatra fananganana mavitrika

Rehefa mihazakazaka ny fananganana dia mila mametraka ny fari-piainan'ny tontolo iainana ampiasaina werf.yaml. Tsy mihatra amin'ny fari-pahalalana REVIEW_SHA izany, izay hapetratsika rehefa miantso fantsona avy amin'ny GitHub hook.

Hamorona ny angona ivelany ilaina amin'ny script Bash izahay generate_artifacts, izay hamorona artifact pipeline roa GitLab:

  • rakitra releases.yml miaraka amin'ny angon-drakitra famoahana,
  • rakitra common_envs.sh, misy ny fari-piainan'ny tontolo iainana haondrana.

Ny votoatin'ny rakitra generate_artifacts ho hitanao ato aminay repository misy ohatra. Ny fandraisana ny angon-drakitra dia tsy ny lohahevitry ny lahatsoratra, fa ny rakitra common_envs.sh zava-dehibe amintsika, satria miankina amin'io ny asan'ny werf. Ohatra amin'ny votoatiny:

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'

Azonao atao ny mampiasa ny vokatry ny script toy izany, ohatra, mampiasa ny asa Bash source.

Tonga izao ny ampahany mahafinaritra. Mba hahafahan'ny fananganana sy ny fametrahana ny fampiharana miasa tsara dia ilaina ny miantoka izany werf.yaml izany no mitovy kely indrindra ao anatin'ny fantsona iray. Raha tsy mahafeno io fepetra io, dia ho hafa ny sonian'ny dingana izay kajy mandritra ny fivoriambe ary, ohatra, ny fametrahana. Hiteraka fahadisoana amin'ny fametrahana izany, satria... ny sary ilaina amin'ny fametrahana dia tsy hita.

Raha lazaina amin'ny teny hafa, raha mitovy ny fampahalalana momba ny famoahana sy ny dikan-teny mandritra ny fivoriamben'ny sarin'ny tranokala, ary amin'ny fotoana fametrahana dia misy dikan-teny vaovao navoaka ary manana sanda samihafa ny fari-piainan'ny tontolo iainana, dia tsy hahomby ny fametrahana amin'ny fahadisoana: raha ny marina, ny artifact ny dikan-teny vaovao dia tsy mbola naorina.

Raha taranaka werf.yaml miankina amin'ny angon-drakitra ivelany (ohatra, lisitry ny dikan-teny ankehitriny, toy ny amin'ny tranga misy antsika), dia tokony horaketina ao anatin'ny fantsona ny fitambarana sy ny soatoavin'ny data toy izany. Zava-dehibe indrindra izany raha miova matetika ny paramètre ivelany.

Isika dia ho mandray sy mirakitra angona ivelany amin'ny dingana voalohany amin'ny fantsona ao amin'ny GitLab (Prebuild) ary ampita izany bebe kokoa amin'ny endrika GitLab CI artifact. Izany dia ahafahanao mampandeha sy mamerina ny asan'ny pipeline (manorina, manaparitaka, manadio) miaraka amin'ny fanamafisana mitovy werf.yaml.

Ny votoatin'ny sehatra Prebuild rakitra .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

Rehefa avy naka ny angon-drakitra ivelany ao amin'ny artifact ianao dia afaka manangana sy manaparitaka amin'ny alàlan'ny dingan'ny fantsona GitLab CI mahazatra: Build and Deploy. Mandeha ny fantsona izahay amin'ny alàlan'ny fihokoana avy amin'ny tahiry Werf GitHub (izany hoe rehefa misy fiovana ao amin'ny tahiry GitHub). Ny angona ho azy ireo dia azo jerena ao amin'ny fananana tetikasa GitLab ao amin'ny fizarana CI/CD Settings -> Pipeline triggers, ary avy eo mamorona Webhook mifanaraka amin'izany ao amin'ny GitHub (Settings -> Webhooks).

Ny dingana fananganana dia ho toy izao:

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 dia hanampy artifact roa avy amin'ny sehatra mankany amin'ny dingana fananganana Prebuild, noho izany dia manondrana varimbazaha miaraka amin'ny angona fampidirana voaomana amin'ny fampiasana ny fananganana source common_envs.sh. Manomboka ny dingana fananganana isika amin'ny tranga rehetra, afa-tsy ny fandefasana ny fantsona araka ny fandaharam-potoana. Araka ny fandaharam-potoana dia hanao fantsona fanadiovana izahay - amin'ity tranga ity dia tsy ilaina ny manao fivoriambe.

Amin'ny dingan'ny fametrahana dia mamaritra asa roa isika - misaraka amin'ny fametrahana ny famokarana sy ny faritra devoly, amin'ny fampiasana môdely 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

Ny asa dia tsy mitovy afa-tsy amin'ny fanondroana ny tontolon'ny cluster izay tokony hanatanterahan'ny werf ny fametrahana (WERF_KUBE_CONTEXT), ary mametraka ny faribolan'ny tontolo iainana (environment.name и environment.url), izay ampiasaina amin'ny maodely tabilao Helm avy eo. Tsy hanome ny votoatin'ny môdely izahay, satria... tsy misy zavatra mahaliana ao amin'ny lohahevitra resahina, fa azonao jerena ao repository ho an'ny lahatsoratra.

Final touch

Satria navoaka matetika ny dikan-teny werf, dia hatsangana matetika ny sary vaovao, ary hitombo hatrany ny Docker Registry. Noho izany dia ilaina ny manamboatra ny fanadiovana sary mandeha ho azy mifototra amin'ny politika. Tena mora ny manao izany.

Mba hampiharana dia mila:

  • Ampio dingana fanadiovana ny .gitlab-ci.yml;
  • Ampio ny fanatanterahana tsindraindray ny asa fanadiovana;
  • Manangana fari-piainana manodidina miaraka amin'ny mari-pamantarana fidirana fanoratana.

Manampy dingana fanadiovana ny .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

Efa hitanay saika ambony kokoa avokoa izany rehetra izany - mba hanadiovana azy fotsiny dia mila miditra ao amin'ny Docker Registry aloha ianao miaraka amin'ny marika manana zo hamafa sary ao amin'ny Docker Registry (ny marika asa GitLab CI navoaka ho azy dia tsy manana zo toy izany). Ny famantarana dia tsy maintsy noforonina ao amin'ny GitLab mialoha ary ny sandany dia tsy maintsy voafaritra ao amin'ny fari-piainan'ny tontolo iainana WERF_IMAGES_CLEANUP_PASSWORD ny tetikasa (Fikirana CI/CD -> Variables).

Manampy asa fanadiovana miaraka amin'ny fandaharam-potoana ilaina dia vita ao CI/CD ->
fandaharam-potoana
.

Izay no izy: ny tetikasa ao amin'ny Docker Registry dia tsy hitombo hatrany amin'ny sary tsy ampiasaina.

Amin'ny faran'ny ampahany azo ampiharina, avelao aho hampahatsiahy anao fa misy lisitra feno avy amin'ny lahatsoratra git:

vokatra

  1. Nahazo rafitra fivorian'ny lojika izahay: artifact iray isaky ny dikan-teny.
  2. Ny fivoriambe dia manerana izao rehetra izao ary tsy mitaky fanovana amin'ny tanana rehefa mivoaka ny dikan-teny vaovao amin'ny werf: ny antontan-taratasy ao amin'ny tranokala dia havaozina ho azy.
  3. Sary roa no natambatra ho an'ny contours samihafa.
  4. Miasa haingana, satria Ny cache dia ampiasaina araka izay azo atao - rehefa mivoaka ny dikan-teny vaovao amin'ny werf na ny GitHub hook dia antsoina amin'ny famerenana famerenana, ny artifact mifanaraka amin'ny dikan-teny niova ihany no amboarina.
  5. Tsy mila mieritreritra momba ny famafana sary tsy ampiasaina: ny fanadiovana araka ny politikan'ny werf dia hitazona ny rejisitra Docker.

hitany

  • Ny fampiasana werf dia ahafahan'ny fiangonana miasa haingana noho ny caching ny fiangonana sy ny caching rehefa miasa amin'ny repositories ivelany.
  • Ny fiaraha-miasa amin'ny fitehirizam-bokatra Git ivelany dia manafoana ny filàna fametahana ny tahiry manontolo isaky ny misy na mamerina ny kodiarana miaraka amin'ny lojika fanatsarana sarotra. Werf dia mampiasa cache ary manao ny cloning indray mandeha, ary avy eo dia mampiasa fetch ary rehefa ilaina ihany.
  • Fahaizana mampiasa ny maodely Go ao amin'ny rakitra fananganana fananganana werf.yaml mamela anao hamaritra fivoriambe iray izay miankina amin'ny angona ivelany ny valiny.
  • Ny fampiasana mount in werf dia manafaingana ny fanangonana artifacts - noho ny cache, izay mahazatra amin'ny pipelines rehetra.
  • werf dia manamora ny fanamboarana fanadiovana, izay zava-dehibe indrindra rehefa manangana dynamique.

Sal

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment