متحرک مجلس او د ویرف سره د ډاکر عکسونو ځای په ځای کول د نسخې اسنادو سایټ مثال په کارولو سره

موږ دمخه زموږ د GitOps وسیلې په اړه له یو ځل څخه ډیر خبرې کړې دي. werf، او دا ځل موږ غواړو خپله تجربه د پروژې د اسنادو سره د سایټ په راټولولو کې شریک کړو - werf.io (د هغې روسي نسخه ده en.werf.io). دا یو عادي جامد سایټ دی، مګر د هغې مجلس په زړه پورې دی چې دا د متحرک شمیر اثارو په کارولو سره جوړ شوی.

متحرک مجلس او د ویرف سره د ډاکر عکسونو ځای په ځای کول د نسخې اسنادو سایټ مثال په کارولو سره

د سایټ جوړښت باریکیو ته لاړشئ: د ټولو نسخو لپاره یو عام مینو رامینځته کول ، د خپرونو په اړه معلوماتو سره پا pagesې ، او داسې نور. - مونږ به نه. پرځای یې، راځئ چې د متحرک مجلس په مسلو او ځانګړتیاوو تمرکز وکړو او د CI/CD پروسو سره یو څه لږ تمرکز وکړو.

پیژندنه: سایټ څنګه کار کوي

د پیل کولو لپاره، د werf اسناد د دې کوډ سره ساتل کیږي. دا د پراختیا ځینې اړتیاوې رامینځته کوي چې عموما د دې مقالې له ساحې څخه بهر دي، مګر لږترلږه دا ویل کیدی شي چې:

  • د نوي werf افعال باید د اسنادو له تازه کولو پرته خوشې نشي او په برعکس، په اسنادو کې هر ډول بدلون د werf نوې نسخه خوشې کول دي؛
  • پروژه خورا پراخه پراختیا لري: نوې نسخې په ورځ کې څو ځله خوشې کیدی شي؛
  • د اسنادو نوې نسخه سره د سایټ ځای پرځای کولو لپاره هر ډول لاسي عملیات لږترلږه ستړي دي؛
  • پروژه یو سیمانټیک چلند غوره کوي نسخه کول، د 5 ثبات چینلونو سره. د خوشې کولو پروسه د ثبات د زیاتوالي لپاره د چینلونو له لارې د نسخو په ترتیب سره تیریږي: له الفا څخه راک - سالډ؛
  • سایټ د روسیې ژبې نسخه لري، کوم چې "ژوند کوي او وده کوي" (د بیلګې په توګه، د هغې محتويات چې تازه شوي) د اصلي (یعنې انګلیسي ژبې) نسخې سره موازي.

د کارونکي څخه دا ټول "داخلي پخلنځي" پټولو لپاره، هغه ته یو څه وړاندیز کوي چې "یوازې کار کوي"، موږ وکړل جلا werf نصب او تازه کولو وسیله دی multiwerf. تاسو یوازې د خوشې کولو شمیره او د ثبات چینل مشخص کولو ته اړتیا لرئ چې تاسو یې کارولو ته چمتو یاست ، او ملټي ویرف به وګوري چې ایا په چینل کې نوې نسخه شتون لري او که اړتیا وي ډاونلوډ یې کړئ.

په ویب پاڼه کې د نسخې انتخاب مینو کې، د werf وروستۍ نسخې په هر چینل کې شتون لري. په ترتیب سره، د پته په واسطه werf.io/documentation د وروستي خپریدو لپاره د خورا مستحکم چینل نسخه خلاصیږي - دا د لټون انجنونو لخوا هم ترتیب شوی. د چینل لپاره اسناد په جلا پته شتون لري (د مثال په توګه، werf.io/v1.0-beta/documentation د بیټا ریلیز 1.0 لپاره).

په مجموع کې، سایټ لاندې نسخې شتون لري:

  1. روټ (د ډیفالټ په واسطه خلاصیږي)
  2. د هر ریلیز د هر فعال تازه چینل لپاره (د مثال په توګه، werf.io/v1.0-beta).

د یوې سایټ ځانګړي نسخه رامینځته کولو لپاره ، په عموم کې ، دا د دې کارولو تالیف کولو لپاره کافي دي جیکیلپه لارښود کې د چلولو له لارې /docs د werf ذخیره اړونده کمانډ (jekyll build)، د اړتیا وړ نسخه Git ټګ ته د بدلولو وروسته.

دا یوازې د دې اضافه کولو لپاره پاتې دي:

  • پخپله ګټه (werf) د مجلس لپاره کارول کیږي؛
  • د CI/CD پروسې د GitLab CI پر بنسټ جوړ شوي؛
  • او دا ټول، البته، په Kubernetes کې تیریږي.

دندې

اوس راځئ هغه دندې رامینځته کړو چې ټول تشریح شوي مشخصات په پام کې ونیسي:

  1. په هر تازه چینل کې د werf نسخه بدلولو وروسته په سایټ کې اسناد باید په اوتومات ډول نوي شي.
  2. د پرمختګ لپاره تاسو اړتیا لرئ ځینې وختونه وړتیا ولرئ د سایټ مخکتنې نسخې وګورئ.

سایټ باید د اړونده ګیټ ټاګونو څخه په کوم چینل کې د نسخې بدلولو وروسته بیا تنظیم شي ، مګر د عکس جوړولو په پروسه کې به موږ لاندې ب featuresې ترلاسه کړو:

  • له هغه وخته چې په چینلونو کې د نسخو لیست بدلیږي ، نو دا یوازې اړین دی چې د چینلونو لپاره سندونه بیا جوړ کړئ چیرې چې نسخه بدله شوې. په هرصورت، د هرڅه بیا رغول خورا ښه ندي.
  • د خپرونو لپاره د چینلونو سیټ ممکن بدل شي. په یو وخت کې ، د مثال په توګه ، ممکن په چینلونو کې نسخه د لومړني لاسرسي 1.1 خوشې کیدو څخه ډیر مستحکم نه وي ، مګر د وخت په تیریدو سره به څرګند شي - پدې حالت کې ، ایا تاسو په لاسي ډول مجلس بدل نه کړئ؟

دا دا معلومه شوه مجلس د خارجي معلوماتو په بدلولو پورې اړه لري.

پلي کول

د چلند غوره کول

په بدیل سره ، تاسو کولی شئ هر اړین نسخه په کوبرنیټس کې د جلا پوډ په توګه پرمخ وړئ. دا اختیار په کلستر کې د شیانو لوی شمیر معنی لري، کوم چې به د مستحکم ویرف ریلیز شمیر زیاتوالي سره وده وکړي. او دا، په بدل کې، ډیر پیچلي ساتنه معنی لري: هره نسخه خپل HTTP سرور لري، او د کوچني بار سره. البته، دا د سرچینو لوی لګښتونه هم لري.

موږ ورته لاره خپله کړه په یو عکس کې ټولې اړینې نسخې راټولول. د سایټ د ټولو نسخو تالیف شوي احصایې د NGINX سره په کانټینر کې موقعیت لري، او اړونده ځای پرځای کولو ته ټرافيک د NGINX Ingress له لارې راځي. یو ساده جوړښت - یو بې ریاسته غوښتنلیک - تاسو ته اجازه درکوي په اسانۍ سره د کوبرنیټس په کارولو سره ځای پرځای کول (د بار پورې اړه لري) اندازه کړئ.

د ډیر دقیق کیدو لپاره ، موږ دوه عکسونه راټول کوو: یو د تولید سرکټ لپاره ، دوهم د دیو سرکټ لپاره اضافي دی. اضافي عکس یوازې د اصلي سره یوځای په دیو سرکټ کې کارول کیږي (پیل شوی) او د بیاکتنې ژمنې څخه د سایټ نسخه لري ، او د دوی ترمینځ روټینګ د انګریس سرچینو په کارولو سره ترسره کیږي.

werf vs git کلون او هنري آثار

لکه څنګه چې مخکې یادونه وشوه، د دې لپاره چې د اسنادو د یوې ځانګړې نسخې لپاره د سایټ احصایه تولید کړئ، تاسو اړتیا لرئ چې د مناسب ذخیره کولو ټګ ته د بدلولو له لارې جوړ کړئ. تاسو کولی شئ دا د ذخیره کولو کلون کولو سره هم ترسره کړئ هرکله چې تاسو جوړ کړئ، د لیست څخه مناسب ټاګونه غوره کړئ. په هرصورت، دا یو پر ځای د منابعو ژور عملیات دی او سربیره پردې، د غیر معمولي لارښوونو لیکلو ته اړتیا لري ... بل جدي نیمګړتیا دا ده چې د دې طریقې سره د غونډو په جریان کې د یو څه ذخیره کولو لپاره هیڅ لاره نشته.

دلته د ویرف افادیت پخپله زموږ مرستې ته راځي ، پلي کوي سمارټ کیشینګ او تاسو ته د کارولو اجازه درکوي بهرني ذخیره. د ذخیره کولو څخه د کوډ اضافه کولو لپاره د werf کارول به د پام وړ جوړونه ګړندي کړي ، ځکه چې werf په لازمي ډول یو ځل ذخیره کلون کوي ​​او بیا یې اجرا کوي یوازې fetch که اړتیا وي. سربیره پردې ، کله چې د ذخیره کولو څخه ډیټا اضافه کول ، موږ کولی شو یوازې اړین لارښودونه وټاکو (زموږ په قضیه کې دا لارښود دی docs)، کوم چې به د پام وړ د اضافه معلوماتو مقدار کم کړي.

څنګه چې جیکیل یوه وسیله ده چې د جامد معلوماتو راټولولو لپاره ډیزاین شوې او په وروستي عکس کې اړتیا نلري، نو دا به منطقي وي werf artifactاو په وروستي انځور کې یوازې د تالیف پایله وارد کړئ.

موږ werf.yaml لیکو

نو، موږ پریکړه وکړه چې موږ به هره نسخه په جلا جلا هنر کې تالیف کړو. په هرصورت موږ موږ نه پوهیږو چې د دې اثارو څخه به د غونډې په جریان کې څومره وي، نو موږ نشو کولی د جوړونې ثابت ترتیب ولیکئ (په کلکه ووایو ، موږ لاهم کولی شو ، مګر دا به په بشپړ ډول مؤثره نه وي).

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 - د ویرف ریلیز نسخه باید په سایټ کې د ډیفالټ لخوا وښودل شي (دا تل اړین ندي چې د لوړې خوشې شمیرې لخوا اسناد ښکاره کړئ). بېلګه: 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 تاسو ته اجازه درکوي د پایپ لاین چلونو ترمینځ د جیکیل کیچ خوندي کړئ ، کوم چې د پام وړ د بیا راټولولو سرعت ګړندی کوي.

تاسو ممکن د فایل کارولو ته هم پام کړی وي releases.yml د YAML فایل دی چې د خوشې کولو ډاټا سره غوښتل شوي github.com (یو اثار چې د پایپ لاین اجرا کولو پرمهال ترلاسه کیږي). دا اړینه ده کله چې سایټ تالیف کړئ ، مګر د مقالې په شرایطو کې دا زموږ لپاره په زړه پوري دی ځکه چې دا د دې حالت پورې اړه لري یوازې د یو هنري اثارو بیا راټولول - د سایټ د ریښې نسخې یوه هنري اثار (دا په نورو آثارو کې اړتیا نلري).

دا د مشروط بیان په کارولو سره پلي کیږي if ټیمپلیټونه او ډیزاین ته لاړشئ {{ $Root.Files.Get "releases.yml" | sha256sum }} په مرحله کې پړاوونه. دا په لاندې ډول کار کوي: کله چې د ریښې نسخې لپاره هنري اثار جوړ کړئ (متغیر .Channel سره مساوي ده root) فایل هش releases.yml د ټولې مرحلې لاسلیک اغیزه کوي ، ځکه چې دا د ځواب ورکونکي دندې نوم برخه ده (پیرامیټ 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 -}}

ځکه لوپ به ډیری هنري اثار رامینځته کړي (موږ ورته امید لرو) ، دا اړینه ده چې د دوی ترمینځ جلا کوونکی په پام کې ونیول شي - ترتیب --- (د ترتیب د فایل ترکیب په اړه د نورو معلوماتو لپاره، وګورئ اسناد). لکه څنګه چې مخکې تعریف شوی، کله چې په لوپ کې ټیمپلیټ زنګ ووهئ، موږ د نسخې پیرامیټونه، یو آر ایل او د روټ شرایط انتقالوو.

په ورته ډول، مګر پرته له لوپ، موږ د "ځانګړو قضیو" لپاره د هنري نمونې نمونه وایو: د ریښې نسخې لپاره، او همدارنګه د بیاکتنې ژمنې نسخه:

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

اثار چمتو دي - دا د واردولو پیل کولو وخت دی!

وروستی عکس، په کوبرنیټس کې د چلولو لپاره ډیزاین شوی، یو منظم 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، مګر د دې لپاره د پالیسیو په واسطه پاکول په werf کې د ډاکر عکسونه د werf-dev عکس لپاره کار کوي ، موږ به یې پریږدو چې یوازې د روټ نسخې هنر سره جوړ شي (دا دمخه په هرصورت جوړ شوی دی) ، ترڅو د پایپ لاین جوړښت ساده کړي.

مجلس چمتو دی! راځئ چې CI/CD او مهم باریکیو ته لاړ شو.

په GitLab CI کې پایپ لاین او د متحرک جوړونې ځانګړتیاوې

کله چې جوړونه پرمخ وړئ موږ اړتیا لرو د چاپیریال متغیرونه تنظیم کړو چې په کې کارول کیږي werf.yaml. دا په REVIEW_SHA متغیر کې نه پلي کیږي، کوم چې موږ به د ګیټ هب هک څخه پایپ لاین زنګ وهلو پر مهال تنظیم کړو.

موږ به په باش سکریپټ کې اړین بهرني معلومات تولید کړو 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'

تاسو کولی شئ د داسې سکریپټ محصول وکاروئ ، د مثال په توګه ، د بش فنکشن کارول 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 پایپ لاین مرحلو په کارولو سره جوړ او ځای په ځای کړئ: جوړ او ځای په ځای کړئ. موږ پخپله پایپ لاین د GitHub werf ذخیره څخه د هکونو په کارولو سره پیل کوو (د مثال په توګه ، کله چې په GitHub کې ذخیره کې بدلونونه شتون ولري). د دوی لپاره ډاټا په برخه کې د GitLab پروژې ملکیتونو کې موندل کیدی شي د CI/CD ترتیبات -> پایپ لاین محرک، او بیا په GitHub کې ورته ویب بوک جوړ کړئ (ترتیبات -> ویب هکس).

د جوړولو مرحله به داسې ښکاري:

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_KUBE_CONTEXT)، او د لوپ چاپیریال تغیرات ترتیب کول (environment.name и environment.url)، چې بیا د هیلم چارټ ټیمپلیټونو کې کارول کیږي. موږ به د ټیمپلیټ مینځپانګې چمتو نه کړو، ځکه چې ... دلته د پوښتنې موضوع لپاره په زړه پورې هیڅ شی شتون نلري، مګر تاسو یې موندلی شئ د مقالې لپاره ذخیره.

وروستی لمس

څنګه چې د ویرف نسخې ډیری وختونه خپریږي ، نوي عکسونه به په مکرر ډول رامینځته شي ، او د ډاکر راجسټری به په دوامداره توګه وده وکړي. نو ځکه، دا اړینه ده چې د پالیسیو پراساس د اتوماتیک عکس پاکول تنظیم کړئ. دا کار کول خورا اسانه دي.

د پلي کولو لپاره تاسو اړتیا لرئ:

  • د پاکولو یو ګام اضافه کړئ .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

موږ دمخه دا ټول یو څه لوړ لیدلي دي - یوازې د دې پاکولو لپاره تاسو اړتیا لرئ لومړی د ډاکر راجسټری ته د نښه سره ننوتل چې د ډاکر راجسټری کې د عکسونو حذف کولو حق لري (په اوتومات ډول صادر شوی د GitLab CI ټاسک نښه نه کوي. داسې حقوق لري). نښه باید دمخه په GitLab کې رامینځته شي او ارزښت یې باید د چاپیریال متغیر کې مشخص شي WERF_IMAGES_CLEANUP_PASSWORD پروژه (CI/CD ترتیبات -> تغیرات).

د اړین مهالویش سره د پاکولو دنده اضافه کول په کې ترسره کیږي CI/CD ->
شیډولونه
.

دا دی: د ډاکر راجسټری کې یوه پروژه به نور په دوامداره توګه د نه کارول شوي عکسونو څخه وده وکړي.

د عملي برخې په پای کې ، اجازه راکړئ تاسو ته یادونه وکړم چې د مقالې بشپړ لیستونه په کې شتون لري Git:

نتيجه

  1. موږ د منطقي مجلس جوړښت ترلاسه کړ: په هر نسخه کې یو هنر.
  2. مجلس نړیوال دی او د لاسي بدلونونو ته اړتیا نلري کله چې د werf نوې نسخه خپره شي: په ویب پا onه کې اسناد په اوتومات ډول تازه کیږي.
  3. دوه عکسونه د مختلف شکلونو لپاره راټول شوي.
  4. دا په چټکۍ سره کار کوي، ځکه کیشینګ د امکان تر حده کارول کیږي - کله چې د werf نوې نسخه خپره شي یا د ګیټ هب هک د بیاکتنې ژمنې لپاره ویل کیږي ، یوازې د بدل شوي نسخې سره ورته اثار بیا رغول کیږي.
  5. د نه کارول شوي عکسونو حذف کولو په اړه فکر کولو ته اړتیا نشته: د ویرف پالیسیو سره سم پاکول به د ډاکر راجسټري په ترتیب کې وساتي.

موندنو

  • د werf کارول اسمبلۍ ته اجازه ورکوي چې پخپله د دواړو مجلسونو کیچ کولو او د بهرني ذخیره کولو سره کار کولو پر مهال د کیچ کولو له امله ګړندي کار وکړي.
  • د بهرني Git ذخیره کولو سره کار کول هر ځل د ټول ذخیره کلون کولو اړتیا له مینځه وړي یا د پیچلي اصلاح کولو منطق سره ویل بیا ایجادوي. werf یو کیچ کاروي او یوازې یو ځل کلونینګ کوي، او بیا یې کاروي fetch او یوازې کله چې اړتیا وي.
  • د جوړونې ترتیب فایل کې د ګو ټیمپلیټ کارولو وړتیا werf.yaml تاسو ته اجازه درکوي یو مجلس تشریح کړئ چې پایله یې په بهرني معلوماتو پورې اړه لري.
  • په ویرف کې د ماونټ کارول د پام وړ د هنري اثارو راټولول ګړندي کوي - د کیچ له امله ، کوم چې په ټولو پایپ لاینونو کې عام دی.
  • werf د پاکولو تنظیم کول اسانه کوي، کوم چې په ځانګړي ډول مهم دی کله چې په متحرک ډول جوړ شي.

PS

زموږ په بلاګ کې هم ولولئ:

سرچینه: www.habr.com

Add a comment