Бид GitOps хэрэгслийнхээ талаар нэгээс олон удаа ярьсан.
Сайтын бүтцийн нарийн ширийн зүйлийг анхаарч үзээрэй: бүх хувилбарт зориулсан нийтлэг цэс, хувилбаруудын талаархи мэдээлэл бүхий хуудас гэх мэт. - бид тэгэхгүй. Үүний оронд динамик угсралтын асуудал, онцлогууд дээр анхаарлаа хандуулж, дагалдах CI/CD процессуудад бага зэрэг анхаарлаа хандуулцгаая.
Танилцуулга: сайт хэрхэн ажилладаг
Эхлэхийн тулд werf баримт бичгийг кодын хамт хадгалдаг. Энэ нь ерөнхийдөө энэ зүйлийн хамрах хүрээнээс гадуур тодорхой хөгжлийн шаардлагуудыг тавьдаг боловч наад зах нь дараахь зүйлийг хэлж болно.
- Баримт бичгийг шинэчлэхгүйгээр шинэ werf функцуудыг гаргах ёсгүй бөгөөд эсрэгээр, баримт бичигт гарсан аливаа өөрчлөлт нь werf-ийн шинэ хувилбарыг гаргах гэсэн үг юм;
- Төсөл нь нэлээд эрчимтэй хөгжиж байна: шинэ хувилбаруудыг өдөрт хэд хэдэн удаа гаргах боломжтой;
- Баримт бичгийн шинэ хувилбар бүхий сайтыг байрлуулах аливаа гар ажиллагаа нь ядаж уйтгартай байдаг;
- Төсөл нь семантик аргыг ашигладаг
хувилбар гаргах , 5 тогтвортой байдлын сувагтай. Хувилбарын үйл явц нь тогтвортой байдлыг нэмэгдүүлэхийн тулд сувгаар дамжуулан хувилбаруудыг дараалан дамжуулдаг: альфагаас чулуулаг хүртэл; - Энэ сайт нь үндсэн (өөрөөр хэлбэл англи хэл дээрх) хувилбартай зэрэгцэн "амьдарч, хөгжиж" (өөрөөр хэлбэл агуулга нь шинэчлэгдсэн) орос хэл дээрх хувилбартай.
Энэ бүх "дотоод гал тогоо"-ыг хэрэглэгчээс нуухын тулд түүнд "зүгээр л ажилладаг" зүйлийг санал болгов тусдаа werf суулгах, шинэчлэх хэрэгсэл Байна уу
Вэбсайт дээрх хувилбар сонгох цэсэнд werf-ийн хамгийн сүүлийн хувилбарууд суваг бүрт байдаг. Анхдагч байдлаар, хаягаар
Нийтдээ сайтад дараах хувилбарууд бий.
- root (өгөгдмөлөөр нээгддэг),
- хувилбар бүрийн идэвхтэй шинэчлэх суваг бүрийн хувьд (жишээлбэл,
werf.io/v1.0-бета ).
Сайтын тодорхой хувилбарыг бий болгохын тулд ерөнхийдөө үүнийг ашиглан хөрвүүлэхэд хангалттай /docs
werf репозитортой харгалзах тушаал (jekyll build
), шаардлагатай хувилбарын Git таг руу шилжсэний дараа.
Үүнийг нэмэхэд л үлдлээ:
- угсралтад уг хэрэгсэл өөрөө (werf) ашиглагддаг;
- CI/CD процессууд нь GitLab CI-ийн үндсэн дээр бүтээгдсэн;
- Мэдээжийн хэрэг энэ бүхэн Кубернетес дээр явагддаг.
үүрэг
Одоо тайлбарласан бүх онцлогийг харгалзан даалгавруудыг томъёолъё.
- Аливаа шинэчлэлтийн суваг дээр werf хувилбарыг өөрчилсний дараа сайт дээрх баримт бичиг автоматаар шинэчлэгдэх ёстой.
- Хөгжүүлэхийн тулд та заримдаа чадвартай байх хэрэгтэй сайтын урьдчилан харах хувилбаруудыг үзэх.
Харгалзах Git хаягуудаас аль ч суваг дээрх хувилбарыг өөрчилсний дараа сайтыг дахин эмхэтгэх ёстой боловч зураг бүтээх явцад бид дараах боломжуудыг авах болно.
- Сувгууд дээрх хувилбаруудын жагсаалт өөрчлөгдөж байгаа тул зөвхөн хувилбар нь өөрчлөгдсөн сувгуудын баримт бичгийг дахин бүтээх шаардлагатай. Эцсийн эцэст, бүх зүйлийг дахин сэргээх нь тийм ч таатай биш юм.
- Гаргах сувгийн багц өөрчлөгдөж магадгүй. Хэзээ нэгэн цагт, жишээлбэл, сувгууд дээр эрт хандалттай 1.1 хувилбараас илүү тогтвортой хувилбар байхгүй байж болох ч цаг хугацаа өнгөрөхөд тэдгээр нь гарч ирэх болно - энэ тохиолдолд та угсралтыг гараар өөрчлөх хэрэгтэй биш үү?
Энэ нь угсралт нь гадаад өгөгдлийг өөрчлөхөөс хамаарна.
Реализация
Арга барилыг сонгох
Эсвэл та шаардлагатай хувилбар бүрийг Kubernetes-д тусдаа pod хэлбэрээр ажиллуулж болно. Энэ сонголт нь кластер дахь илүү олон тооны объектуудыг агуулдаг бөгөөд энэ нь тогтвортой werf хувилбаруудын тоо нэмэгдэхийн хэрээр өсөх болно. Энэ нь эргээд илүү төвөгтэй засвар үйлчилгээ шаарддаг: хувилбар бүр өөрийн гэсэн HTTP сервертэй бөгөөд бага ачаалалтай байдаг. Мэдээжийн хэрэг, энэ нь илүү их нөөцийн зардлыг шаарддаг.
Бид ижил замаар явсан шаардлагатай бүх хувилбаруудыг нэг зураг дээр цуглуулах. Сайтын бүх хувилбаруудын эмхэтгэсэн статикууд нь NGINX-тэй контейнерт байрладаг бөгөөд холбогдох байршуулалт руу чиглэсэн урсгал NGINX Ingress-ээр дамжин ирдэг. Энгийн бүтэц - харьяалалгүй програм нь Kubernetes-ийг ашиглан Байршуулах ажлыг (ачаалалаас хамааран) хялбархан масштаблах боломжийг олгодог.
Илүү нарийвчлалтай болгохын тулд бид хоёр зураг цуглуулж байна: нэг нь үйлдвэрлэлийн хэлхээнд зориулагдсан, хоёр дахь нь төхөөрөмжийн хэлхээний нэмэлт зураг юм. Нэмэлт зургийг зөвхөн үндсэн зурагтай хамт хөгжүүлэлтийн хэлхээнд ашигладаг (эхэлсэн) бөгөөд хянан шалгах комиссоос сайтын хувилбарыг агуулдаг бөгөөд тэдгээрийн хоорондох чиглүүлэлт нь Ingress нөөцийг ашиглан хийгддэг.
werf vs 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") }}
Сайтын статик хувилбарыг эмхэтгэхэд зориулсан олдворын тайлбар нь бидэнд шаардлагатай бүх тохиолдолд ерөнхийдөө ижил байна (үүнд үндсэн хувилбарыг үүсгэх, түүнчлэн хөгжүүлэлтийн хэлхээний хувилбар гэх мэт). Тиймээс бид функцийг ашиглан тусдаа блок руу шилжүүлнэ 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
. Энэ нь GitHub дэгээнээс дамжуулах шугамыг дуудах үед бидний тохируулах REVIEW_SHA хувьсагчдад хамаарахгүй.
Бид Bash скрипт дээр шаардлагатай гадаад өгөгдлийг үүсгэх болно generate_artifacts
, энэ нь GitLab дамжуулах хоолойн хоёр олдворыг үүсгэх болно:
- файл
releases.yml
хувилбарын өгөгдөлтэй, - файл
common_envs.sh
, экспортлох орчны хувьсагчдыг агуулсан.
Файлын агуулга generate_artifacts
та манайхаас олох болно common_envs.sh
бидний хувьд чухал, учир нь werf-ийн ажил үүнээс хамаарна. Түүний агуулгын жишээ:
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 тохиргоо -> Дамжуулах хоолойн гох, дараа нь GitHub дээр харгалзах Webhook үүсгэнэ үү (Тохиргоо -> 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 Registry байнга өсөх болно. Тиймээс, бодлогод үндэслэн зураг автоматаар цэвэрлэх тохиргоог хийх нь зайлшгүй шаардлагатай. Үүнийг хийхэд маш хялбар.
Хэрэгжүүлэхийн тулд танд хэрэгтэй болно:
- Цэвэрлэх алхам нэмнэ үү
.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 Registry руу нэвтрэх хэрэгтэй (автоматаар гаргасан GitLab CI даалгаврын токен нь тийм биш юм. ийм эрхтэй). Токеныг GitLab дээр урьдчилан үүсгэсэн байх ёстой бөгөөд түүний утгыг орчны хувьсагч дээр зааж өгөх ёстой WERF_IMAGES_CLEANUP_PASSWORD
төсөл (CI/CD тохиргоо -> Хувьсагч).
Шаардлагатай хуваарийн дагуу цэвэрлэгээний ажлыг нэмж оруулав CI/CD ->
Жагсаалт.
Энэ бол: Docker Registry дахь төсөл ашиглагдаагүй зургуудаас байнга өсөхгүй.
Практик хэсгийн төгсгөлд нийтлэлийн бүрэн жагсаалтыг эндээс авах боломжтой гэдгийг сануулъя
үр дүн
- Бид логик угсралтын бүтцийг хүлээн авсан: хувилбар бүрт нэг олдвор.
- Угсралт нь бүх нийтийнх бөгөөд werf-ийн шинэ хувилбарууд гарах үед гараар өөрчлөх шаардлагагүй: вэбсайт дээрх баримт бичиг автоматаар шинэчлэгддэг.
- Хоёр зургийг өөр өөр контурын хувьд угсарсан.
- Энэ нь хурдан ажилладаг, учир нь Кэшийг аль болох их ашигладаг - werf-ийн шинэ хувилбар гарах эсвэл GitHub дэгээг шалгахаар дуудах үед зөвхөн өөрчилсөн хувилбартай харгалзах олдворыг дахин бүтээдэг.
- Ашиглагдаагүй зургуудыг устгах талаар бодох шаардлагагүй: werf бодлогын дагуу цэвэрлэх нь Docker Registry-г эмх цэгцтэй байлгах болно.
үр дүн нь
- Werf-ийг ашиглах нь угсралт өөрөө болон гадаад репозитортой ажиллах үед кэш хийснээр угсралт хурдан ажиллах боломжийг олгодог.
- Гадны Git репозиторуудтай ажиллах нь репозиторийг бүхэлд нь хувилах эсвэл дугуйг оновчлох төвөгтэй логикоор дахин зохион бүтээх хэрэгцээг арилгадаг. werf нь кэш ашигладаг бөгөөд клончлолыг зөвхөн нэг удаа хийж, дараа нь ашигладаг
fetch
мөн шаардлагатай үед л. - Барилгын тохиргооны файлд Go загваруудыг ашиглах чадвар
werf.yaml
үр дүн нь гадны өгөгдлөөс хамаарах угсралтыг тайлбарлах боломжийг танд олгоно. - Werf-д mount ашиглах нь олдворуудыг цуглуулах ажлыг ихээхэн хурдасгадаг - кэшийн улмаас бүх дамжуулах хоолойд нийтлэг байдаг.
- werf нь цэвэрлэх тохиргоог хялбар болгодог бөгөөд энэ нь динамикаар барьж байгуулахад онцгой ач холбогдолтой юм.
PS
Мөн манай блог дээрээс уншина уу:
- «
Kubernetes-д програмын шинэ хувилбарыг хүргэх явцад тушаалуудыг ажиллуулж байна "; - «
Werf болон GitLab CI-тэй ижил төрлийн микро үйлчилгээг бүтээж, байрлуул "; - «
Нарийн төвөгтэй Helm диаграмыг гаргахын тулд werf ашиглах "; - «
Werf 1.0 тогтвортой хувилбарыг танилцуулж байна: GitOps үүнтэй ямар холбоотой вэ, статус, төлөвлөгөө ".
Эх сурвалж: www.habr.com