Dynamic los ua ke thiab xa tawm ntawm Docker dluab nrog werf siv piv txwv ntawm qhov chaw ua ntaub ntawv versioned

Peb twb tau tham txog peb cov cuab yeej GitOps ntau dua ib zaug. werf, thiab lub sijhawm no peb xav qhia peb cov kev paub hauv kev sib sau ua ke nrog cov ntaub ntawv ntawm qhov project nws tus kheej - wb. io (nws version ntawm Russia yog en.werf.io ib). Qhov no yog qhov chaw zoo li qub, tab sis nws lub rooj sib txoos yog nthuav nyob rau hauv uas nws yog tsim los siv ib tug dynamic naj npawb ntawm artifacts.

Dynamic los ua ke thiab xa tawm ntawm Docker dluab nrog werf siv piv txwv ntawm qhov chaw ua ntaub ntawv versioned

Nkag mus rau hauv lub nuances ntawm lub xaib qauv: tsim cov ntawv qhia zaub mov rau txhua qhov versions, nplooj ntawv nrog cov ntaub ntawv hais txog kev tshaj tawm, thiab lwm yam. - peb yuav tsis. Hloov chaw, cia peb tsom mus rau cov teeb meem thiab cov yam ntxwv ntawm kev sib dhos ua ke thiab me ntsis ntawm cov txheej txheem CI / CD.

Taw qhia: qhov chaw ua haujlwm li cas

Pib nrog, werf cov ntaub ntawv khaws cia nrog rau nws cov cai. Qhov no ua rau qee qhov kev xav tau ntawm kev txhim kho uas feem ntau dhau ntawm cov kab lus no, tab sis tsawg kawg nws tuaj yeem hais tias:

  • Cov haujlwm tshiab werf yuav tsum tsis txhob raug tso tawm yam tsis tau hloov kho cov ntaub ntawv thiab, qhov hloov pauv, kev hloov pauv hauv cov ntaub ntawv qhia txog qhov kev tso tawm tshiab ntawm werf;
  • Txoj haujlwm no muaj kev txhim kho loj heev: cov ntawv tshiab tuaj yeem tso tawm ob peb zaug hauv ib hnub;
  • Ib qho kev khiav hauj lwm phau ntawv los xa ib qhov chaw nrog cov ntaub ntawv tshiab yog qhov tsis txaus ntseeg;
  • Qhov project txais ib txoj hauv kev semantic versioning, nrog 5 stability channel. Cov txheej txheem tso tawm suav nrog kev ua ntu ntu ntawm cov qauv los ntawm cov channel hauv kev txiav txim kom muaj kev ruaj ntseg: los ntawm alpha mus rau pob zeb-khoom;
  • Lub tsev kawm ntawv muaj ib tug Lavxias teb sab-lus version, uas "nyob thiab tsim" (piv txwv li, cov ntsiab lus uas yog tshiab) nyob rau hauv parallel nrog lub ntsiab (ie, lus Askiv-lus).

Txhawm rau nkaum tag nrho cov "hauv chav ua noj" ntawm tus neeg siv, muab nws ib yam dab tsi uas "tsuas yog ua haujlwm", peb tau ua cais werf installation thiab hloov tshiab cuab yeej Yog multiwerf. Koj tsuas yog yuav tsum tau qhia tus lej tso tawm thiab cov channel ruaj khov uas koj npaj siv, thiab multiwerf yuav xyuas seb puas muaj ib qho tshiab ntawm cov channel thiab rub tawm yog tias tsim nyog.

Hauv cov ntawv qhia zaub mov xaiv version ntawm lub vev xaib, qhov tseeb versions ntawm werf muaj nyob rau hauv txhua channel. Los ntawm lub neej ntawd, los ntawm qhov chaw nyob werf.io/documentation cov version ntawm cov channel ruaj khov tshaj plaws rau qhov tseeb tso tawm qhib - nws kuj yog indexed los ntawm kev tshawb fawb xyaw. Cov ntaub ntawv rau cov channel muaj nyob rau ntawm qhov chaw nyob sib cais (piv txwv li, werf.io/v1.0-beta/documentation rau beta tso tawm 1.0).

Nyob rau hauv tag nrho, lub site muaj cov nram qab no versions muaj:

  1. hauv paus (qhib los ntawm lub neej ntawd),
  2. rau txhua qhov kev hloov kho tshiab ntawm txhua qhov kev tso tawm (piv txwv li, werf.io/v1.0-beta).

Txhawm rau tsim kom muaj ib lub vev xaib tshwj xeeb, feem ntau, nws txaus los sau nws siv Jekylllos ntawm kev khiav hauv phau ntawv qhia /docs werf repository coj cov lus txib (jekyll build), tom qab hloov mus rau Git tag ntawm qhov xav tau version.

Nws tsuas yog tseem ntxiv qhov ntawd:

  • tus nqi hluav taws xob nws tus kheej (werf) yog siv los ua ke;
  • Cov txheej txheem CI / CD yog tsim los ntawm GitLab CI;
  • thiab tag nrho cov no, tau kawg, khiav hauv Kubernetes.

paub tab

Tam sim no cia peb tsim cov haujlwm uas coj mus rau hauv tus account tag nrho cov lus piav qhia tshwj xeeb:

  1. Tom qab hloov lub werf version ntawm txhua qhov hloov tshiab channel cov ntaub ntawv ntawm lub xaib yuav tsum tau hloov kho tshiab.
  2. Rau kev txhim kho koj yuav tsum muaj peev xwm qee zaum saib ua ntej versions ntawm lub site.

Lub vev xaib yuav tsum tau muab rov ua dua tom qab hloov pauv ntawm ib qho channel los ntawm Git tags, tab sis nyob rau hauv tus txheej txheem ntawm kev tsim cov duab peb yuav tau txais cov nram qab no nta:

  • Txij li thaum daim ntawv teev cov versions ntawm cov kev hloov pauv, tsuas yog cov ntaub ntawv rau cov channel uas cov version tau hloov yuav tsum tau rov tsim dua. Tom qab tag nrho, rov tsim dua txhua yam tsis zoo heev.
  • Cov txheej txheem ntawm kev tso tawm tuaj yeem hloov pauv. Nyob rau qee lub sijhawm, piv txwv li, tej zaum yuav tsis muaj ib qho version ntawm cov channel ruaj khov dua li qhov kev nkag mus rau 1.1 thaum ntxov, tab sis dhau sij hawm lawv yuav tshwm sim - qhov no, koj yuav tsum tsis txhob hloov lub rooj sib txoos manually?

Nws hloov tawm ntawd kev sib dhos nyob ntawm kev hloov cov ntaub ntawv sab nraud.

Kev siv

Xaiv ib txoj hauv kev

Xwb, koj tuaj yeem khiav txhua qhov yuav tsum tau ua raws li cais cais hauv Kubernetes. Qhov kev xaiv no txhais tau hais tias muaj ntau yam khoom hauv pawg, uas yuav loj hlob nrog rau qhov nce ntawm qhov ruaj khov werf tso tawm. Thiab qhov no, nyob rau hauv lem, implies ntau complex txij nkawm: txhua version muaj nws tus kheej HTTP server, thiab nrog ib tug me me load. Ntawm chav kawm, qhov no kuj suav nrog cov nqi peev nyiaj ntau dua.

Peb coj tib txoj kev assembling tag nrho cov tsim nyog versions nyob rau hauv ib daim duab. Cov kev sib sau ua ke ntawm txhua qhov chaw ntawm qhov chaw nyob hauv ib lub thawv nrog NGINX, thiab kev khiav mus rau qhov kev xa mus los ntawm NGINX Ingress. Ib qho qauv yooj yim - daim ntawv thov tsis muaj neeg nyob - tso cai rau koj yooj yim teev Kev xa tawm (nyob ntawm qhov thauj khoom) siv Kubernetes nws tus kheej.

Txhawm rau kom meej meej, peb tab tom sau ob daim duab: ib qho rau cov khoom siv hluav taws xob, qhov thib ob yog ib qho ntxiv rau cov dev circuit. Cov duab ntxiv yog siv (launched) tsuas yog nyob rau hauv lub dev Circuit Court ua ke nrog lub ntsiab thiab muaj cov version ntawm lub xaib los ntawm kev tshuaj xyuas, thiab routing ntawm lawv yog ua los ntawm Ingress cov peev txheej.

werf vs git clone thiab artifacts

Raws li twb tau hais lawm, txhawm rau tsim kom muaj qhov chaw zoo li qub rau ib qho tshwj xeeb ntawm cov ntaub ntawv, koj yuav tsum tau tsim los ntawm kev hloov mus rau qhov tsim nyog repository tag. Koj tuaj yeem ua qhov no los ntawm cloning lub repository txhua zaus koj tsim, xaiv cov cim npe tsim nyog los ntawm ib daim ntawv teev npe. Txawm li cas los xij, qhov no yog kev ua haujlwm siv nyiaj ntau heev thiab, ntxiv rau, yuav tsum tau sau cov lus qhia tsis tseem ceeb ... Lwm qhov tsis zoo yog tias nrog txoj hauv kev no tsis muaj txoj hauv kev los cache ib yam dab tsi thaum lub rooj sib txoos.

Ntawm no lub werf utility nws tus kheej tuaj rau peb pab, siv ntse caching thiab tso cai rau koj siv sab nraud repositories. Siv werf ntxiv cov cai los ntawm lub chaw cia khoom yuav ua rau kom muaj kev tsim, vim werf yeej tseem ceeb clones lub repository ib zaug thiab ces executes tsuas fetch yog tias tsim nyog. Tsis tas li ntawd, thaum ntxiv cov ntaub ntawv los ntawm qhov chaw cia khoom, peb tuaj yeem xaiv tsuas yog cov npe tsim nyog (hauv peb cov ntaub ntawv no yog phau ntawv teev npe. docs), uas yuav txo tau tus nqi ntawm cov ntaub ntawv ntxiv.

Txij li Jekyll yog ib qho cuab yeej tsim los rau kev sau cov ntaub ntawv zoo li qub thiab tsis xav tau hauv daim duab kawg, nws yuav yog qhov tsim nyog los suav nrog hauv werf artifact, thiab mus rau hauv daim duab kawg import tsuas yog muab tso ua ke tshwm sim.

Peb sau werf.yaml

Yog li, peb txiav txim siab tias peb yuav suav txhua lub version hauv ib qho khoom siv werf cais. Txawm li cas los peb peb tsis paub tias muaj pes tsawg ntawm cov khoom qub no yuav muaj thaum lub rooj sib txoos, yog li peb tsis tuaj yeem sau ib qho kev teeb tsa ruaj khov (hais nruj me ntsis, peb tseem tuaj yeem ua tau, tab sis nws yuav tsis ua haujlwm tag nrho).

werf tso cai rau koj siv Mus rau templates hauv koj cov ntaub ntawv configuration (werf.yaml), thiab qhov no ua rau nws ua tau tsim config ntawm ya nyob ntawm cov ntaub ntawv sab nraud (qhov koj xav tau!). Cov ntaub ntawv sab nraud nyob rau hauv peb rooj plaub yog cov ntaub ntawv hais txog versions thiab tso tawm, nyob rau hauv lub hauv paus ntawm uas peb sau tus yuav tsum tau ntawm cov artifacts thiab yog li ntawd peb tau txais ob daim duab: werf-doc ΠΈ werf-dev khiav ntawm cov circuits sib txawv.

Cov ntaub ntawv sab nraud yog dhau los ntawm ib puag ncig hloov pauv. Ntawm no yog lawv cov composition:

  • RELEASES - ib kab nrog cov npe ntawm kev tshaj tawm thiab cov qauv tam sim no ntawm werf, nyob rau hauv daim ntawv ntawm qhov chaw sib cais cov npe ntawm qhov tseem ceeb hauv hom <ΠΠžΠœΠ•Π _Π Π•Π›Π˜Π—Π>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>... Piv txwv: 1.0%v1.0.4-beta.20
  • CHANNELS - ib kab nrog cov npe ntawm cov channel thiab cov sib txuas tam sim no ntawm werf, nyob rau hauv daim ntawv ntawm qhov chaw sib cais cov npe ntawm cov txiaj ntsig hauv hom <ΠšΠΠΠΠ›>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>... Piv txwv: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION - werf tso tawm version kom pom los ntawm lub neej ntawd ntawm lub xaib (nws tsis yog ib txwm tsim nyog los tso saib cov ntaub ntawv los ntawm tus lej tshaj tawm tshaj tawm). Piv txwv: v1.0.4-beta.20
  • REVIEW_SHA - hash ntawm kev tshuaj xyuas cog lus los ntawm qhov koj xav tau los tsim cov version rau lub voj voog xeem.

Cov kev hloov pauv no yuav tau sau rau hauv GitLab CI pipeline, thiab yuav ua li cas raws nraim sau hauv qab no.

Ua ntej tshaj plaws, kom yooj yim, peb txhais hauv werf.yaml Mus rau template variables, assigns lawv qhov tseem ceeb los ntawm ib puag ncig variables:

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

Cov lus piav qhia ntawm cov khoom cuav rau kev sau cov ntawv zoo li qub ntawm lub xaib feem ntau yog tib yam rau txhua qhov peb xav tau (suav nrog tsim cov hauv paus version, nrog rau cov version rau dev circuit). Yog li ntawd, peb yuav txav nws mus rau hauv ib qho kev thaiv cais siv cov haujlwm define - rau kev siv rov qab siv dua include. Peb yuav dhau qhov kev sib cav hauv qab no rau tus qauv:

  • Version - generated version (tag lub npe);
  • Channel - lub npe ntawm qhov hloov tshiab channel uas cov khoom cuav raug tsim tawm;
  • Commit - cog lus hash, yog tias cov khoom cuav raug tsim los rau kev tshuaj xyuas;
  • ntsiab lus.

Artifact Template Description

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

Lub npe artifact yuav tsum yog ib yam. Peb tuaj yeem ua tiav qhov no, piv txwv li, los ntawm kev ntxiv lub npe channel (tus nqi ntawm qhov sib txawv .Channel) raws li lub ntsiab lus ntawm lub npe ntawm artifact: artifact: doc-{{ .Channel }}. Tab sis koj yuav tsum nkag siab tias thaum importing ntawm artifacts, koj yuav tsum tau xa mus rau tib lub npe.

Thaum piav txog ib qho khoom qub, cov yeeb yam hauv qab no yog siv: txhim kho. Mounting qhia txog kev pabcuam build_dir tso cai rau koj txuag lub Jekyll cache ntawm cov raj xa dej, uas tseem ceeb speeds reassembly.

Tej zaum koj kuj tau pom kev siv cov ntaub ntawv releases.yml yog YAML cov ntaub ntawv nrog tso tawm cov ntaub ntawv thov los ntawm github.com (ib qho khoom qub tau txais thaum ua tiav lub raj xa dej). Nws yog qhov xav tau thaum sau lub xaib, tab sis nyob rau hauv cov ntsiab lus ntawm tsab xov xwm nws nthuav rau peb vim nws nyob ntawm nws lub xeev. reassembly ntawm tsuas yog ib tug artifact - ib qho khoom cuav ntawm lub hauv paus version ntawm lub xaib (nws tsis xav tau hauv lwm yam khoom cuav).

Qhov no yog ua los ntawm kev siv cov lus qhia if Mus rau templates thiab designs {{ $Root.Files.Get "releases.yml" | sha256sum }} hauv theem theem. Nws ua haujlwm raws li hauv qab no: thaum tsim cov khoom qub rau cov hauv paus version (kuj kuj sib txawv .Channel sib npaug root) file hash releases.yml cuam ​​tshuam rau kev kos npe ntawm tag nrho cov theem, vim nws yog ib feem ntawm lub npe ntawm Ansible ua hauj lwm (parameter name). Yog li, thaum hloov cov ntsiab lus ntaub ntawv releases.yml cov khoom sib thooj yuav raug muab rov ua dua.

Thov kuj xyuam xim rau kev ua hauj lwm nrog ib tug sab nraud repository. Nyob rau hauv daim duab ntawm ib tug artifact los ntawm werf repository, tsuas yog cov ntawv qhia ntxiv /docs, thiab nyob ntawm qhov tsis dhau dhau, cov ntaub ntawv ntawm qhov xav tau lossis kev tshuaj xyuas tau raug ntxiv tam sim ntawd.

Txhawm rau siv cov duab kos duab los tsim cov lus piav qhia ntawm cov khoom qub ntawm cov hloov pauv ntawm cov channel thiab tso tawm, peb npaj lub voj voog ntawm qhov sib txawv. .WerfVersions Π² werf.yaml:

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

Vim lub voj yuav tsim ob peb artifacts (peb cia siab li ntawd), nws yog tsim nyog los coj mus rau hauv tus account lub separator ntawm lawv - qhov sib lawv liag. --- (Yog xav paub ntxiv txog kev teeb tsa cov ntaub ntawv syntax, saib cov ntaub ntawv). Raws li tau hais ua ntej, thaum hu rau tus qauv hauv ib lub voj, peb dhau qhov kev txwv tsis pub dhau, URL thiab cov ntsiab lus hauv paus.

Ib yam li ntawd, tab sis tsis muaj lub voj voog, peb hu rau cov qauv kos duab rau "cov xwm txheej tshwj xeeb": rau lub hauv paus version, nrog rau cov version los ntawm kev tshuaj xyuas:

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

Thov nco ntsoov tias cov khoom qub rau kev tshuaj xyuas kev cog lus tsuas yog tsim yog tias qhov hloov pauv tau teeb tsa .WerfReviewCommit.

Cov artifacts yog npaj txhij - nws yog lub sij hawm los pib importing!

Daim duab kawg, tsim los khiav ntawm Kubernetes, yog NGINX ib txwm muaj nrog cov ntaub ntawv teeb tsa server ntxiv nginx.conf thiab static los ntawm artifacts. Ntxiv nrog rau cov khoom cuav ntawm lub hauv paus version ntawm qhov chaw, peb yuav tsum rov ua lub voj voog ntawm qhov sib txawv .WerfVersions xa cov khoom cuav ntawm cov channel thiab tso tawm cov qauv + ua raws li cov cai kos npe kos npe uas peb tau txais ua ntej. Txij li thaum txhua cov khoom ntiag tug khaws cov qauv ntawm lub xaib rau ob hom lus, peb muab lawv tso rau hauv qhov chaw muab los ntawm kev teeb tsa.

Kev piav qhia ntawm daim duab kawg 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 -}}

Cov duab ntxiv, uas, ua ke nrog ib qho tseem ceeb, yog launched rau ntawm lub dev Circuit Court, tsuas muaj ob lub versions ntawm lub site: lub version los ntawm kev tshuaj ntsuam xyuas thiab lub hauv paus version ntawm lub site (muaj cov cuab tam dav thiab, yog hais tias koj nco ntsoov. , tso tawm cov ntaub ntawv). Yog li, cov duab ntxiv yuav txawv ntawm qhov tseem ceeb tsuas yog hauv ntu ntshuam (thiab, ntawm chav kawm, hauv lub npe):

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

Raws li tau sau tseg saum toj no, cov khoom cuav rau kev tshuaj xyuas kev cog lus yuav raug tsim tsuas yog thaum lub teeb ib puag ncig hloov pauv tau khiav REVIEW_SHA. Nws yuav muaj peev xwm tsis tsim cov duab werf-dev txhua yog tias tsis muaj ib puag ncig hloov pauv REVIEW_SHA, tab sis nyob rau hauv thiaj li yuav ntxuav los ntawm txoj cai Docker dluab nyob rau hauv werf ua hauj lwm rau lub werf-dev duab, peb yuav cia nws yuav tsum tau ua tsuas yog nrog lub hauv paus version artifact (nws twb tau ua lawm), kom yooj yim rau lub pipeline qauv.

Lub rooj sib txoos yog npaj txhij! Cia peb txav mus rau CI / CD thiab cov nuances tseem ceeb.

Pipeline hauv GitLab CI thiab cov yam ntxwv ntawm kev tsim kom muaj zog

Thaum khiav qhov tsim peb yuav tsum teeb tsa ib puag ncig hloov pauv siv hauv werf.yaml. Qhov no tsis siv rau REVIEW_SHA qhov sib txawv, uas peb yuav teeb tsa thaum hu xov tooj los ntawm GitHub nuv.

Peb yuav tsim cov ntaub ntawv tsim nyog sab nraud hauv Bash tsab ntawv generate_artifacts, uas yuav tsim ob GitLab pipeline artifacts:

  • cov ntaub ntawv releases.yml nrog cov ntaub ntawv tso tawm,
  • cov ntaub ntawv common_envs.sh, muaj cov kev hloov pauv ib puag ncig kom raug xa tawm.

Cov ntaub ntawv txheem generate_artifacts koj yuav pom hauv peb repositories nrog piv txwv. Kev txais cov ntaub ntawv nws tus kheej tsis yog cov ntsiab lus ntawm tsab xov xwm, tab sis cov ntaub ntawv common_envs.sh tseem ceeb rau peb, vim kev ua haujlwm ntawm werf nyob ntawm nws. Ib qho piv txwv ntawm nws cov ntsiab lus:

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'

Koj tuaj yeem siv qhov tso zis ntawm cov ntawv sau, piv txwv li, siv Bash muaj nuj nqi source.

Tam sim no los ntawm kev lom zem. Txhawm rau kom ob qho tib si tsim thiab xa tawm daim ntawv thov ua haujlwm kom raug, nws yog ib qho tsim nyog los xyuas kom meej tias werf.yaml yog tib yam tsawg kawg hauv ib lub raj xa dej. Yog tias qhov xwm txheej no tsis tau ntsib, ces kos npe ntawm cov theem uas werf suav thaum lub rooj sib txoos thiab, piv txwv li, kev xa tawm, yuav txawv. Qhov no yuav ua rau muaj kev ua yuam kev, vim ... daim duab xav tau rau kev xa tawm yuav ploj mus.

Nyob rau hauv lwm yam lus, yog hais tias thaum lub sij hawm sib sau ua ke ntawm lub site duab cov ntaub ntawv hais txog kev tso tawm thiab versions yog tib yam, thiab thaum lub sij hawm ntawm deploy ib tug tshiab version raug tso tawm thiab ib puag ncig variables muaj ntau yam tseem ceeb, ces lub deployment yuav ua tsis tau tejyam: tom qab tag nrho, lub artifact ntawm lub tshiab version tseem tsis tau tsim.

Yog tiam werf.yaml nyob ntawm cov ntaub ntawv sab nraud (piv txwv li, cov npe ntawm cov qauv tam sim no, zoo li hauv peb rooj plaub), tom qab ntawd cov ntaub ntawv muaj pes tsawg leeg thiab cov txiaj ntsig ntawm cov ntaub ntawv no yuav tsum tau sau tseg hauv cov raj xa dej. Qhov no yog qhov tseem ceeb tshwj xeeb tshaj yog tias cov kev txwv sab nraud hloov ntau zaus.

Peb yuav txais thiab sau cov ntaub ntawv sab nraud ntawm thawj theem ntawm cov kav dej hauv GitLab (Ua ntej) thiab xa lawv mus ntxiv rau hauv daim ntawv GitLab CI artifact. Qhov no yuav tso cai rau koj khiav thiab rov pib ua haujlwm hauv kav dej (tsim, xa tawm, ntxuav) nrog tib lub teeb tsa hauv werf.yaml.

Cov ntsiab lus ntawm theem Ua ntej ntaub ntawv .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

Tom qab ntes cov ntaub ntawv sab nraud hauv cov khoom cuav, koj tuaj yeem tsim thiab xa siv tus qauv GitLab CI cov kav dej theem: Tsim thiab xa tawm. Peb tso lub raj xa dej nws tus kheej siv hooks los ntawm werf GitHub repository (piv txwv li, thaum muaj kev hloov pauv hauv GitHub repository). Cov ntaub ntawv rau lawv tuaj yeem pom hauv GitLab qhov project cov khoom hauv ntu CI/CD Chaw -> Pipeline triggers, thiab tom qab ntawd tsim cov Webhook sib xws hauv GitHub (Chaw -> Webhooks).

Kev tsim theem yuav zoo li no:

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 yuav ntxiv ob yam khoom qub los ntawm theem mus rau theem tsim Ua ntej, yog li peb xa tawm cov hloov pauv nrog cov ntaub ntawv npaj cov ntaub ntawv siv tus tsim source common_envs.sh. Peb pib tsim theem nyob rau hauv txhua rooj plaub, tshwj tsis yog rau kev tso lub raj xa dej raws li lub sijhawm. Raws li lub sijhawm teem tseg, peb yuav khiav lub raj xa dej rau kev tu - qhov no tsis tas yuav tsum ua kev sib dhos.

Nyob rau theem xa tawm, peb yuav piav txog ob txoj haujlwm - cais rau kev xa mus rau kev tsim khoom thiab cov khoom siv hluav taws xob, siv YAML template:

.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

Cov dej num tseem ceeb sib txawv tsuas yog qhia txog cov ntsiab lus hauv pawg uas werf yuav tsum ua qhov kev xa tawm (WERF_KUBE_CONTEXT), thiab teeb tsa lub voj voog ib puag ncig hloov pauv (environment.name ΠΈ environment.url), uas tom qab ntawd siv rau hauv Helm chart templates. Peb yuav tsis muab cov ntsiab lus ntawm cov qauv, vim tias ... tsis muaj ib yam dab tsi nthuav rau lub ncauj lus nug, tab sis koj tuaj yeem pom lawv hauv repositories rau tsab xov xwm.

kov kawg

Txij li thaum werf versions raug tso tawm ntau zaus, cov duab tshiab yuav raug tsim ntau zaus, thiab Docker Registry yuav loj tuaj. Yog li ntawd, nws yog ib qho tsim nyog los teeb tsa cov duab tsis siv neeg tu raws li cov cai. Nws yooj yim heev ua.

Txhawm rau siv koj yuav xav tau:

  • Ntxiv ib kauj ruam tu rau .gitlab-ci.yml;
  • Ntxiv ib ntus ua tiav ntawm kev ua haujlwm tu;
  • Teeb tsa ib puag ncig hloov pauv nrog lub cim sau nkag.

Ntxiv ib theem tu rau .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

Peb twb pom yuav luag txhua qhov no me ntsis siab dua - tsuas yog txhawm rau ntxuav nws koj yuav tsum xub nkag mus rau Docker Registry nrog lub token uas muaj cai tshem tawm cov duab hauv Docker Registry (qhov tso tawm GitLab CI ua haujlwm tsis zoo. muaj cai li ntawd). Lub token yuav tsum tau tsim nyob rau hauv GitLab ua ntej thiab nws tus nqi yuav tsum tau teev nyob rau hauv ib puag ncig sib txawv WERF_IMAGES_CLEANUP_PASSWORD peb tes num (CI/CD Settings -> Variables).

Ntxiv ib txoj haujlwm tu nrog lub sijhawm xav tau yog ua tiav hauv CI/CD ->
Cov sijhawm
.

Qhov ntawd yog nws: ib qhov project hauv Docker Registry yuav tsis tas li loj hlob los ntawm cov duab tsis siv.

Thaum kawg ntawm qhov ua tau zoo, cia kuv ceeb toom rau koj tias tag nrho cov npe los ntawm kab lus muaj nyob hauv Cia li mus:

tshwm sim

  1. Peb tau txais cov qauv kev sib sau ua ke: ib qho khoom cuav rau ib qho version.
  2. Lub rooj sib txoos yog universal thiab tsis tas yuav hloov phau ntawv hloov thaum tshiab versions ntawm werf raug tso tawm: cov ntaub ntawv ntawm lub vev xaib tau hloov kho tshiab.
  3. Ob daim duab tau sib sau ua ke rau qhov sib txawv contours.
  4. Nws ua haujlwm sai, vim Caching yog siv ntau li ntau tau - thaum ib tug tshiab version ntawm werf raug tso tawm los yog ib tug GitHub nuv yog hu rau ib tug tshuaj ntsuam xyuas, tsuas yog cov khoom sib thooj nrog cov hloov version yog rebuilt.
  5. Tsis tas yuav xav txog kev rho tawm cov duab tsis siv: kev tu raws li werf txoj cai yuav ua rau Docker Registry nyob rau hauv kev txiav txim.

tshawb pom

  • Siv werf tso cai rau lub rooj sib txoos ua haujlwm sai vim yog caching ntawm ob lub rooj sib txoos nws tus kheej thiab caching thaum ua haujlwm nrog cov chaw cia sab nraud.
  • Ua haujlwm nrog cov chaw cia khoom sab nraud Git tshem tawm qhov xav tau los clone tag nrho cov chaw cia khoom txhua lub sijhawm lossis rov tsim lub log nrog kev ua kom zoo dua qub. werf siv lub cache thiab ua lub cloning ib zaug, thiab tom qab ntawd siv fetch thiab tsuas yog thaum tsim nyog.
  • Muaj peev xwm siv Go templates hauv cov ntaub ntawv teeb tsa werf.yaml tso cai rau koj piav qhia txog kev sib dhos uas nws qhov tshwm sim nyob ntawm cov ntaub ntawv sab nraud.
  • Kev siv mount nyob rau hauv werf ho ceev ceev cov khoom ntawm artifacts - vim lub cache, uas yog ib txwm rau tag nrho cov pipelines.
  • werf ua kom yooj yim rau kev teeb tsa kev ntxuav, uas yog qhov tseem ceeb tshwj xeeb tshaj yog thaum lub tsev dynamically.

PS

Nyeem kuj ntawm peb blog:

Tau qhov twg los: www.hab.com

Ntxiv ib saib