Мо аллакай дар бораи асбоби GitOps-и худ на як бор гап задаем.
Ба нозукиҳои сохтори сайт гузаред: тавлиди менюи умумӣ барои ҳама версияҳо, саҳифаҳо бо маълумот дар бораи нашрҳо ва ғайра. — намешавем. Ба ҷои ин, биёед ба масъалаҳо ва хусусиятҳои маҷмӯи динамикӣ ва каме ба равандҳои ҳамроҳи CI/CD тамаркуз кунем.
Муқаддима: чӣ гуна сайт кор мекунад
Барои оғоз, ҳуҷҷатҳои werf дар якҷоягӣ бо рамзи он нигоҳ дошта мешаванд. Ин талаботҳои муайяни рушдро ба миён меорад, ки одатан аз доираи ин мақола берунанд, аммо ҳадди аққал метавон гуфт, ки:
- Функсияҳои нави werf набояд бидуни навсозии ҳуҷҷатҳо бароварда шаванд ва баръакс, ҳама гуна тағирот дар ҳуҷҷатҳо нашри версияи нави werfро дар назар дорад;
- Лоиҳа рушди хеле пуршиддат дорад: версияҳои нав метавонанд дар як рӯз якчанд маротиба бароварда шаванд;
- Ҳама гуна амалиёти дастӣ барои ҷойгиркунии сайт бо версияи нави ҳуҷҷатҳо ҳадди аққал дилгиркунанда аст;
- Лоиҳа равиши семантикиро қабул мекунад
нусхабардорӣ , бо 5 канали устувор. Раванди озодкунӣ гузариши пайдарпайи версияҳоро тавассути каналҳо бо мақсади баланд бардоштани устуворӣ дар бар мегирад: аз алфа то санг-сахт; - Сомона версияи русӣ дорад, ки дар баробари версияи асосӣ (яъне инглисӣ) “зиндагӣ ва рушд мекунад” (яъне мундариҷаи он нав карда мешавад).
Барои пинҳон кардани ҳамаи ин "ошхонаи ботинӣ" аз корбар, ба ӯ чизе пешниҳод кардем, ки "фақат кор мекунад" асбоби алоҳида насб ва навсозии werf Оё
Дар менюи интихоби версияи вебсайт, версияҳои охирини werf дар ҳар як канал дастрасанд. Бо нобаёнӣ, аз рӯи суроға
Дар маҷмӯъ, сайт дорои версияҳои зерини дастрас аст:
- реша (бо нобаёнӣ кушода мешавад),
- барои ҳар як канали навсозии фаъоли ҳар як нашрия (масалан,
werf.io/v1.0-beta ).
Барои тавлиди версияи мушаххаси сайт, дар маҷмӯъ, онро бо истифода аз тартиб додан кифоя аст /docs
werf repository фармони мувофиқ (jekyll build
), пас аз гузаштан ба теги Git версияи зарурӣ.
Танҳо илова кардани он боқӣ мемонад:
- худи утилита (werf) барои васлкунӣ истифода мешавад;
- Равандҳои CI/CD дар асоси GitLab CI сохта шудаанд;
- ва ҳамаи ин, албатта, дар Кубернетес кор мекунад.
вазифаҳо
Акнун биёед вазифаҳоеро тартиб диҳем, ки ҳамаи хусусиятҳои тавсифшударо ба инобат мегиранд:
- Пас аз тағир додани версияи werf дар ҳама гуна канали навсозӣ ҳуҷҷатҳо дар сайт бояд ба таври худкор нав карда шаванд.
- Барои рушд шумо бояд баъзан қодир бошед версияҳои пешнамоиши сайтро бинед.
Сайт пас аз тағир додани версия дар ҳама гуна канал аз тегҳои мувофиқи Git бояд дубора тартиб дода шавад, аммо дар ҷараёни сохтани тасвир мо хусусиятҳои зеринро ба даст меорем:
- Азбаски рӯйхати версияҳо дар каналҳо тағир меёбад, танҳо барои аз нав сохтани ҳуҷҷатҳои каналҳое, ки версияи онҳо тағйир ёфтааст, зарур аст. Охир, аз нав баркарор кардани хама чиз чандон хуб нест.
- Маҷмӯи каналҳо барои нашрҳо метавонанд тағир ёбанд. Масалан, дар баъзе вақтҳо, дар каналҳо шояд версияи устувортар аз версияи дастрасии барвақти 1.1 вуҷуд надошта бошад, аммо бо мурури замон онҳо пайдо мешаванд - дар ин ҳолат, маҷлисро дастӣ иваз кардан мумкин нест?
Ин рӯй медиҳад васлкунӣ аз тағир додани маълумоти беруна вобаста аст.
Реализация
Интихоби равиш
Ба таври дигар, шумо метавонед ҳар як версияи лозимиро ҳамчун як поди алоҳида дар Kubernetes иҷро кунед. Ин хосият шумораи бештари объектҳоро дар кластер дар назар дорад, ки бо афзоиши шумораи релизҳои устувори werf афзоиш меёбанд. Ва ин, дар навбати худ, нигоҳдории мураккабро дар назар дорад: ҳар як версия сервери HTTP-и худро дорад ва бо бори хурд. Албатта, ин хароҷоти бештари захираҳоро низ ба бор меорад.
Мо хам хамин рохро пеш гирифтем ҷамъ кардани ҳамаи версияҳои зарурӣ дар як тасвир. Статикаи тартибдодашудаи ҳамаи версияҳои сайт дар як контейнер бо NGINX ҷойгир аст ва трафик ба Ҷойгиркунии мувофиқ тавассути NGINX Ingress меояд. Сохтори оддӣ - замимаи бидуни шаҳрвандӣ - ба шумо имкон медиҳад, ки тавассути худи Kubernetes густаришро (вобаста ба сарборӣ) ба осонӣ васеъ кунед.
Аниқтараш, мо ду тасвирро ҷамъоварӣ мекунем: яке барои схемаи истеҳсолӣ, дуюмаш барои схемаи таҳиякунанда. Тасвири иловагӣ танҳо дар схемаи таҳиякунанда дар якҷоягӣ бо схемаи асосӣ истифода мешавад (ифтитоҳ карда мешавад) ва дорои версияи сайти азназаргузаронӣ мебошад ва масир байни онҳо бо истифода аз захираҳои Ingress анҷом дода мешавад.
werf против git клон ва артефактҳо
Тавре ки аллакай зикр гардид, барои тавлиди статикаи сайт барои версияи мушаххаси ҳуҷҷатҳо, шумо бояд бо гузариш ба теги анбори мувофиқ бунёд кунед. Шумо инчунин метавонед ин корро бо роҳи клон кардани анбор ҳар дафъае, ки шумо созед, ва интихоби барчаспҳои мувофиқ аз рӯйхат анҷом диҳед. Аммо ин як амалиёти хеле серталаб буда, илова бар ин, навиштани дастурҳои ночизро тақозо мекунад... Камбудии дигари ҷиддӣ дар он аст, ки бо ин усул имкони кэш кардани чизе дар вақти васлкунӣ вуҷуд надорад.
Дар ин ҷо худаш утилитаи 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 бо маълумоти озод аз
Ин бо истифода аз изҳороти шартӣ амалӣ карда мешавад if
Ба шаблонҳо ва тарҳҳо равед {{ $Root.Files.Get "releases.yml" | sha256sum }}
дар марҳила .Channel
баробар аст root
) хэш файл releases.yml
ба имзои тамоми марҳила таъсир мерасонад, зеро он як қисми номи вазифаи Ansible аст (параметр name
). Ҳамин тариқ, ҳангоми иваз кардан мазмун файл releases.yml
артефакти дахлдор аз нав васл карда мешавад.
Лутфан ба кор бо анбори беруна низ диққат диҳед. Дар тасвири артефакт аз /docs
, ва вобаста ба параметрҳои гузаронидашуда, маълумоти барчасп ё ӯҳдадории баррасии зарурӣ фавран илова карда мешавад.
Барои истифодаи қолаби артефакт барои тавлиди тавсифи артефакти версияҳои интиқолшудаи каналҳо ва релизҳо, мо ҳалқаро дар тағирёбанда ташкил мекунем .WerfVersions
в werf.yaml
:
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}
Зеро ҳалқа якчанд артефактҳоро тавлид мекунад (мо умедворем), ҷудокунандаи байни онҳо - пайдарпайро ба назар гирифтан лозим аст. ---
(Барои маълумоти бештар дар бораи синтаксиси файли конфигуратсия, нигаред
Ба ҳамин монанд, аммо бидуни ҳалқа, мо қолаби артефактро барои "ҳолатҳои махсус" меномем: барои версияи реша, инчунин версияи барраси:
{{ 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
, балки барои он
Маҷлис омода аст! Биёед ба 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 дигар аз тасвирҳои истифоданашуда пайваста афзоиш нахоҳад ёфт.
Дар охири қисми амалӣ, иҷозат диҳед ба шумо хотиррасон намоям, ки рӯйхати пурраи мақола дар он дастрас аст
Дар натиҷа
- Мо сохтори мантиқии маҷлисро гирифтем: як артефакт барои як версия.
- Ассотсиатсия универсалӣ аст ва ҳангоми баровардани версияҳои нави werf тағироти дастиро талаб намекунад: ҳуҷҷатҳо дар вебсайт ба таври худкор нав карда мешаванд.
- Ду тасвир барои контурҳои гуногун ҷамъ оварда шудаанд.
- Он зуд кор мекунад, зеро Кэш ба қадри имкон истифода мешавад - вақте ки версияи нави werf бароварда мешавад ё қалмоқҳои GitHub барои бознигарӣ даъват карда мешавад, танҳо артефакти мувофиқ бо версияи тағирёфта аз нав сохта мешавад.
- Дар бораи нест кардани тасвирҳои истифоданашуда фикр кардан лозим нест: тозакунӣ мувофиқи сиёсати werf Реестри Docker-ро ба тартиб нигоҳ медорад.
натиҷаҳои
- Истифодаи werf имкон медиҳад, ки маҷлис аз ҳисоби кэшкунии худи ассамблея ва кэш ҳангоми кор бо анборҳои беруна зуд кор кунад.
- Кор бо анборҳои берунии Git зарурати клон кардани тамоми анборро ҳар дафъа ё аз нав ихтироъ кардани чарх бо мантиқи мураккаби оптимизатсияро аз байн мебарад. werf кэшро истифода мебарад ва клонкуниро танҳо як маротиба анҷом медиҳад ва сипас истифода мебарад
fetch
ва танҳо дар ҳолати зарурӣ. - Имконияти истифодаи қолибҳои Go дар файли конфигуратсияи сохтмон
werf.yaml
ба шумо имкон медиҳад, ки маҷлисеро тасвир кунед, ки натиҷаи он аз маълумоти беруна вобаста аст. - Истифодаи mount дар werf ҷамъоварии артефактҳоро ба таври назаррас суръат мебахшад - аз сабаби кэш, ки барои ҳама қубурҳо маъмул аст.
- werf танзими тозакуниро осон мекунад, ки ин махсусан ҳангоми сохтани динамикӣ муҳим аст.
PS
Инчунин дар блоги мо хонед:
- «
Иҷрои фармонҳо ҳангоми интиқоли версияи нави барнома ба Kubernetes »; - «
Бо werf ва GitLab CI микросервисҳои як навъ созед ва ҷойгир кунед »; - «
Истифодаи werf барои паҳн кардани диаграммаҳои мураккаби Helm »; - «
Муаррифии werf 1.0 устувор: GitOps бо он чӣ иртибот дорад, вазъият ва нақшаҳо ".
Манбаъ: will.com