متحرڪ اسيمبلي ۽ ڊاڪر تصويرن جي ڊيپلائيشن werf سان استعمال ڪندي ورزن ٿيل دستاويزي سائيٽ جو مثال

اسان اڳ ۾ ئي اسان جي GitOps اوزار بابت هڪ ڀيرو کان وڌيڪ ڳالهايو آهي. werf، ۽ هن ڀيري اسان سائيٽ کي گڏ ڪرڻ ۾ پنهنجو تجربو حصيداري ڪرڻ چاهيون ٿا پاڻ منصوبي جي دستاويزن سان - werf.io (ان جو روسي نسخو آهي en.werf.io). هي هڪ عام جامد سائيٽ آهي، پر ان جي اسيمبليء ۾ دلچسپ آهي ته اهو هڪ متحرڪ نمبر نموني استعمال ڪندي ٺاهيو ويو آهي.

متحرڪ اسيمبلي ۽ ڊاڪر تصويرن جي ڊيپلائيشن werf سان استعمال ڪندي ورزن ٿيل دستاويزي سائيٽ جو مثال

سائيٽ جي جوڙجڪ جي nuances ۾ وڃو: سڀني نسخن لاء هڪ عام مينيو پيدا ڪرڻ، رليز جي باري ۾ معلومات سان صفحا، وغيره. - اسان نه ڪنداسين. ان جي بدران، اچو ته متحرڪ اسمبلي جي مسئلن ۽ خاصيتن تي ڌيان ڏيون ۽ ٿورڙو ان سان گڏ CI/CD پروسيس تي.

تعارف: سائيٽ ڪيئن ڪم ڪري ٿي

شروع ڪرڻ سان، werf دستاويزن ان جي ڪوڊ سان گڏ ذخيرو ٿيل آهي. هي ڪجهه ترقي جون گهرجون لاڳو ڪري ٿو جيڪي عام طور تي هن مضمون جي دائري کان ٻاهر آهن، پر گهٽ ۾ گهٽ اهو چئي سگهجي ٿو ته:

  • نون werf افعال کي دستاويزن کي اپڊيٽ ڪرڻ کان سواءِ جاري نه ڪيو وڃي ۽، ان جي برعڪس، دستاويزن ۾ ڪا به تبديلي werf جي نئين ورزن جي ڇڏڻ جو مطلب آهي؛
  • پروجيڪٽ ڪافي تيز ترقي ڪئي آهي: نوان نسخا هڪ ڏينهن ۾ ڪيترائي ڀيرا جاري ڪري سگھجن ٿيون؛
  • دستاويزن جي نئين ورزن سان سائيٽ کي ترتيب ڏيڻ لاءِ ڪي به دستي عمل گهٽ ۾ گهٽ مشڪل آهن؛
  • پروجيڪٽ هڪ سيمينٽڪ طريقو اختيار ڪري ٿو ورجن ڪرڻ، 5 استحڪام چينلز سان. رليز جي عمل ۾ چئنلن ذريعي ورجن جي ترتيب وار گذرڻ شامل آھي استحڪام کي وڌائڻ لاءِ: الفا کان وٺي راڪ سولڊ تائين؛
  • سائيٽ وٽ روسي-ٻولي جو نسخو آهي، جيڪو "زندگي ۽ ترقي ڪري ٿو" (يعني، جنهن جو مواد اپڊيٽ ڪيو ويو آهي) مکيه (يعني انگريزي-ٻولي) ورزن سان متوازي ۾.

صارف کان هي سڀ ”اندروني باورچی خانه“ لڪائڻ لاءِ ، هن کي ڪجهه پيش ڪري ٿو جيڪو ”صرف ڪم ڪري ٿو“ ، اسان ڪيو الڳ werf تنصيب ۽ تازه ڪاري اوزار - هي آهي multiwerf. توهان کي صرف رليز نمبر ۽ استحڪام چينل جي وضاحت ڪرڻ جي ضرورت آهي جيڪا توهان استعمال ڪرڻ لاءِ تيار آهيو، ۽ multiwerf چيڪ ڪندو ته ڇا چينل تي نئون ورزن آهي ۽ ضروري هجي ته ان کي ڊائون لوڊ ڪريو.

ويب سائيٽ تي ورزن جي چونڊ مينيو ۾، werf جا جديد نسخا هر چينل ۾ موجود آهن. ڊفالٽ طور، پتي طرفان werf.io/documentation جديد ترين رليز لاءِ سڀ کان وڌيڪ مستحڪم چينل جو نسخو کلي ٿو - اهو پڻ سرچ انجڻ پاران ترتيب ڏنل آهي. چينل لاءِ دستاويز الڳ ايڊريس تي موجود آهن (مثال طور، werf.io/v1.0-beta/documentation بيٽا رليز 1.0 لاءِ).

مجموعي طور تي، سائيٽ تي هيٺيان نسخا موجود آهن:

  1. روٽ (ڊفالٽ طور کلي ٿو)،
  2. هر رليز جي هر فعال اپڊيٽ چينل لاءِ (مثال طور، werf.io/v1.0-beta).

ھڪڙي سائيٽ جي ھڪڙي مخصوص ورزن کي ٺاھڻ لاء، عام طور تي، ان کي استعمال ڪندي گڏ ڪرڻ لاء ڪافي آھي Jekllڊاريڪٽري ۾ هلائڻ سان /docs репозитория werf соответствующую команду (jekyll build)، گهربل ورزن جي Git ٽيگ کي تبديل ڪرڻ کان پوء.

اهو صرف شامل ڪرڻ لاء رهي ٿو:

  • افاديت پاڻ (werf) اسيمبليء لاء استعمال ڪيو ويندو آهي؛
  • CI/CD عمل GitLab CI جي بنياد تي ٺهيل آهن؛
  • ۽ اهو سڀ ڪجهه، يقينا، Kubernetes ۾ هلندو آهي.

ڪمن

ھاڻي اچو ته ڪم ٺاھيون جيڪي سڀني بيان ڪيل خصوصيتن کي مدنظر رکي:

  1. ڪنهن به اپڊيٽ چينل تي ويرف ورزن کي تبديل ڪرڻ کان پوء документация на сайте должна автоматически обновляться.
  2. ترقي لاء توهان کي ڪڏهن ڪڏهن قابل ٿيڻ جي ضرورت آهي سائيٽ جا ڏيک ورجن ڏسو.

ڪنهن به چينل تي ورجن تبديل ڪرڻ کان پوءِ سائيٽ کي ٻيهر ٺهرايو وڃي لاڳاپيل گيٽ ٽيگ مان، پر تصوير ٺاهڻ جي عمل ۾ اسان کي هيٺيون خاصيتون ملنديون:

  • چينلن تي نسخن جي لسٽ تبديل ٿيڻ کان پوء، اهو صرف انهن چينلن لاء دستاويزن کي ٻيهر تعمير ڪرڻ ضروري آهي جتي نسخو تبديل ٿي چڪو آهي. آخرڪار، هر شيء کي ٻيهر تعمير ڪرڻ تمام سٺو ناهي.
  • رليز لاءِ چينلز جو سيٽ تبديل ٿي سگھي ٿو. ڪجهه وقت تي، مثال طور، چينلن تي ڪو نسخو نه هوندو ته ابتدائي رسائي 1.1 رليز کان وڌيڪ مستحڪم، پر وقت گذرڻ سان گڏ اهي ظاهر ٿيندا - انهي صورت ۾، توهان کي اسيمبليءَ کي دستي طور تبديل نه ڪرڻ گهرجي؟

اهو ظاهر ٿي ويو آهي اسيمبلي خارجي ڊيٽا کي تبديل ڪرڻ تي منحصر آهي.

عمل

هڪ طريقو چونڊڻ

متبادل طور تي، توھان ھلائي سگھوٿا ھر گھربل ورزن کي ڪبرنيٽس ۾ الڳ پوڊ طور. هي اختيار ڪلستر ۾ وڏي تعداد ۾ شيون شامل ڪري ٿو، جيڪي مستحڪم ورف رليز جي تعداد ۾ اضافو سان وڌندا. ۽ اهو، موڙ ۾، وڌيڪ پيچيده سار سنڀال جو مطلب آهي: هر نسخي جو پنهنجو HTTP سرور آهي، ۽ هڪ ننڍڙي لوڊ سان. يقينن، اهو پڻ وڌيڪ وسيلن جي قيمتن ۾ شامل آهي.

اسان به ساڳيو رستو اختيار ڪيو ھڪڙي تصوير ۾ سڀني ضروري نسخن کي گڏ ڪرڻ. سائيٽ جي سڀني نسخن جي مرتب ڪيل انگ اکر NGINX سان گڏ ڪنٽينر ۾ واقع آهن، ۽ لاڳاپيل ترتيب ڏيڻ واري ٽرئفڪ NGINX Ingress ذريعي اچي ٿي. هڪ سادي جوڙجڪ - هڪ بي رياست ايپليڪيشن - توهان کي آسانيءَ سان ڊيپلائيمينٽ اسڪيل ڪرڻ جي اجازت ڏئي ٿي (لوڊ تي منحصر) ڪبرنيٽس پاڻ استعمال ڪندي.

وڌيڪ صحيح هجڻ لاء، اسان ٻه تصويرون گڏ ڪري رهيا آهيون: هڪ پيداوار جي سرڪٽ لاء، ٻيو هڪ اضافي آهي ديو سرڪٽ لاء. اضافي تصوير استعمال ڪئي وئي آهي (شروع ٿيل) صرف ديو سرڪٽ تي مکيه هڪ سان گڏ ۽ سائيٽ جي ورزن تي مشتمل آهي نظرثاني ڪمٽ کان، ۽ انهن جي وچ ۾ روٽنگ ڪئي وئي آهي Ingress وسيلن کي استعمال ڪندي.

werf بمقابله گٽ کلون ۽ نموني

جيئن اڳ ۾ ئي ذڪر ڪيو ويو آهي، دستاويزن جي مخصوص ورزن لاءِ سائيٽ اسٽيٽڪس ٺاهڻ لاءِ، توهان کي مناسب ريپوزٽري ٽيگ ڏانهن سوئچ ڪندي تعمير ڪرڻ جي ضرورت آهي. توهان اهو پڻ ڪري سگهو ٿا مخزن کي ڪلون ڪندي هر دفعي توهان ٺاهيو، فهرست مان مناسب ٽيگ چونڊيو. تنهن هوندي به، هي هڪ انتهائي وسيلن جي آپريشن آهي ۽، ان کان علاوه، غير معمولي هدايتون لکڻ جي ضرورت آهي ... هڪ ٻيو سنگين نقصان اهو آهي ته هن طريقي سان اسيمبليء دوران ڪنهن به شيء کي ڪيش ڪرڻ جو ڪو طريقو ناهي.

هتي werf افاديت پاڻ اسان جي مدد لاء اچي ٿو، لاڳو ڪرڻ سمارٽ ڪيشنگ ۽ توهان کي استعمال ڪرڻ جي اجازت ڏئي ٿي ٻاهرين repositories. مخزن مان ڪوڊ شامل ڪرڻ لاءِ werf استعمال ڪندي خاص طور تي تعمير کي تيز ڪندو ، ڇاڪاڻ ته werf بنيادي طور تي هڪ ڀيرو مخزن کي ڪلون ڪري ٿو ۽ پوءِ عمل ڪري ٿو صرف fetch جيڪڏهن ضرورت هجي. اضافي طور تي، جڏهن مخزن مان ڊيٽا شامل ڪيو وڃي، اسان صرف ضروري ڊائريڪٽرن کي چونڊي سگھون ٿا (اسان جي صورت ۾ اها ڊاريڪٽري آهي. docs)، جيڪو خاص طور تي شامل ڪيل ڊيٽا جي مقدار کي گھٽائي ڇڏيندو.

جيئن ته Jekyll ھڪڙو اوزار آھي جيڪو جامد ڊيٽا کي گڏ ڪرڻ لاءِ ٺاھيو ويو آھي ۽ حتمي تصوير ۾ ان جي ضرورت ناھي، ان کي گڏ ڪرڻ منطقي ھوندو. werf artifact، ۽ آخري تصوير ۾ صرف تاليف جو نتيجو درآمد ڪريو.

Пишем werf.yaml

تنهن ڪري، اسان فيصلو ڪيو ته اسان هر نسخي کي الڳ الڳ ورف آرٽيفڪٽ ۾ گڏ ڪنداسين. تنهن هوندي به اسان اسان کي خبر ناهي ته اسيمبلي دوران انهن مان ڪيترا نمونا هوندا، تنهنڪري اسان هڪ مقرر ٿيل تعميراتي ترتيب نه لکي سگهون ٿا (سختي سان ڳالهائڻ، اسان اڃا به ڪري سگهون ٿا، پر اهو مڪمل طور تي اثرائتو نه ٿيندو).

werf توهان کي استعمال ڪرڻ جي اجازت ڏئي ٿي وڃو ٽيمپليٽس توهان جي ترتيب واري فائيل ۾ (werf.yaml)، ۽ اهو ممڪن بڻائي ٿو اڏام تي config ٺاهي خارجي ڊيٽا تي منحصر ڪري ٿو (جيڪو توهان کي گهرجي!). اسان جي صورت ۾ خارجي ڊيٽا نسخن ۽ رليز بابت معلومات آهي، جنهن جي بنياد تي اسان نموني جي گهربل تعداد گڏ ڪريون ٿا ۽ نتيجي ۾ اسان ٻه تصويرون حاصل ڪيون ٿا: 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 }}. پر توهان کي اهو سمجهڻ جي ضرورت آهي ته جڏهن نموني مان درآمد ڪندي، توهان کي ساڳئي نالن ڏانهن اشارو ڪرڻو پوندو.

جڏهن هڪ نموني بيان ڪندي، هيٺ ڏنل ويرف خاصيت استعمال ڪئي ويندي آهي: چڙهڻ. خدمت ڊاريڪٽري کي اشارو ڪندي چڙهڻ build_dir توھان کي اجازت ڏئي ٿو جيڪيل ڪيش کي پائپ لائن رن جي وچ ۾، جيڪو reassembly کي خاص طور تي تيز ڪري ٿو.

توھان شايد فائل جي استعمال کي پڻ محسوس ڪيو آھي releases.yml هڪ YAML فائل آهي جيڪا رليز ڊيٽا جي درخواست ڪئي وئي آهي github.com (هڪ نموني حاصل ڪئي وئي جڏهن پائپ لائن تي عمل ڪندي). اهو ضروري آهي ته سائيٽ کي گڏ ڪرڻ وقت، پر مضمون جي حوالي سان اهو اسان لاء دلچسپ آهي ڇو ته اهو ان جي حالت تي منحصر آهي. صرف هڪ نموني جي ٻيهر گڏ ڪرڻ - سائيٽ جي روٽ ورزن جو هڪ نمونو (ان جي ٻين نموني ۾ ضرورت ناهي).

اهو شرطي بيان استعمال ڪندي لاڳو ڪيو ويو آهي if وڃو ٽيمپليٽ ۽ ڊيزائن {{ $Root.Files.Get "releases.yml" | sha256sum }} اسٽيج ۾ مرحلا. اهو هن ريت ڪم ڪري ٿو: جڏهن روٽ ورزن لاءِ هڪ نمونو ٺاهيو (متغير .Channel جي برابر root) فائيل hash releases.yml سڄي اسٽيج جي دستخط کي متاثر ڪري ٿو، ڇاڪاڻ ته اهو جوابي ڪم جي نالي جو حصو آهي (پيراميٽر name). اهڙيء طرح، جڏهن تبديلي مواد فائل releases.yml لاڳاپيل artifact ٻيهر گڏ ڪيو ويندو.

مھرباني ڪري ٻاھرين مخزن سان ڪم ڪرڻ تي پڻ ڌيان ڏيو. مان هڪ artifact جي تصوير ۾ werf مخزنصرف ڊاريڪٽري شامل ڪئي وئي آهي /docs، ۽ منظور ٿيل پيٽرولن تي منحصر ڪري ٿو، گهربل ٽيگ جي ڊيٽا يا نظرثاني ڪمٽ کي فوري طور تي شامل ڪيو ويو آهي.

چينل ۽ رليز جي منتقل ٿيل ورزن جي آرٽيڪل جي وضاحت پيدا ڪرڻ لاءِ آرٽيڪل ٽيمپليٽ استعمال ڪرڻ لاءِ، اسان متغير تي هڪ لوپ منظم ڪريون ٿا. .WerfVersions в werf.yaml:

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

ڇاڪاڻ ته لوپ ڪيترن ئي نمونن کي ٺاهيندو (اسان کي اميد آهي ته)، اهو ضروري آهي ته انهن جي وچ ۾ جدا ڪندڙ حساب ۾ رکڻ ضروري آهي - تسلسل --- (وڌيڪ معلومات لاءِ ڪنفيگريشن فائيل نحو تي، ڏسو دستاويز). جيئن اڳ بيان ڪيو ويو آهي، جڏهن هڪ ٽيمپليٽ کي لوپ ۾ سڏين ٿا، اسان پيراميٽر ورزن، URL ۽ روٽ جي حوالي سان پاس ڪريون ٿا.

اهڙي طرح، پر بغير ڪنهن لوپ جي، اسان "خاص ڪيسن" لاءِ آرٽيڪل ٽيمپليٽ کي سڏين ٿا: روٽ ورزن لاءِ، انهي سان گڏ نظرثاني واري ڪمٽ مان ورزن:

{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root  | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root  | include "doc_artifact" }}
{{- end }}

مهرباني ڪري نوٽ ڪريو ته نظرثاني جي ڪمٽ لاءِ آرٽيڪل صرف ان صورت ۾ ٺاهي ويندي جڏهن متغير مقرر ڪيو وڃي .WerfReviewCommit.

نمونا تيار آهن - اهو درآمد شروع ڪرڻ جو وقت آهي!

آخري تصوير، Kubernetes تي هلائڻ لاءِ ٺهيل آهي، هڪ باقاعده NGINX آهي جنهن ۾ سرور جي ترتيب واري فائل شامل ڪئي وئي آهي. nginx.conf ۽ آرٽيڪل مان جامد. سائيٽ جي روٽ ورزن جي آرٽيڪل کان علاوه، اسان کي لوپ کي ورجائڻو پوندو متغير تي .WerfVersions چينل جا نمونا درآمد ڪرڻ ۽ ورجن جاري ڪرڻ لاءِ + آرٽيڪل جي نالي جي قاعدي تي عمل ڪريو جيڪو اسان اڳ ۾ اختيار ڪيو. جيئن ته هر هڪ نمونو ٻن ٻولين لاءِ سائيٽ جا ورجن محفوظ ڪري ٿو، ان ڪري اسان انهن کي ترتيب ڏنل جڳهن ۾ درآمد ڪريون ٿا.

آخري تصوير جي وضاحت werf-doc

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Setup /etc/nginx/nginx.conf"
    copy:
      content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/assets
    - /app/ru_site/assets
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_main_site
  to: /app/main_site/v{{ $Channel }}
  before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_ru_site
  to: /app/ru_site/v{{ $Channel }}
  before: setup
{{ end -}}

اضافي تصوير، جيڪا، مکيه هڪ سان گڏ، ديو سرڪٽ تي شروع ڪئي وئي آهي، سائيٽ جي صرف ٻه نسخن تي مشتمل آهي: جائزو وٺڻ واري ورزن مان ورزن ۽ سائيٽ جو روٽ ورزن (اتي عام اثاثا آهن ۽، جيڪڏهن توهان کي ياد آهي. ، ڊيٽا جاري ڪريو). اهڙيء طرح، اضافي تصوير صرف درآمد واري حصي ۾ مکيه کان مختلف هوندي (۽، يقينا، نالي ۾):

image: werf-dev
...
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{- if .WerfReviewCommit  }}
- artifact: doc-review
  add: /app/_main_site
  to: /app/main_site/review
  before: setup
- artifact: doc-review
  add: /app/_ru_site
  to: /app/ru_site/review
  before: setup
{{- end }}

جيئن مٿي بيان ڪيو ويو آهي، نظرثاني جي ڪمٽ لاءِ آرٽيڪل صرف تڏهن ٺاهيا ويندا جڏهن سيٽ ماحوليات متغير هلندي REVIEW_SHA. اهو ممڪن آهي ته werf-dev تصوير پيدا نه ٿئي جيڪڏهن ڪو ماحوليات متغير نه آهي REVIEW_SHA، پر ڪرڻ لاءِ پاليسين ذريعي صفائي werf ۾ Docker تصويرون werf-dev تصوير لاءِ ڪم ڪيون، اسان ان کي ڇڏينداسين صرف روٽ ورزن جي آرٽيڪل سان (اهو اڳ ۾ ئي ٺهيل آهي)، پائپ لائن جي جوڙجڪ کي آسان ڪرڻ لاءِ.

اسيمبلي تيار آهي! اچو ته CI/CD ۽ اهم nuances ڏانهن وڃو.

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'

توھان استعمال ڪري سگھوٿا اھڙي اسڪرپٽ جو آئوٽ پٽ، مثال طور، Bash فنڪشن استعمال ڪندي source.

هاڻي اچي ٿو مزيدار حصو. ٻنهي جي تعمير ۽ ترتيب ڏيڻ لاءِ ايپليڪيشن کي صحيح طريقي سان ڪم ڪرڻ لاءِ، ان کي يقيني بڻائڻ ضروري آهي werf.yaml هو ساڳيو گهٽ ۾ گهٽ هڪ پائپ لائن اندر. جيڪڏهن هن شرط کي پورو نه ڪيو ويو آهي، پوء انهن مرحلن جا دستخط جيڪي werf اسيمبليء جي دوران حساب ڪندا آهن ۽ مثال طور، تعیناتي، مختلف هوندا. هي هڪ مقرري جي غلطي کي ڏسندو، ڇاڪاڻ ته ... ترتيب ڏيڻ لاءِ گهربل تصوير غائب هوندي.

ٻين لفظن ۾، جيڪڏهن سائيٽ جي تصوير جي اسيمبليء دوران رليز ۽ نسخن بابت معلومات ساڳي آهي، ۽ مقرري جي وقت تي هڪ نئون نسخو جاري ڪيو ويو آهي ۽ ماحولياتي متغيرات مختلف قدر آهن، پوء تعیناتي غلطي سان ناڪام ٿيندي: سڀ کان پوء، نئين نسخي جي artifact اڃا تعمير نه ڪيو ويو آهي.

جيڪڏهن نسل 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 ۾ (سيٽنگون -> 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_KUBE_CONTEXT)، ۽ لوپ ماحول جي متغير کي ترتيب ڏيڻ (environment.name и environment.url)، جيڪي پوءِ هيلم چارٽ ٽيمپليٽس ۾ استعمال ٿيندا آهن. اسان ٽيمپليٽس جو مواد مهيا نه ڪنداسين، ڇاڪاڻ ته ... هتي سوال ۾ موضوع لاء ڪجهه به دلچسپ ناهي، پر توهان انهن کي ڳولي سگهو ٿا مضمونن لاءِ ذخيرو.

آخري رابطي

جيئن ته werf ورزن گهڻو ڪري جاري ڪيا ويا آهن، نيون تصويرون اڪثر ٺاهي وينديون آهن، ۽ ڊاکر رجسٽري مسلسل وڌندي ويندي. تنهن ڪري، اهو ضروري آهي ته پاليسين جي بنياد تي خودڪار تصوير صاف ڪرڻ کي ترتيب ڏيو. اهو ڪرڻ تمام آسان آهي.

لاڳو ڪرڻ لاء توهان کي ضرورت پوندي:

  • صفائي جي قدم کي شامل ڪريو .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 رجسٽري ۾ هڪ ٽوڪن سان جنهن کي ڊڪر رجسٽري ۾ تصويرون حذف ڪرڻ جا حق حاصل آهن (خودڪار طور تي جاري ڪيل GitLab CI ٽاسڪ ٽوڪن وٽ ناهي. اهڙا حق). ٽوڪن کي GitLab ۾ اڳ ۾ ئي ٺاھيو وڃي ۽ ان جي قيمت کي ماحولياتي متغير ۾ بيان ڪيو وڃي WERF_IMAGES_CLEANUP_PASSWORD منصوبو (CI/CD سيٽنگون -> متغير).

گهربل شيڊول سان صفائي جي ڪم کي شامل ڪيو ويو آهي CI/CD ->
اسڪينڊل
.

اھو اھو آھي: ڊاڪر رجسٽري ۾ ھڪڙو منصوبو ھاڻي مسلسل غير استعمال ٿيل تصويرن مان وڌندو.

عملي حصي جي آخر ۾، مون کي توهان کي ياد ڏيارڻ ڏيو ته مضمون مان مڪمل فهرستون موجود آهن Git:

نتيجي ۾

  1. اسان هڪ منطقي اسيمبلي جي جوڙجڪ حاصل ڪئي: هڪ نموني في نسخو.
  2. اسيمبلي آفاقي آهي ۽ دستي تبديلين جي ضرورت نه آهي جڏهن werf جا نوان ورزن جاري ڪيا وڃن: ويب سائيٽ تي دستاويز خودڪار طريقي سان اپڊيٽ ڪئي ويندي آهي.
  3. ٻه تصويرون مختلف شڪلين لاء گڏ ڪيا ويا آهن.
  4. اهو جلدي ڪم ڪري ٿو، ڇاڪاڻ ته ڪيشنگ جيترو ٿي سگهي استعمال ڪيو ويندو آهي - جڏهن werf جو نئون نسخو جاري ڪيو ويندو آهي يا هڪ GitHub ٿلهو کي جائزو وٺڻ لاء سڏيو ويندو آهي، صرف تبديل ٿيل ورزن سان لاڳاپيل نموني ٻيهر تعمير ڪيو ويندو آهي.
  5. غير استعمال ٿيل تصويرن کي حذف ڪرڻ بابت سوچڻ جي ضرورت ناهي: werf پاليسين جي مطابق صفائي ڊاکر رجسٽري کي ترتيب ۾ رکندي.

پهچڻ

  • werf استعمال ڪرڻ اسيمبليءَ کي جلدي ڪم ڪرڻ جي اجازت ڏئي ٿي ڇو ته پاڻ اسيمبليءَ جي ڪيشنگ ۽ ڪيشنگ جڏهن ٻاهرين مخزنن سان ڪم ڪندي آهي.
  • خارجي گٽ جي ذخيرن سان ڪم ڪرڻ هر دفعي پوري مخزن کي ڪلون ڪرڻ جي ضرورت کي ختم ڪري ٿو يا پيچيدگي واري اصلاح واري منطق سان ويل کي بحال ڪرڻ. werf هڪ ڪيش استعمال ڪري ٿو ۽ ڪلوننگ صرف هڪ ڀيرو ڪري ٿو، ۽ پوء استعمال ڪري ٿو fetch ۽ صرف جڏهن ضروري هجي.
  • تعمير جي ترتيب واري فائل ۾ Go ٽيمپليٽ استعمال ڪرڻ جي صلاحيت werf.yaml توهان کي هڪ اسيمبلي بيان ڪرڻ جي اجازت ڏئي ٿي جنهن جو نتيجو خارجي ڊيٽا تي منحصر آهي.
  • werf ۾ ماؤنٽ استعمال ڪرڻ سان خاص طور تي نموني جي گڏ ڪرڻ کي تيز ڪري ٿو - ڪيش جي ڪري، جيڪا سڀني پائپ لائنن لاء عام آهي.
  • werf صاف ڪرڻ کي ترتيب ڏيڻ آسان بڻائي ٿو، جيڪو خاص طور تي ضروري آهي جڏهن متحرڪ طور تي تعمير ڪيو وڃي.

پي ايس

اسان جي بلاگ تي پڻ پڙهو:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو