Werf vasitəsilə versiyalaşdırılmış sənəd saytının nümunəsi ilə Docker imiclərinin dinamik qurulması və yerləşdirilməsi

Biz GitOps alətimiz haqqında bir neçə dəfə məlumat vermişik werf, amma bu dəfə layihənin öz sənədləri ilə veb saytın qurulması təcrübəmizlə bölüşmək istərdik — werf.io (onun rus dilindəki versiyası — ru.werf.io). Bu adi statik bir saytdır, lakin onun qurulması dinamik artefaktlar istifadə edilməsi baxımından maraqlıdır.

Werf vasitəsilə versiyalaşdırılmış sənəd saytının nümunəsi ilə Docker imiclərinin dinamik qurulması və yerləşdirilməsi

Saytın strukturu üzrə incələməyə, hər versiya üçün ümumi menyunun yaradılması, buraxılış məlumatlarının səhifələri və s. — girməyəcəyik. Bunun əvəzinə, dinamik qurma ilə bağlı məsələlərə və bir az CI/CD-yə aid proseslərə fokuslanacağıq.

Giriş: sayt necə işləyir

İlk növbədə, werf sənədləri onun kodu ilə birgə saxlanılır. Bu, inkişaf üçün müəyyən tələblər ortaya qoyur ki, bunlar ümumi olaraq bu məqalənin çərçivələrini aşır, amma ən azı deyə bilərik ki:

  • Yeni werf funksiyaları sənəd olmadan təqdim edilməməlidir və əksinə, sənəddəki hər hansı bir dəyişiklik yeni werf versiyasının çıxmasını nəzərdə tutur;
  • Proyektin inkişaf prosesi xeyli intensivdir: yeni versiyalar gündə bir neçə dəfə çıxa bilər;
  • Saytı yeni sənəd versiyası ilə əllə yerləşdirməkdən hər halda yorucu olacağını qeyd etmək olar;
  • Layihədə semantik yanaşma qəbul edilmişdir sürümleme, 5 stabillik kanalı ilə. Buraxılış prosesi versiyaların stabilliyin artırılması məqsədilə ardıcıllıqla kanallardan keçməsini nəzərdə tutur: alpha-dan rock-solid-ə;
  • Saytda rus dilində bir versiya var ki, bu da „yaşayır və inkişaf edir“ (yəni məzmunu yenilənir) əsas (yəni ingilis dilindəki) versiya ilə параллельно.

İstifadəçiyə bu „daxili mətbəxi“ gizlətmək üçün, ona „sadəcə işləyən“ bir şey təklif edərək, biz werf-in quraşdırılması və yenilənməsi üçün ayrıca bir alət — bu multiwerfyaratdıq. İstədiyiniz buraxılış nömrəsini və stabillik kanalını göstərmək kifayətdir ki, multiwerf yeni versiyanın olub-olmadığını yoxlayıb, lazım olduqda onu yükləyəcək.

Saytdakı versiya seçim menyusunda hər kanal üzrə son werf versiyaları mövcuddur. Varsayılan olaraq, ünvan werf.io/documentation ən son buraxılış üçün ən stabil kanalın versiyasını açır — bu da axtarış mühərrikləri tərəfindən indekslənir. Kanal üçün sənəd ayrı ünvanlarla (məsələn, werf.io/v1.0-beta/documentation 1.0 beta buraxılışı üçün) mövcuddur.

Nəticə olaraq, saytda aşağıdakı versiyalar var:

  1. köklü (varsayılan olaraq açılır),
  2. hər buraxılışın hər aktiv yeniləmə kanalı üçün (məsələn, werf.io/v1.0-beta).

Saytın konkret versiyasını yaratmaq üçün, ümumi halda, onun tərtib edilməsini təmin etmək lazımdır Jekyll, werf repositoriyasında müvafiq əmri ( /docs jekyll build) yerinə yetirərək, lazım olan versiyanın Git etiketinə keçid etməklə.Sadəcə olaraq, əlavə etmək qalır ki:

tərtibat üçün öz utilitindən (werf) istifadə olunur;

  • quraşdırma üçün öz utilitindən (werf) istifadə olunur;
  • CI/CD prosesləri GitLab CI əsasında qurulub;
  • və bütün bunlar, əlbəttə ki, Kubernetes-də işləyir.

Vəzifələr

İndi bütün təsvir olunan spesifikaları nəzərə alaraq tapşırıqları müəyyənləşdirək:

  1. werf versiyası hər hansı bir yeniləmə kanalında dəyişdikdən sonra saytdakı sənədləşmə avtomatik olaraq yenilənməlidir.
  2. İnkişaf üçün bəzən saytın əvvəlki versiyalarını baxmaq imkanı olmalıdır.

Saytı yenidən kompilyasiya etmək, müvafiq Git etiketi üzrə versiya dəyişdikdən sonra həyata keçirilməlidir, lakin görüntü yaradılması prosesi zamanı aşağıdakı xüsusiyyətləri əldə edəcəyik:

  • Versiya listi kanallarda dəyişdikcə, yalnız versiyasının dəyişdiyi kanallar üçün sənədləşməni yenidən kompilyasiya etmək lazımdır. Axı, hər şeyi yenidən toplamaq çox gözəl deyil.
  • Buradakı buraxılış kanalları dəstinin özü də dəyişə bilər. Məsələn, müəyyən bir zamanda, bəlkə də, early-access 1.1 versiyası üçün daha sabit kanallarda versiya olmayacaq, amma zamanla onlar ortaya çıxacaq - əlbəttə ki, bu halda toplama əllə dəyişməməlidir?

Yani toplama dəyişən xarici məlumatlardan asılıdır.

Həyata keçirmə

Yanaşma seçimi

Bir variant olaraq, hər lazım olan versiyanı Kubernetes-də ayrı pod kimi işə salmaq mümkündür. Bu variant, etibarlı werf buraxılışlarının sayı artdıqca, daha çox obyektin klasterdə olmasını nəzərdə tutur. Bu, müvafiq olaraq, daha mürəkkəb xidmət tələb edir: hər bir versiya üçün öz HTTP serveri yaranır, bununla yanaşı, yüngül yük vardır. Əlbəttə ki, bu, daha çox resurs xərclənməsinə gətirib çıxarır.

Biz bu yolla getdik bütün lazım olan versiyaları bir görüntüdə toplamaq. Bütün versiyaların tərtib olunmuş statikası NGINX ilə konteynerdə yerləşir, müvafiq Yerləşdirməyə trafikin yönləndirilməsi NGINX Ingress vasitəsilə həyata keçirilir. Sadə struktur - state-less proqram - Yerləşdirilməni (yükə görə) Kubernetes-in öz vasitələri ilə asanlıqla genişləndirməyə imkan verir.

Daha dəqiq desək, biz iki görüntü toplayırıq: biri - istehsal konturu üçün, digəri - dev konturu üçün əlavə bir görüntü. Əlavə görüntü yalnız əsasla birlikdə dev konturunda istifadə olunur (işə salınır) və review-şərhindən sayt versiyasını ehtiva edir, onların arasında yönləndirmə Ingress resursları vasitəsilə həyata keçirilir.

werf vs git clone və artefaktlar

Artıq qeyd edildiyi kimi, müəyyən bir sənəd versiyası üçün saytın statikasını yaratmaq üçün uyğun depozitorun etiketi üzrə keçid edərək toplama icra edilməlidir. Eyni zamanda, hər dəfə toplayarkən depozitoru klonlamaq və uyğun etiketləri siyahıdan seçmək də olardı. Lakin bu, olduqca resurs tələb edən bir əməliyyaddır və əlavə olaraq qeyri-adi təlimatların yazılmasını tələb edir... Bu yanaşmanın başqa bir ciddi mənfi cəhəti - toplama zamanı bir şeyi ön yaddaşa almaq imkanı olmamasıdır.

Burada bizə werf utilitəsi kömək edir, hansı ki, ağıllı ön yaddaşlama təmin edir və istifadə etməyə imkan tanıyır xarici depozitlər. Werf-dan depozitorun kodunun əlavə edilməsi, werf-in bir dəfə depozitini klonladığı üçün prosesi əhəmiyyətli dərəcədə sürətləndirir, sonra isə kontrol plitəsi üçün vermək istəmədim. Buna görə pi-control düyünündən avtomatik əlavə edilən 'taint'ı sökmək üçün aşağıdakı əmri yerinə yetirdim: fetch lazım olduğu halda. Depozitdən məlumat əlavə edərkən yalnız lazım olan qovluqları seçə bilərik (bu halda bu kataloq docs), bu da əlavə edilən məlumatların miqdarını əhəmiyyətli dərəcədə azaldır.

Jekyll-in statik tərtibat üçün nəzərdə tutulmuş bir alət olması və son görüntüdə lazım olmaması səbəbi ilə, mümkün olan daha məqsədəuyğun olan tərtibatı werf artefaktında, son görüntüyə yalnız tərtibatın nəticəsini idxal etmək.

werf.yaml yazırıq

Beləliklə, hər versiyanı fərqli werf artefaktında tərtib edəcəyimizə qərar verdik. Ancaq biz neçə artefaktın yığılacağını bilmirik, buna görə də sabit tərtibat konfiqurasiyası yaza bilmirik (həqiqətən yaza bilərik, amma bu o qədər də effektiv olmayacaq).

werf, Go şablonlarını konfiqurasiya faylında (werf.yaml) istifadə etməyə imkan verir, bu da konfini «anında» yaratmağa xarici verilərə əsasən imkan tanıyır (bu, lazım olan!). Bizim vəziyyətimizdə xarici verilər, lazım olan artefaktların sayını müvafiq versiyalarda və buraxılışlarda yığırıq və iki görüntü əldə edirik: werf-docwerf-dev fərqli konteynerlərdə yükləmək üçün.

Xarici verilər mühit dəyişənləri vasitəsilə ötürülür. Onların tərkibi belədir:

  • RELEASES — buraxılışların siyahısı və müvafiq werf-in cari versiyası, boşluqla ayrılmış dəyərlərdən ibarətdır %. Nümunə: 1.0%v1.0.4-beta.20
  • CHANNELS — kanalların siyahısı və müvafiq werf-in cari versiyası, boşluqla ayrılmış dəyərlərdən ibarətdir %. Nümunə: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION — vebsaytda default olaraq göstəriləcək werf buraxılış versiyası (həmişə ən yüksək buraxılış nömrəsini göstərmək lazım deyil). Nümunə: v1.0.4-beta.20
  • REVIEW_SHA — test konturuna versiya yığmaq üçün lazım olan review commit-in hash'i.

Bu dəyişənlər GitLab CI pipeline-də doldurulacaq, necə olduğu aşağıda qeyd olunub.

İlk növbədə, rahatlıq üçün, werf.yaml Go şablonları üçün dəyişənləri müəyyən edərək, mühit dəyişənlərindən dəyərləri təyin edəcəyik:

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

Vebsaytın statik versiyasını tərtib etmək üçün artefaktın təsviri bütün lazım olan hallarda demək olar ki, eynidir (həmçinin kök versiyanın, eləcə də dev konturu üçün versiyanı tərtib edərkən). Ona görə də, bunun üçün ayrıca bir blokda istifadə edərək define - gələcək istifadə üçün include. Şablona aşağıdakı arqumentləri verəcəyik:

  • Yüzde - yaradılacaq versiya (etiket adı);
  • Kanala — yenilənmə kanalı adı, artefaktın yaradılması üçün;
  • Commit — əgər artefakt review-commit üçün yaradılırsa, commit hash-i;
  • bağlam.

Artefakt şablonunun təsviri

{{- 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: "Asılılıqları Yükle"
    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 }}

Artefaktın adı unikal olmalıdır. Bunu, məsələn, kanalın adını (dəyişən dəyərin .Channel) artefaktın adının əlavəsi kimi əlavə etməklə əldə edə bilərik: artifact: doc-{{ .Channel }}. Ancaq anlamalıyıq ki, artefaktlardan idxal edilərkən eyni adlarla müraciət etmək lazım olacaq.

Artefaktın təsvirində werf-in təqdim etdiyi bir imkan, montaj. İdarəetmə direktoriyası ilə montaj build_dir Jekyll-in keçidini saxlayaraq pipeline-lar arasında sürətlənməyə imkan verir, bu yenidənqurma prosesini xeyli sürətləndirir.

Bu qədər siz, yəqin ki, releases.yml — bu, YAML formatında olan bir fayldır, github.com pipeline icra edilərkən əldə edilir. O, saytın tərtibi zamanı istifadə olunur, lakin məqalənin kontekstində bizi maraqlandırır ki, onun vəziyyəti yalnız bir artefaktın — kök versiyası saytının artefaktı (digər artefaktlarda lazım deyil) yenidən qurulması üzərində təsir edir.

Bu, Bütün kubelet’lərdə Go şablonları və {{ $Root.Files.Get "releases.yml" | sha256sum }} tətbiqinin hissəsində. Bu, belə işləyir: kök versiyasının artefaktı yaradıldığı zaman (dəyişən .Channel bərabərdir root) faylın hash-i bütün mərhələnin imzasına təsir edir, çünki bu, Ansible tapşırığının adının bir hissəsidir (parametr releases.yml ). Beləliklə, Lisenziya, inkişaf etdiricilər və versiya idarəetmə sisteminin məlumatlarının mövcudluğuməzmun dəyişdikdə, müvafiq artefakt yenidən qurulacaq. faylı releases.yml müvafiq artefakt yenidən qurulacaq.

Eyni zamanda xarici depo ile çalışmanıza da diqqət yetirin. Artezaktın şəkli werf depoyalnız bir kataloq əlavə edilir /docsvə verilmiş parametrlərdən asılı olaraq, yalnız lazımi etiketin və ya review-committerin məlumatları əlavə edilir.

Verilmiş kanalların versiyaları üçün artefakt təsvirini yaratmaq üçün artefakt şablonundan istifadə edərək, dəyişərli üzrə döngü təşkil edəcəyik .WerfVersions daxilindədir. werf.yaml:

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

Döngü bir neçə artefakt yaradacağı üçün (bunun olmasını ümid edirik), aralarındakı ayrıcı olan ardıcıllığı nəzərə almaq lazımdır --- (konfiqurasiya faylının sintaksisi haqqında daha ətraflı məlumat üçün baxın sənəd). Daha əvvəl müəyyən etdiyimiz kimi, döngü içərisində şablonu çağırdığımızda, versiya, URL və kök kontekst параметrlərini ötürürük.

Eynilə, lakin döngü olmadan, xüsusi hallar üçün artefakt şablonunu çağırırıq: kök versiyası və review-committer olan versiya üçün:

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

Diqqət yetirin ki, review-committer üçün artefakt yalnız aşağıda verilmiş dəyişən {{.WerfReviewCommit}} təyin edilmişsə yığılacaq. .WerfReviewCommit.

Artefaktlar hazırdır — idxalatla məşğul olmaq vaxtıdır!

Kubernetes-də işə salmaq üçün nəzərdə tutulan son görüntü adi NGINX-dir, bunun içərisində server konfiqurasiya faylı əlavə edilir nginx.conf və artefaktlardan statikalar. Saytın kök versiyasının artefaktından əlavə, kanalların versiyaları və buraxılışları üçün artefaktların idxali üçün .WerfVersions döngünü təkrarlamalıyıq + daha əvvəl qəbul etdiyimiz artefakt adlandırma qaydasına riayət etməliyik. Hər bir artefakt iki dil üçün sayt versiyalarını saxladığından, bunları konfiqurasiya əsasında nəzərdə tutulan yerlərə idxal edəcəyik.

werf-doc son görüntüsü haqqında təsvir

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

Əlavə görüntü, əsas ilə birlikdə dev-sahəsində işə salınır, yalnız iki sayt versiyasını ehtiva edir: review-committer-dən olan versiya və saytın kök versiyası (orada ümumi resurslar var və, əgər yadımdadırsa, buraxılışlar üzrə məlumatlar). Beləliklə, əlavə görüntü yalnız idxal bölməsi ilə (və əlbəttə ki, adı ilə) əsasdan fərqlənəcəkdir.

şəkil: werf-dev
...
idxal:
- artefakt: doc-root
  əlavə et: /app/_main_site
  bura: /app/main_site
  əvvəl: qurulum
- artefakt: doc-root
  əlavə et: /app/_ru_site
  bura: /app/ru_site
  əvvəl: qurulum
{{- if .WerfReviewCommit  }}
- artefakt: doc-review
  əlavə et: /app/_main_site
  bura: /app/main_site/review
  əvvəl: qurulum
- artefakt: doc-review
  əlavə et: /app/_ru_site
  bura: /app/ru_site/review
  əvvəl: qurulum
{{- end }}

Yuxarıda qeyd edildiyi kimi, review-commit üçün artefakt yalnızca müəyyən edilmiş ətraf mühit dəyişənləri işə salındıqda yaradıla bilər. REVIEW_SHA. Heç olmasa ətraf mühit dəyişəni yoxdursa, werf-dev obrazını ümumiyyətlə yaratmamaq olardı REVIEW_SHA, amma bunun üçün politikalara görə təmizləmə Docker obrazlarının werf-da werf-dev üçün işləməsi üçün, onu yalnız kök versiyasının artefaktı ilə yığmağı saxlayacağıq (nəticədə o artıq yığılmışdır), pipeline strukturunu sadələşdirmək üçün.

Yığım hazırdır! CI/CD-yə və vacib nüanslara keçirik.

GitLab CI-də pipeline və dinamik yığmanın xüsusiyyətləri

Yığımı işə salarkən ətraf mühit dəyişənlərini qurmağımız lazımdır, werf.yamlbu, GitHub-dan pipelineni çağırdığımız zaman qurulacaq REVIEW_SHA dəyişəninə aid deyil.

Lazım olan xarici məlumatların formalaşdırılmasını Bash skriptinə ayıracağıq generate_artifacts, bu, iki GitLab pipeline artefaktını yaradacaq:

  • faylımı əlavə etdim releases.yml buraxılışlarla bağlı məlumatlarla,
  • faylımı əlavə etdim common_envs.sh, ixrac üçün ətraf mühit dəyişənlərini ehtiva edir.

Faylın məzmununu generate_artifacts bizim nümunələr ilə repositoriyamızda tapa bilərsiniz. Məlumatların əldə edilməsi məqalənin mövzusu deyil, lakin fayl common_envs.sh bizim üçün önəmlidir, çünki werf-in işini məhz ondan asılıdır. Məzmununun nümunəsi:

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'

Belə bir skriptin çıxışını, məsələn, Bash funksiyası vasitəsilə istifadə edə bilərsiniz mənbə.

Və indi ən maraqlısı. Həm yığım, həm də tətbiqin yerləşdirilməsi düzgün işləməsi üçün, bu şəkildə olmalıdır ki, werf.yaml eyni ən azı bir pipeline daxilində . Bu şərti yerinə yetirməsək, werf-in yığma və yerləşdirmə zamanı hesabladığı mərhələlərin imzaları fərqli olacaq. Bu, yerləşdirmə səhvini gətirəcək, çünki yerləşdirmə üçün lazımlı olan obraz olmaya bilər.Başqa sözlə, əgər saytın obrazı yığılarkən buraxılış və versiya məlumatları biri olarsa, lakin yerləşdirmə zamanı yeni versiya çıxarsa və ətraf mühit dəyişənləri fərqli dəyərlərə sahib olarsa, yerləşdirmə səhvlə nəticələnəcək: axı yeni versiyanın artefaktı hələ yığılmayıb.

Əgər generasiya

xarici məlumatlardan asılıdırsa (məsələn, aktual versiyalar siyahısı, bizim vəziyyətimizdə olduğu kimi), o zaman bu cür məlumatların tərkibi və dəyərləri pipeline daxilində qeydə alınmalıdır. Bu, xarici parametrlərin tez-tez dəyişdiyi zaman xüsusilə vacibdir. werf.yaml Biz

xarici məlumatları alıb qeydə alacağıq pipeline-in ilk mərhələsində GitLab-da ( Prebuild) və bunları daha sonraGitLab CI artefaktı şəklində ötürəcəyik.. Bu, həm yığımlar, həm də yerləşdirmələr, təmizləmələr üçün eyni konfiqurasiya ilə pipeline işlərini işə salmağa və yenidən işə salmağa imkan verəcək werf.yaml.

Mərhələnin məzmunu ) və bunları daha sonra faylı .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 həftə

Xarici məlumatları artefaktlarda sabitləşdirərək, GitLab CI-nin standart mərhələlərindən istifadə edərək tikinti və yerləşdirmə icra edə bilərsiniz: Build və Deploy. Biz bu boru xəttini GitHub depozitindən (yəni, GitHub-da depozitdəki dəyişikliklərdə) hücumlarla işə salırıq. Onlar üçün məlumatları GitLab layihəsi xüsusiyyətlərindən götürə bilərsiniz. CI / CD Parametrləri -> Boru xətti tetikleyicilər, sonra GitHub-da müvafiq Webhook yaradacağıq (Tənzimləmələr -> Webhooklar).

Tikinti mərhələsi aşağıdakı kimi görünəcək:

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 tikinti mərhələsinə iki artefakt əlavə edəcək. ) və bunları daha sonra, beləliklə biz dəyişənləri hazırlanmış giriş verilənləri ilə bazaya ixrac edəcəyik. source common_envs.sh. Tikinti mərhələsini, boru xəttini cədvəl üzrə işə salmaqdan başqa, hər bir halda icra edirik. Cədvəl üzrə biz təmizləmə boru xəttini işə salacağıq - bu halda tikinti aparmaq lazım deyil.

Yerləşdirmə mərhələsində iki tapşırıq müstəqil olaraq istehsal və dev mühitləri üçün qeyd ediləcək, YAML şablonundan istifadə edərək:

.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

Yerləşdirmə istehsala:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: prod
  environment:
    name: production
    url: werf.io
  only:
    refs:
      - master
  except:
    variables:
      - $REVIEW_SHA
    refs:
      - schedules

Yerləşdirmə Test:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: dev
  environment:
    name: test
    url: werf.test.flant.com
  except:
    refs:
      - schedules
  only:
    variables:
      - $REVIEW_SHA

Tapşırıqlar əslində yalnız werf-in yerləşdirmə aparmalı olduğu klaster kontekstini göstərməkdən ibarətdir (WERF_KUBE_CONTEXT), və kontur mühitinin dəyişənlərini (environment.nameenvironment.url) müəyyən etməkdir, bunlar daha sonra Helm chart şablonlarında istifadə olunur. Şablonların içeriğini gətirməyəcəyik, çünki burada nəzərdən keçirilən mövzu üçün heç bir maraqlı şey yoxdur, amma onları məqalənin deposundan tapa bilərsiniz..

Son toxunuş

Çünki werf versiyaları tez-tez çıxır, yeni görüntülər də tez-tez yaradılacaq və Docker Registry daim artacaq. Buna görə, mütləq görüntülərin siyasətlər üzrə avtomatik təmizlənməsini ayarlamaq lazımdır. Bunu etmək çox asandır.

Bunun həyata keçirilməsi üçün lazımdır:

  • Təmizləmə mərhələsini əlavə edin .gitlab-ci.yml;
  • Təmizləmə işinin müntəzəm icrasını əlavə edin;
  • Yazma üçün giriş tokeni ilə mühit dəyişənini ayarlayın.

Təmizləmə mərhələsini əlavə edirik .gitlab-ci.yml:

Təmizləmə:
  mərhələ: təmizləmə
  skript:
    - tip multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - tip 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
  yalnız:
    refs:
      - cədvəllər

Demək olar ki, bunların hamısını yuxarıda gördük - yalnız təmizləmə üçün əvvəlcə Docker Registry-yə təsdiq edilməlidir, bu da Docker Registry-də şəkilləri silmək hüququna malik bir token tələb edir (GitLab CI işləri üçün avtomatik verilən token bu hüquqlara malik deyil). Tokenin əvvəlcədən GitLab-da yaradılması və onun dəyərinin mühit dəyişkənində göstərilməsi lazımdır. WERF_IMAGES_CLEANUP_PASSWORD liberated-systemd 261 (CI/CD Parametrləri -> Dəyişkənlər).

Təmizləmə işinin lazımi cədvəllə əlavə edilməsi CI/CD ->
Cədvəllər
.

Hər şey: layihə Docker Registry-də bitməmiş şəkillərdən dolayı daima böyüməyəcək.

Praktiki hissənin sonunda xatırlatmaq istəyirəm ki, məqalədən tam siyahılar Git:

Nəticə

  1. Açıq və aydın bir toplama strukturu əldə etdik: bir versiya üçün bir artefakt.
  2. Toplama universal və yeni werf versiyaları çıxdıqda əllə dəyişiklik etməyi tələb etmir: sənədlər avtomatik olaraq veb saytda yenilənir.
  3. Fərqli mühitlər üçün iki şəkil yığılır.
  4. Tez işləyir, çünki maksimum dərəcədə keşdən istifadə olunur - yeni werf versiyası çıxdıqda və ya review-commit üçün GitHub köməyinə çağırıldıqda yalnız dəyişən versiyaya aid müvafiq artefakt yenidən toplanır.
  5. İstifadəsiz şəkillərin silinməsi barədə düşünməyə ehtiyac yoxdur: werf siyasətləri ilə təmizləmə Docker Registry-də nizamı qoruyacaq.

Sonuçlar

  • Werf istifadə edərək, toplama tez keşa, həmçinin xarici repozitoriyalarla işləmə zamanı keşa görə sürətlənir.
  • Xarici Git-repozitoriyaları ilə işləmək, repozitoriyanı hər dəfə tamamilə klonlamaq və ya mürəkkəb optimizasiya məntiqini icad etmək zərurətindən azad edir. Werf keşdən istifadə edir və yalnız bir dəfə klonlama edir, daha sonra yalnız zərurət olduqda istifadə edir fetch və yalnız lazım olduqda.
  • Toplamanın konfiqurasiya faylında Go şablonlarının istifadəsi werf.yaml xarici məlumatlardan asılı olan bir toplama təsvir etməyə imkan verir.
  • Werf-də montajların istifadəsi artefaktların toplanmasını xeyli sürətləndirir - bütün pipeline üçün ortaq olan keşa görə.
  • Werf təmizləməni asanlıqla konfiqurasiya etməyə imkan verir, bu da dinamik toplama zamanı xüsusilə aktualdır.

P.S.

Blogumuzda oxuyun:

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster