Ҷамъоварии динамикӣ ва ҷойгиркунии тасвирҳои Docker бо werf бо истифода аз мисоли сайти ҳуҷҷатгузории версиявӣ

Мо аллакай дар бораи асбоби GitOps-и худ на як бор гап задаем. верф, ва ин дафъа мо мехоҳем таҷрибаи худро дар васл кардани сайт бо ҳуҷҷатҳои худи лоиҳа мубодила кунем - werf.io (нусхаи русии он en.werf.io). Ин як макони муқаррарии статикӣ аст, аммо маҷлиси он ҷолиб аст, ки он бо истифода аз миқдори динамикии артефактҳо сохта шудааст.

Ҷамъоварии динамикӣ ва ҷойгиркунии тасвирҳои Docker бо werf бо истифода аз мисоли сайти ҳуҷҷатгузории версиявӣ

Ба нозукиҳои сохтори сайт гузаред: тавлиди менюи умумӣ барои ҳама версияҳо, саҳифаҳо бо маълумот дар бораи нашрҳо ва ғайра. — намешавем. Ба ҷои ин, биёед ба масъалаҳо ва хусусиятҳои маҷмӯи динамикӣ ва каме ба равандҳои ҳамроҳи CI/CD тамаркуз кунем.

Муқаддима: чӣ гуна сайт кор мекунад

Барои оғоз, ҳуҷҷатҳои werf дар якҷоягӣ бо рамзи он нигоҳ дошта мешаванд. Ин талаботҳои муайяни рушдро ба миён меорад, ки одатан аз доираи ин мақола берунанд, аммо ҳадди аққал метавон гуфт, ки:

  • Функсияҳои нави werf набояд бидуни навсозии ҳуҷҷатҳо бароварда шаванд ва баръакс, ҳама гуна тағирот дар ҳуҷҷатҳо нашри версияи нави werfро дар назар дорад;
  • Лоиҳа рушди хеле пуршиддат дорад: версияҳои нав метавонанд дар як рӯз якчанд маротиба бароварда шаванд;
  • Ҳама гуна амалиёти дастӣ барои ҷойгиркунии сайт бо версияи нави ҳуҷҷатҳо ҳадди аққал дилгиркунанда аст;
  • Лоиҳа равиши семантикиро қабул мекунад нусхабардорӣ, бо 5 канали устувор. Раванди озодкунӣ гузариши пайдарпайи версияҳоро тавассути каналҳо бо мақсади баланд бардоштани устуворӣ дар бар мегирад: аз алфа то санг-сахт;
  • Сомона версияи русӣ дорад, ки дар баробари версияи асосӣ (яъне инглисӣ) “зиндагӣ ва рушд мекунад” (яъне мундариҷаи он нав карда мешавад).

Барои пинҳон кардани ҳамаи ин "ошхонаи ботинӣ" аз корбар, ба ӯ чизе пешниҳод кардем, ки "фақат кор мекунад" асбоби алоҳида насб ва навсозии werf Оё multiwerf. Шумо танҳо бояд рақами нашр ва канали устувореро, ки шумо барои истифода омодаед, муайян кунед ва multiwerf тафтиш мекунад, ки оё дар канал версияи нав мавҷуд аст ва дар ҳолати зарурӣ онро зеркашӣ мекунад.

Дар менюи интихоби версияи вебсайт, версияҳои охирини werf дар ҳар як канал дастрасанд. Бо нобаёнӣ, аз рӯи суроға werf.io/documentation версияи канали устувортарин барои версияи охирин кушода мешавад - он инчунин аз ҷониби системаҳои ҷустуҷӯӣ индексатсия карда мешавад. Ҳуҷҷатҳои канал дар суроғаҳои алоҳида дастрасанд (масалан, werf.io/v1.0-beta/documentation барои версияи бета 1.0).

Дар маҷмӯъ, сайт дорои версияҳои зерини дастрас аст:

  1. реша (бо нобаёнӣ кушода мешавад),
  2. барои ҳар як канали навсозии фаъоли ҳар як нашрия (масалан, werf.io/v1.0-beta).

Барои тавлиди версияи мушаххаси сайт, дар маҷмӯъ, онро бо истифода аз тартиб додан кифоя аст Ҷекилтавассути иҷро дар директория /docs werf repository фармони мувофиқ (jekyll build), пас аз гузаштан ба теги Git версияи зарурӣ.

Танҳо илова кардани он боқӣ мемонад:

  • худи утилита (werf) барои васлкунӣ истифода мешавад;
  • Равандҳои CI/CD дар асоси GitLab CI сохта шудаанд;
  • ва ҳамаи ин, албатта, дар Кубернетес кор мекунад.

вазифаҳо

Акнун биёед вазифаҳоеро тартиб диҳем, ки ҳамаи хусусиятҳои тавсифшударо ба инобат мегиранд:

  1. Пас аз тағир додани версияи werf дар ҳама гуна канали навсозӣ ҳуҷҷатҳо дар сайт бояд ба таври худкор нав карда шаванд.
  2. Барои рушд шумо бояд баъзан қодир бошед версияҳои пешнамоиши сайтро бинед.

Сайт пас аз тағир додани версия дар ҳама гуна канал аз тегҳои мувофиқи Git бояд дубора тартиб дода шавад, аммо дар ҷараёни сохтани тасвир мо хусусиятҳои зеринро ба даст меорем:

  • Азбаски рӯйхати версияҳо дар каналҳо тағир меёбад, танҳо барои аз нав сохтани ҳуҷҷатҳои каналҳое, ки версияи онҳо тағйир ёфтааст, зарур аст. Охир, аз нав баркарор кардани хама чиз чандон хуб нест.
  • Маҷмӯи каналҳо барои нашрҳо метавонанд тағир ёбанд. Масалан, дар баъзе вақтҳо, дар каналҳо шояд версияи устувортар аз версияи дастрасии барвақти 1.1 вуҷуд надошта бошад, аммо бо мурури замон онҳо пайдо мешаванд - дар ин ҳолат, маҷлисро дастӣ иваз кардан мумкин нест?

Ин рӯй медиҳад васлкунӣ аз тағир додани маълумоти беруна вобаста аст.

Реализация

Интихоби равиш

Ба таври дигар, шумо метавонед ҳар як версияи лозимиро ҳамчун як поди алоҳида дар Kubernetes иҷро кунед. Ин хосият шумораи бештари объектҳоро дар кластер дар назар дорад, ки бо афзоиши шумораи релизҳои устувори werf афзоиш меёбанд. Ва ин, дар навбати худ, нигоҳдории мураккабро дар назар дорад: ҳар як версия сервери HTTP-и худро дорад ва бо бори хурд. Албатта, ин хароҷоти бештари захираҳоро низ ба бор меорад.

Мо хам хамин рохро пеш гирифтем ҷамъ кардани ҳамаи версияҳои зарурӣ дар як тасвир. Статикаи тартибдодашудаи ҳамаи версияҳои сайт дар як контейнер бо NGINX ҷойгир аст ва трафик ба Ҷойгиркунии мувофиқ тавассути NGINX Ingress меояд. Сохтори оддӣ - замимаи бидуни шаҳрвандӣ - ба шумо имкон медиҳад, ки тавассути худи Kubernetes густаришро (вобаста ба сарборӣ) ба осонӣ васеъ кунед.

Аниқтараш, мо ду тасвирро ҷамъоварӣ мекунем: яке барои схемаи истеҳсолӣ, дуюмаш барои схемаи таҳиякунанда. Тасвири иловагӣ танҳо дар схемаи таҳиякунанда дар якҷоягӣ бо схемаи асосӣ истифода мешавад (ифтитоҳ карда мешавад) ва дорои версияи сайти азназаргузаронӣ мебошад ва масир байни онҳо бо истифода аз захираҳои Ingress анҷом дода мешавад.

werf против git клон ва артефактҳо

Тавре ки аллакай зикр гардид, барои тавлиди статикаи сайт барои версияи мушаххаси ҳуҷҷатҳо, шумо бояд бо гузариш ба теги анбори мувофиқ бунёд кунед. Шумо инчунин метавонед ин корро бо роҳи клон кардани анбор ҳар дафъае, ки шумо созед, ва интихоби барчаспҳои мувофиқ аз рӯйхат анҷом диҳед. Аммо ин як амалиёти хеле серталаб буда, илова бар ин, навиштани дастурҳои ночизро тақозо мекунад... Камбудии дигари ҷиддӣ дар он аст, ки бо ин усул имкони кэш кардани чизе дар вақти васлкунӣ вуҷуд надорад.

Дар ин ҷо худаш утилитаи werf ба кӯмаки мо меояд, амалӣ мекунад кэшкунии интеллектуалӣ ва ба шумо имкон медиҳад, ки истифода баред анборҳои беруна. Истифодаи werf барои илова кардани код аз анбор сохтмонро ба таври назаррас суръат мебахшад, зеро werf аслан як маротиба анборро клон мекунад ва сипас иҷро мекунад танҳо fetch агар лозим бошад. Илова бар ин, ҳангоми илова кардани маълумот аз анбор, мо метавонем танҳо директорияҳои заруриро интихоб кунем (дар ҳолати мо ин директория аст. docs), ки ин микдори маълумоти иловашударо хеле кам мекунад.

Азбаски Jekyll асбобест, ки барои тартиб додани маълумоти статикӣ пешбинӣ шудааст ва дар тасвири ниҳоӣ лозим нест, тартиб додани он мантиқӣ хоҳад буд артефакти верф, ва ба тасвири ниҳоӣ танҳо натиҷаи ҷамъоварӣ ворид кунед.

Мо werf.yaml менависем

Ҳамин тавр, мо тасмим гирифтем, ки ҳар як версияро дар артефакти алоҳидаи werf тартиб диҳем. Бо вуҷуди ин, мо мо намедонем, ки дар вақти ҷамъоварӣ чандтои ин осорҳо хоҳанд буд, аз ин рӯ, мо наметавонем конфигуратсияи собит созем (ба таври қатъӣ гӯем, мо ҳоло ҳам метавонем, аммо он комилан муассир нахоҳад буд).

werf ба шумо имкон медиҳад, ки истифода баред Ба шаблонҳо равед дар файли конфигуратсияи шумо (werf.yaml), ва ин имкон медихад конфигуратсияро дар зуд тавлид кунед вобаста ба маълумоти беруна (ба шумо чӣ лозим аст!). Маълумоти беруна дар ҳолати мо ин маълумот дар бораи версияҳо ва релизҳо мебошад, ки дар асоси онҳо шумораи зарурии артефактҳоро ҷамъ меорем ва дар натиҷа ду тасвир мегирем: werf-doc и werf-dev ки дар схемахои гуногун кор кунанд.

Маълумоти беруна тавассути тағирёбандаҳои муҳити зист интиқол дода мешавад. Ин аст таркиби онҳо:

  • RELEASES - сатр бо рӯйхати нашрҳо ва версияи мувофиқи werf, дар шакли рӯйхати арзишҳои аз фосила ҷудошуда дар формат <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>. Мисол: 1.0%v1.0.4-beta.20
  • CHANNELS - сатр бо рӯйхати каналҳо ва версияи кунунии werf, дар шакли рӯйхати арзишҳои аз фосила ҷудошуда дар формат <КАНАЛ>%<НОМЕР_ВЕРСИИ>. Мисол: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — версияи версияи werf, ки бо нобаёнӣ дар сайт намоиш дода мешавад (на ҳамеша зарур аст, ки ҳуҷҷатҳо бо рақами баландтарини нашр нишон дода шаванд). Мисол: v1.0.4-beta.20
  • REVIEW_SHA — хэши ӯҳдадории барраси, ки аз он шумо бояд версияи даври санҷиширо созед.

Ин тағирёбандаҳо дар лӯлаи GitLab CI пур карда мешаванд ва чӣ гуна дар зер навишта шудааст.

Пеш аз ҳама, барои роҳат, мо дар муайян мекунем werf.yaml Ба тағирёбандаҳои қолабӣ гузаред ва ба онҳо арзишҳоро аз тағирёбандаҳои муҳити зист таъин кунед:

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

Тавсифи артефакт барои тартиб додани версияи статикии сайт умуман барои ҳама ҳолатҳое, ки ба мо лозим аст (аз ҷумла тавлиди версияи реша, инчунин версияи схемаи dev). Аз ин рӯ, мо онро бо истифода аз функсия ба блоки алоҳида интиқол медиҳем define - барои истифодаи минбаъдаи такрорӣ include. Мо далелҳои зеринро ба қолаб интиқол медиҳем:

  • Version — версияи тавлидшуда (номи тег);
  • Channel — номи канали навсозӣ, ки барои он артефакт тавлид мешавад;
  • Commit — ҳашро иҷро кунед, агар артефакт барои тафтиш тавлид шуда бошад;
  • контекст.

Тавсифи Шаблон Артефакт

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

Номи артефакт бояд беназир бошад. Мо метавонем ба ин, масалан, тавассути илова кардани номи канал (қимати тағирёбанда .Channel) ҳамчун суффикс ба номи осор: artifact: doc-{{ .Channel }}. Аммо шумо бояд фаҳмед, ки ҳангоми воридот аз артефактҳо, шумо бояд ба ҳамон номҳо муроҷиат кунед.

Ҳангоми тавсифи артефакт, хусусияти зерини werf истифода мешавад: васлкунй. Монтаж бо нишон додани феҳристи хидматрасонӣ build_dir ба шумо имкон медиҳад, ки кэши Jekyll-ро дар байни хатҳои қубур захира кунед, ки монтажро хеле метезонад.

Шумо инчунин метавонед истифодаи файлро мушоҳида карда бошед releases.yml як файли YAML бо маълумоти озод аз github.com (артефакт ҳангоми иҷрои лӯла ба даст меояд). Он ҳангоми тартиб додани сайт лозим аст, аммо дар заминаи мақола он барои мо ҷолиб аст, зеро он аз ҳолати он вобаста аст аз нав монтаж кардани танҳо як артефакт - артефакти версияи решаи сайт (он дар дигар артефактҳо лозим нест).

Ин бо истифода аз изҳороти шартӣ амалӣ карда мешавад if Ба шаблонҳо ва тарҳҳо равед {{ $Root.Files.Get "releases.yml" | sha256sum }} дар марҳила марҳилаҳо. Он ба таври зерин кор мекунад: ҳангоми сохтани артефакт барои версияи реша (variable .Channel баробар аст root) хэш файл releases.yml ба имзои тамоми марҳила таъсир мерасонад, зеро он як қисми номи вазифаи Ansible аст (параметр name). Ҳамин тариқ, ҳангоми иваз кардан мазмун файл releases.yml артефакти дахлдор аз нав васл карда мешавад.

Лутфан ба кор бо анбори беруна низ диққат диҳед. Дар тасвири артефакт аз анбори werf, танҳо директория илова карда мешавад /docs, ва вобаста ба параметрҳои гузаронидашуда, маълумоти барчасп ё ӯҳдадории баррасии зарурӣ фавран илова карда мешавад.

Барои истифодаи қолаби артефакт барои тавлиди тавсифи артефакти версияҳои интиқолшудаи каналҳо ва релизҳо, мо ҳалқаро дар тағирёбанда ташкил мекунем .WerfVersions в werf.yaml:

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

Зеро ҳалқа якчанд артефактҳоро тавлид мекунад (мо умедворем), ҷудокунандаи байни онҳо - пайдарпайро ба назар гирифтан лозим аст. --- (Барои маълумоти бештар дар бораи синтаксиси файли конфигуратсия, нигаред хуччатхо). Тавре ки қаблан муайян карда шуда буд, ҳангоми даъват кардани қолаб дар давр, мо параметрҳои версия, URL ва контексти решаро интиқол медиҳем.

Ба ҳамин монанд, аммо бидуни ҳалқа, мо қолаби артефактро барои "ҳолатҳои махсус" меномем: барои версияи реша, инчунин версияи барраси:

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

Лутфан таваҷҷӯҳ намоед, ки артефакт барои баррасии бознигарӣ танҳо дар сурати муқаррар кардани тағирёбанда сохта мешавад .WerfReviewCommit.

Артефактҳо омодаанд - вақти он расидааст, ки воридотро оғоз кунед!

Тасвири ниҳоӣ, ки барои кор дар Kubernetes тарҳрезӣ шудааст, як NGINX муқаррарӣ бо файли конфигуратсияи сервер илова карда шудааст. nginx.conf ва статикӣ аз артефактҳо. Илова ба артефакти версияи решаи сайт, мо бояд давраро дар тағирёбанда такрор кунем .WerfVersions ворид кардани артефактҳои канал ва версияҳои баровардани он + қоидаҳои номгузории артефактро, ки мо қаблан қабул карда будем, риоя кунед. Азбаски ҳар як артефакт версияҳои сайтро барои ду забон нигоҳ медорад, мо онҳоро ба ҷойҳое, ки конфигуратсия пешбинӣ кардааст, ворид мекунем.

Тавсифи тасвири ниҳоии 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 -}}

Тасвири иловагӣ, ки дар якҷоягӣ бо тасвири асосӣ дар схемаи таҳиякунанда оғоз карда мешавад, танҳо ду версияи сайтро дар бар мегирад: версияи азназаргузаронӣ ва версияи решаи сайт (дороиҳои умумӣ мавҷуданд ва агар шумо дар хотир доред , маълумотро нашр кунед). Ҳамин тариқ, тасвири иловагӣ аз тасвири асосӣ танҳо дар бахши воридот (ва, албатта, дар ном) фарқ мекунад:

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

Тавре ки дар боло қайд карда шуд, артефакт барои ӯҳдадории барраси танҳо вақте тавлид мешавад, ки тағирёбандаи муҳити муқарраршуда иҷро карда шавад REVIEW_SHA. Тасвири werf-devро умуман тавлид накардан мумкин аст, агар тағирёбандаи муҳити зист вуҷуд надошта бошад REVIEW_SHA, балки барои он тозакунӣ аз рӯи сиёсат Тасвирҳои Docker дар werf барои тасвири werf-dev кор мекарданд, мо онро мегузорем, ки танҳо бо артефакти версияи реша сохта шавад (ба ҳар ҳол он аллакай сохта шудааст), то сохтори қубурро содда кунад.

Маҷлис омода аст! Биёед ба CI/CD ва нозукиҳои муҳим гузарем.

Қубур дар GitLab CI ва хусусиятҳои сохтани динамикӣ

Ҳангоми иҷро кардани сохтмон мо бояд тағирёбандаҳои муҳити истифодашударо муқаррар кунем werf.yaml. Ин ба тағирёбандаи REVIEW_SHA дахл надорад, ки мо онро ҳангоми занг задан аз қубури GitHub муқаррар мекунем.

Мо маълумоти зарурии беруниро дар скрипти Bash тавлид мекунем generate_artifacts, ки ду артефакти қубури GitLab тавлид мекунад:

  • файл releases.yml бо маълумоти нашр,
  • файл common_envs.sh, дорои тағирёбандаҳои муҳити барои содиротшаванда.

Мундариҷаи файл generate_artifacts дар мо пайдо хоҳед кард анборҳо бо мисолҳо. Гирифтани маълумот худаш мавзӯи мақола нест, балки файл аст common_envs.sh барои мо мухим аст, зеро кори верф ба он вобаста аст. Намунаи мундариҷаи он:

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'

Шумо метавонед баромади чунин скриптро истифода баред, масалан, бо истифода аз функсияи Bash source.

Акнун қисми шавқовар меояд. Барои он ки ҳам сохтан ва ҳам ҷойгиркунии барнома дуруст кор кунад, боварӣ ҳосил кардан лозим аст werf.yaml ки ҳамин гуна камтарин дар як қубур. Агар ин шарт иҷро нашавад, пас имзоҳои марҳилаҳое, ки werf ҳангоми васлкунӣ ва масалан, ҷойгиркунӣ ҳисоб мекунанд, гуногун хоҳанд буд. Ин ба хатогии ҷойгиркунӣ оварда мерасонад, зеро... тасвире, ки барои ҷойгиркунӣ лозим аст, гум мешавад.

Ба ибораи дигар, агар ҳангоми монтажи тасвири сайт маълумот дар бораи релизҳо ва версияҳо якхела бошад ва дар вақти ҷойгиркунӣ версияи нав бароварда шавад ва тағирёбандаҳои муҳити зист арзишҳои гуногун дошта бошанд, пас ҷойгиркунӣ бо хатогӣ ноком мешавад: охир, артефакти версияи нав хануз сохта нашудааст.

Агар насл werf.yaml аз маълумоти беруна вобаста аст (масалан, рӯйхати версияҳои ҷорӣ, ба монанди ҳолати мо), пас таркиб ва арзишҳои чунин маълумот бояд дар дохили қубур сабт карда шаванд. Ин махсусан муҳим аст, агар параметрҳои беруна зуд-зуд тағйир ёбанд.

Мо мекунем қабул ва сабт кардани маълумоти беруна дар марҳилаи аввали лӯла дар GitLab (Пешакӣ сохтан) ва онҳоро дар шакли минбаъда интиқол диҳед Артефакти GitLab CI. Ин ба шумо имкон медиҳад, ки корҳои қубурро (сохт, ҷойгиркунӣ, тозакунӣ) бо ҳамон конфигуратсия иҷро кунед ва аз нав оғоз кунед. werf.yaml.

Мазмуни саҳна Пешакӣ сохтан файл .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

Пас аз гирифтани маълумоти беруна дар артефакт, шумо метавонед бо истифода аз марҳилаҳои стандартии қубури GitLab CI сохта ва ҷойгир кунед: Сохта ва ҷойгир кунед. Мо худи лӯларо бо истифода аз қалмоқҳо аз анбори werf GitHub оғоз мекунем (яъне ҳангоми тағирот дар анбори GitHub). Маълумотро барои онҳо дар хосиятҳои лоиҳаи GitLab дар қисмат пайдо кардан мумкин аст Танзимоти CI/CD -> Триггерҳои қубур, ва он гоҳ Webhook-и мувофиқро дар GitHub эҷод кунед (Танзимот -> Webhooks).

Марҳилаи сохтмон чунин хоҳад буд:

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 ду артефактро аз саҳна ба марҳилаи сохтмон илова мекунад Пешакӣ сохтан, аз ин рӯ мо тағирёбандаҳоро бо маълумоти омодашудаи воридшуда бо истифода аз сохтмон содир мекунем source common_envs.sh. Мо дар ҳама ҳолатҳо ба марҳилаи сохтмон шурӯъ мекунем, ба истиснои аз рӯи график ба кор андохтани қубур. Мувофики график мо барои тозакунй трубопровод мегузаронем — дар ин сурат монтаж кардан лозим нест.

Дар марҳилаи ҷойгиркунӣ, мо ду вазифаро тавсиф хоҳем кард - алоҳида барои ҷойгиркунӣ дар истеҳсолот ва схемаҳо бо истифода аз қолаби 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

Вазифаҳо танҳо бо нишон додани контексти кластер, ки дар он werf бояд ҷойгиркуниро иҷро кунад, асосан фарқ мекунанд (WERF_KUBE_CONTEXT) ва танзими тағирёбандаҳои муҳити давр (environment.name и environment.url), ки баъдан дар қолибҳои диаграммаи Helm истифода мешаванд. Мо мундариҷаи қолибҳоро пешниҳод намекунем, зеро... дар он ҷо ягон чизи ҷолиб барои мавзӯи мавриди назар вуҷуд надорад, аммо шумо метавонед онҳоро дар анборҳо барои мақола.

Дастрасии ниҳоӣ

Азбаски версияҳои werf зуд-зуд бароварда мешаванд, тасвирҳои нав зуд-зуд сохта мешаванд ва Реестри Docker пайваста афзоиш хоҳад ёфт. Аз ин рӯ, танзим кардани тозакунии автоматии тасвир дар асоси сиёсатҳо ҳатмист. Ин хеле осон аст.

Барои татбиқ ба шумо лозим аст:

  • Ба қадами тозакунӣ илова кунед .gitlab-ci.yml;
  • Илова кардани иҷрои даврии вазифаи тозакунӣ;
  • Тағйирёбандаи муҳити зистро бо аломати дастрасии навиштан насб кунед.

Илова кардани марҳилаи тозакунӣ ба .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

Мо аллакай қариб ҳамаи инро каме баландтар дидем - танҳо барои тоза кардани он шумо бояд аввал ба Реестри Docker бо нишонае ворид шавед, ки ҳуқуқи нест кардани тасвирҳоро дар Реестри Docker дорад (токени вазифаи GitLab CI ба таври худкор додашуда ин корро намекунад) чунин ҳуқуқҳо доранд). Токен бояд дар GitLab пешакӣ сохта шавад ва арзиши он бояд дар тағирёбандаи муҳити зист муайян карда шавад WERF_IMAGES_CLEANUP_PASSWORD лоиҳа (Танзимоти CI/CD -> Тағйирёбанда).

Илова кардани вазифаи тозакунӣ бо ҷадвали зарурӣ дар анҷом дода мешавад CI/CD ->
Schedules
.

Ин аст: лоиҳа дар Реестри Docker дигар аз тасвирҳои истифоданашуда пайваста афзоиш нахоҳад ёфт.

Дар охири қисми амалӣ, иҷозат диҳед ба шумо хотиррасон намоям, ки рӯйхати пурраи мақола дар он дастрас аст Рафтааст:

Дар натиҷа

  1. Мо сохтори мантиқии маҷлисро гирифтем: як артефакт барои як версия.
  2. Ассотсиатсия универсалӣ аст ва ҳангоми баровардани версияҳои нави werf тағироти дастиро талаб намекунад: ҳуҷҷатҳо дар вебсайт ба таври худкор нав карда мешаванд.
  3. Ду тасвир барои контурҳои гуногун ҷамъ оварда шудаанд.
  4. Он зуд кор мекунад, зеро Кэш ба қадри имкон истифода мешавад - вақте ки версияи нави werf бароварда мешавад ё қалмоқҳои GitHub барои бознигарӣ даъват карда мешавад, танҳо артефакти мувофиқ бо версияи тағирёфта аз нав сохта мешавад.
  5. Дар бораи нест кардани тасвирҳои истифоданашуда фикр кардан лозим нест: тозакунӣ мувофиқи сиёсати werf Реестри Docker-ро ба тартиб нигоҳ медорад.

натиҷаҳои

  • Истифодаи werf имкон медиҳад, ки маҷлис аз ҳисоби кэшкунии худи ассамблея ва кэш ҳангоми кор бо анборҳои беруна зуд кор кунад.
  • Кор бо анборҳои берунии Git зарурати клон кардани тамоми анборро ҳар дафъа ё аз нав ихтироъ кардани чарх бо мантиқи мураккаби оптимизатсияро аз байн мебарад. werf кэшро истифода мебарад ва клонкуниро танҳо як маротиба анҷом медиҳад ва сипас истифода мебарад fetch ва танҳо дар ҳолати зарурӣ.
  • Имконияти истифодаи қолибҳои Go дар файли конфигуратсияи сохтмон werf.yaml ба шумо имкон медиҳад, ки маҷлисеро тасвир кунед, ки натиҷаи он аз маълумоти беруна вобаста аст.
  • Истифодаи mount дар werf ҷамъоварии артефактҳоро ба таври назаррас суръат мебахшад - аз сабаби кэш, ки барои ҳама қубурҳо маъмул аст.
  • werf танзими тозакуниро осон мекунад, ки ин махсусан ҳангоми сохтани динамикӣ муҳим аст.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ