ʻO ka hui ikaika a me ka hoʻolālā ʻana o nā kiʻi Docker me werf me ka hoʻohana ʻana i ka laʻana o kahi pūnaewele palapala i hoʻololi ʻia

Ua kamaʻilio mua mākou e pili ana i kā mākou mea hana GitOps ma mua o hoʻokahi. werf, a i kēia manawa makemake mākou e kaʻana like i kā mākou ʻike i ka hui ʻana i ka pūnaewele me nā palapala o ka papahana ponoʻī - werf.io (ʻo kāna mana Lūkini en.werf.io). He paena static maʻamau kēia, akā hoihoi kona hui ʻana no ka mea i kūkulu ʻia me ka hoʻohana ʻana i ka helu dynamic o nā mea hana.

ʻO ka hui ikaika a me ka hoʻolālā ʻana o nā kiʻi Docker me werf me ka hoʻohana ʻana i ka laʻana o kahi pūnaewele palapala i hoʻololi ʻia

E hele i nā nuances o ka hoʻolālā pūnaewele: hana i kahi papa kuhikuhi maʻamau no nā mana āpau, nā ʻaoʻao me ka ʻike e pili ana i nā hoʻokuʻu, etc. - ʻaʻole mākou e hana. Akā, e noʻonoʻo kākou i nā pilikia a me nā hiʻohiʻona o ka hui ikaika a me ka liʻiliʻi o nā kaʻina CI/CD.

Hoʻomaka: pehea ka hana o ka pūnaewele

No ka hoʻomaka ʻana, mālama ʻia nā palapala werf me kāna code. Ke kau nei kēia i kekahi mau koi hoʻomohala ma mua o ke ʻano o kēia ʻatikala, akā ma ka liʻiliʻi hiki ke ʻōlelo ʻia:

  • ʻAʻole pono e hoʻokuʻu ʻia nā hana werf hou me ka ʻole o ka hoʻonui ʻana i ka palapala a, ʻo ka hoʻololi ʻana i ka palapala e hōʻike ana i ka hoʻokuʻu ʻana i kahi mana hou o werf;
  • He hoʻomohala koʻikoʻi ko ka papahana: hiki ke hoʻokuʻu ʻia nā mana hou i nā manawa he nui i ka lā;
  • ʻO nā hana lima e kau i kahi pūnaewele me kahi mana hou o nā palapala he paʻakikī loa;
  • Hoʻohana ka papahana i kahi ala semantic hoʻololi ʻana, me 5 mau ala paʻa. ʻO ke kaʻina hana hoʻokuʻu e pili ana i ka hele ʻana o nā mana ma o nā kahawai i mea e hoʻonui ai i ke kūpaʻa: mai ka alpha a hiki i ka rock-solid;
  • Loaʻa i ka pūnaewele kahi mana ʻōlelo Lūkini, e "ola a hoʻomohala" (ʻo ia hoʻi, hoʻonui ʻia ka ʻike) e like me ka mana nui (ʻo ia hoʻi, ka ʻōlelo Pelekane).

No ka hūnāʻana i kēia "kīhini i loko" mai ka mea hoʻohana, hāʻawi iā ia i kahi mea "hana wale", hana mākou hoʻokaʻawale werf hoʻonohonoho a me ka mea hana hou Ua multiwerf. Pono ʻoe e kuhikuhi i ka helu hoʻokuʻu a me ke kahawai kūpaʻa āu e mākaukau ai e hoʻohana, a e nānā ʻo multiwerf inā loaʻa kahi mana hou ma ke kahawai a hoʻoiho iā ia inā pono.

Ma ka papa koho koho ma ka pūnaewele, loaʻa nā mana hou o werf i kēlā me kēia kahawai. Ma ka paʻamau, ma ka helu wahi werf.io/documentation wehe ʻia ka mana o ke kahawai kūpaʻa loa no ka hoʻokuʻu hou loa - ua kuhikuhi pū ʻia e nā ʻenekini huli. Loaʻa nā palapala no ke alahele ma nā wahi ʻokoʻa (e laʻa, werf.io/v1.0-beta/documentation no ka hoʻokuʻu beta 1.0).

Ma ka huina, loaʻa i ka pūnaewele nā ​​mana i loaʻa:

  1. root (wehe ʻia ma ka paʻamau),
  2. no kēlā me kēia kaha hoʻohou hou o kēlā me kēia hoʻokuʻu (no ka laʻana, werf.io/v1.0-beta).

No ka hana ʻana i kahi mana kikoʻī o kahi pūnaewele, ma ka laulā, lawa ia e hōʻuluʻulu me ka hoʻohana ʻana ʻO Iekyllma ka holo ana ma ka papa kuhikuhi /docs werf waihona e pili ana i ke kauoha (jekyll build), ma hope o ka hoʻololi ʻana i ka tag Git o ka mana i makemake ʻia.

Ke waiho wale nei ka hoʻohui ʻana i kēlā:

  • hoʻohana ʻia ka pono ponoʻī (werf) no ka hui ʻana;
  • Kūkulu ʻia nā kaʻina hana CI / CD ma ke kumu o GitLab CI;
  • a holo kēia mau mea a pau ma Kubernetes.

hana

I kēia manawa e hoʻolālā i nā hana e noʻonoʻo i nā kikoʻī āpau i wehewehe ʻia:

  1. Ma hope o ka hoʻololi ʻana i ka mana werf ma kēlā me kēia ala hou Pono e hoʻonui ʻia nā palapala ma ka pūnaewele.
  2. No ka hoʻomohala ʻana pono ʻoe e hiki i kekahi manawa e nānā i nā mana o ka paena.

Pono e hōʻuluʻulu hou ʻia ka pūnaewele ma hope o ka hoʻololi ʻana i ka mana ma kekahi kahawai mai nā inoa Git e pili ana, akā i ke kaʻina hana o ke kūkulu ʻana i ke kiʻi e loaʻa iā mākou nā hiʻohiʻona aʻe:

  • No ka hoʻololi ʻana o ka papa inoa o nā mana ma nā kahawai, pono wale e kūkulu hou i nā palapala no nā kahawai kahi i loli ai ka mana. Ma hope o nā mea a pau, ʻaʻole maikaʻi loa ke kūkulu hou ʻana i nā mea āpau.
  • Hiki ke hoʻololi ʻia ka hoʻonohonoho o nā ala no ka hoʻokuʻu ʻana. I kekahi manawa, no ka laʻana, ʻaʻohe mana o nā kahawai i ʻoi aku ka paʻa ma mua o ka hoʻokuʻu mua ʻana o 1.1, akā ma hope o ka manawa e ʻike ʻia - i kēia hihia, ʻaʻole anei ʻoe e hoʻololi i ka hui me ka lima?

Ke hoʻololi nei ia pili ka hui i ka hoʻololi ʻana i ka ʻikepili waho.

Ka hoʻokō

Ke koho ʻana i kahi ala

ʻO kahi ʻē aʻe, hiki iā ʻoe ke holo i kēlā me kēia mana i makemake ʻia ma ke ʻano he pod kaʻawale ma Kubernetes. Hōʻike kēia koho i ka nui o nā mea i loko o ka pūʻulu, e ulu me ka hoʻonui ʻana i ka helu o nā werf paʻa. A ʻo kēia, ʻo ia ka mea e pili ana i ka mālama paʻakikī: aia kēlā me kēia mana i kāna kikowaena HTTP ponoʻī, a me kahi haʻahaʻa liʻiliʻi. ʻOiaʻiʻo, pili kēia i nā kumukūʻai waiwai nui aʻe.

Ua hele mākou i ke ala like ka hui ʻana i nā mana kūpono a pau i hoʻokahi kiʻi. Aia nā statics i hōʻuluʻulu ʻia o nā mana āpau o ka pūnaewele i loko o kahi pahu me NGINX, a hele mai ke kaʻa i ka Deployment e pili ana ma o NGINX Ingress. ʻO kahi hoʻolālā maʻalahi - kahi noi mokuʻāina - hiki iā ʻoe ke hoʻonui maʻalahi i ka Deployment (e pili ana i ka ukana) me ka hoʻohana ʻana iā Kubernetes ponoʻī.

No ka pololei loa, ke ʻohi nei mākou i ʻelua kiʻi: hoʻokahi no ke kaʻapuni hana, ʻo ka lua he kiʻi hou no ka kaapuni dev. Hoʻohana ʻia ke kiʻi ʻē aʻe (hoʻokuʻu ʻia) wale nō ma ka dev circuit me ka mea nui a loaʻa i ka mana o ka pūnaewele mai ka loiloi loiloi, a hana ʻia ke alahele ma waena o lākou me ka hoʻohana ʻana i nā kumuwaiwai Ingress.

werf vs git clone a me nā mea waiwai

E like me ka mea i haʻi mua ʻia, i mea e hana ai i nā statics pūnaewele no kahi mana kikoʻī o ka palapala, pono ʻoe e kūkulu ma ka hoʻololi ʻana i ka tag waihona kūpono. Hiki iā ʻoe ke hana i kēia ma ka hoʻopili ʻana i ka waihona i kēlā me kēia manawa āu e kūkulu ai, ke koho ʻana i nā hōʻailona kūpono mai kahi papa inoa. Eia nō naʻe, he hana koʻikoʻi kēia a, ʻoi aku hoʻi, pono e kākau i nā ʻōlelo aʻoaʻo koʻikoʻi ʻole ... ʻO kekahi hemahema koʻikoʻi ʻo ia me kēia ala ʻaʻohe ala e hūnā i kekahi mea i ka wā o ka ʻaha.

Eia ka werf pono e hele mai e kōkua iā mākou, hoʻokō ka hoʻopaʻa ʻana maʻalea a hiki iā ʻoe ke hoʻohana nā waihona waho. ʻO ka hoʻohana ʻana i ka werf e hoʻohui i ke code mai ka waihona e wikiwiki loa i ke kūkulu ʻana, no ka mea Hoʻopili pono ʻo werf i ka waihona i hoʻokahi manawa a laila hoʻokō wale fetch inā pono. Eia kekahi, i ka hoʻohui ʻana i ka ʻikepili mai ka waihona, hiki iā mākou ke koho i nā papa kuhikuhi pono wale nō (i kā mākou hihia ʻo ia ka papa kuhikuhi. docs), ka mea e hōʻemi nui i ka nui o nā ʻikepili i hoʻohui ʻia.

No ka mea he mea hana ʻo Jekyll no ka hōʻuluʻulu ʻana i ka ʻikepili static a ʻaʻole pono i ke kiʻi hope loa, pono e hōʻuluʻulu i loko. mea hana werf, a i ke kiʻi hope loa hoʻokomo wale i ka hopena hōʻuluʻulu.

Kākau mākou werf.yaml

No laila, ua hoʻoholo mākou e hōʻuluʻulu mākou i kēlā me kēia mana i kahi werf artifact kaʻawale. Eia naʻe mākou ʻAʻole mākou ʻike i ka nui o kēia mau mea waiwai i ka wā e ʻākoakoa ai, no laila ʻaʻole hiki iā mākou ke kākau i kahi hoʻonohonoho kūkulu paʻa (ma ka ʻōlelo ʻana, hiki nō iā mākou, akā ʻaʻole ia e holo pono).

werf hiki iā ʻoe ke hoʻohana E hele i nā mamana i kāu faila hoʻonohonoho (werf.yaml), a hiki i kēia hana i ka config ma ka lele e pili ana i ka ʻikepili waho (ka mea āu e pono ai!). ʻO ka ʻikepili waho i kā mākou hihia ka ʻike e pili ana i nā mana a me nā hoʻokuʻu, ma ke kumu e hōʻiliʻili ai mākou i ka helu i koi ʻia o nā artifacts a ma muli o ka loaʻa ʻana o nā kiʻi ʻelua: werf-doc и werf-dev e holo ma na kaapuni like ole.

Lawe ʻia ka ʻikepili waho ma o nā ʻano hoʻololi kaiapuni. Eia kā lākou haku mele:

  • RELEASES - kahi laina me kahi papa inoa o nā hoʻokuʻu a me ka mana o kēia manawa o werf, ma ke ʻano o kahi papa inoa o nā waiwai i hoʻokaʻawale ʻia i ka ʻano. <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>... Laʻana: 1.0%v1.0.4-beta.20
  • CHANNELS - kahi laina me kahi papa inoa o nā kahawai a me ka mana o kēia manawa o werf, ma ke ʻano o kahi papa inoa o nā waiwai i hoʻokaʻawale ʻia i ka ʻano. <КАНАЛ>%<НОМЕР_ВЕРСИИ>... Laʻana: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION - Werf hoʻokuʻu mana e hōʻike ʻia ma ka paʻamau ma ka pūnaewele (ʻaʻole pono e hōʻike i nā palapala e ka helu hoʻokuʻu kiʻekiʻe loa). Laʻana: v1.0.4-beta.20
  • REVIEW_SHA - hash o ka loiloi loiloi e pono ai ʻoe e kūkulu i ka mana no ka loop hoʻāʻo.

E hoʻopiha ʻia kēia mau ʻano i ka pipeline GitLab CI, a pehea i kākau ʻia ma lalo nei.

ʻO ka mea mua, no ka maʻalahi, wehewehe mākou i loko werf.yaml E hele i nā hoʻololi template, e hāʻawi iā lākou i nā waiwai mai nā ʻano hoʻololi kaiapuni:

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

ʻO ka wehewehe ʻana o ka mea kiʻi no ka hōʻuluʻulu ʻana i ka mana paʻa o ka pūnaewele ma ke ʻano like no nā hihia āpau a mākou e pono ai (me ka hoʻokumu ʻana i ka mana kumu, a me ka mana no ka dev circuit). No laila, e hoʻoneʻe mākou iā ia i kahi poloka kaʻawale me ka hoʻohana ʻana i ka hana define - no ka hoʻohana hou ʻana include. E hāʻawi mākou i kēia mau manaʻo i ka template:

  • Version - ka mana i hana ʻia (inoa inoa);
  • Channel - ka inoa o ke ala hou i hana ʻia ai ke kiʻi;
  • Commit - commit hash, inā i hana ʻia ka artifact no ka loiloi loiloi;
  • pōʻaiapili.

ʻO ka wehewehe ʻana i ka Template Artifact

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

Pono ka inoa artifact. Hiki iā mākou ke hoʻokō i kēia, no ka laʻana, ma ka hoʻohui ʻana i ka inoa channel (ka waiwai o ka variable .Channel) ma ke ʻano he suffix i ka inoa o ka mea hana: artifact: doc-{{ .Channel }}. Akā, pono ʻoe e hoʻomaopopo i ka wā e lawe mai ai mai nā mea artifact, pono ʻoe e kuhikuhi i nā inoa like.

I ka wehewehe ʻana i kahi artifact, hoʻohana ʻia kēia hiʻohiʻona werf: kau ana. Ke kau ʻana e hōʻike ana i ka papa kuhikuhi lawelawe build_dir hiki iā ʻoe ke mālama i ka cache Jekyll ma waena o nā holo pipeline, ʻo ia ʻoi aku ka wikiwiki o ka hui hou ʻana.

Ua ʻike paha ʻoe i ka hoʻohana ʻana i ka faila releases.yml he faila YAML me ka ʻikepili hoʻokuʻu i noi ʻia mai github.com (kahi mea kiʻi i loaʻa i ka wā e hoʻokō ai i kahi paipu). Pono ia i ka wā e hōʻuluʻulu ai i ka pūnaewele, akā i ka pōʻaiapili o ka ʻatikala he mea hoihoi ia iā mākou no ka mea e pili ana i kona mokuʻāina ka hui hou ʻana o hoʻokahi mea hana - he mea kiʻi o ke kumu kumu o ka pūnaewele (ʻaʻole pono ia i nā mea kiʻi ʻē aʻe).

Hoʻokō ʻia kēia me ka hoʻohana ʻana i ka ʻōlelo kūlana if E hele i nā mamana a me nā hoʻolālā {{ $Root.Files.Get "releases.yml" | sha256sum }} ma ke kahua nā pae. Ke hana nei ia penei: i ke kūkulu ʻana i kahi mea kiʻi no ke kumu kumu (variable .Channel like me root) file hash releases.yml pili i ka pūlima o ka pae holoʻokoʻa, no ka mea he ʻāpana ia o ka inoa o ka hana Ansible (parameter name). Pela, ke hoololi maʻiʻo faila releases.yml e hōʻuluʻulu hou ʻia ka mea hana like.

E ʻoluʻolu e hoʻolohe i ka hana ʻana me kahi waihona waho. Ma ke kiʻi o kahi mea hana mai werf waihona, ua hoʻohui ʻia ka papa kuhikuhi /docs, a ma muli o nā ʻāpana i hala, hoʻohui koke ʻia ka ʻikepili o ka hōʻailona koi a i ʻole ka loiloi loiloi.

No ka hoʻohana ʻana i ka template artifact no ka hoʻopuka ʻana i ka wehewehe ʻana i ke ʻano o nā mana i hoʻololi ʻia o nā ala a me nā hoʻokuʻu ʻana, hoʻonohonoho mākou i kahi loop ma ka loli. .WerfVersions в werf.yaml:

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

No ka mea e hoʻopuka ka loop i kekahi mau artifacts (manaʻolana mākou pēlā), pono e noʻonoʻo i ka mea hoʻokaʻawale ma waena o lākou - ke kaʻina. --- (No ka ʻike hou aku e pili ana i ka syntax file hoʻonohonoho, ʻike palapala). E like me ka mea i wehewehe mua ʻia, i ke kāhea ʻana i kahi template i loko o ka loop, e hāʻawi mākou i nā ʻāpana o ka mana, URL a me ke kumu kumu.

Pēlā nō, akā me ka ʻole o ka loop, kapa mākou i ka template artifact no "nā hihia kūikawā": no ke kumu kumu, a me ka mana mai ka loiloi commit:

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

E ʻoluʻolu, e kūkulu ʻia ka artifact no ka loiloi loiloi inā hoʻonohonoho ʻia ka loli .WerfReviewCommit.

Ua mākaukau nā mea waiwai - ua hiki i ka manawa e hoʻomaka ai e lawe mai!

ʻO ke kiʻi hope loa, i hoʻolālā ʻia e holo ma Kubernetes, he NGINX maʻamau me kahi faila hoʻonohonoho kikowaena i hoʻohui ʻia nginx.conf a static mai nā mea waiwai. Ma waho aʻe o ka artifact o ke kumu kumu o ka pūnaewele, pono mākou e hana hou i ka loop ma ka loli .WerfVersions e hoʻokomo i nā kiʻi kiʻi o ke kahawai a hoʻokuʻu i nā mana + e hahai i ka lula inoa artifact a mākou i hāpai ai ma mua. No ka mea e mālama ana kēlā me kēia artifact i nā mana o ka pūnaewele no nā ʻōlelo ʻelua, lawe mākou iā lākou i nā wahi i hāʻawi ʻia e ka hoʻonohonoho.

ʻO ka wehewehe ʻana i ke kiʻi hope loa 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 -}}

ʻO ke kiʻi ʻē aʻe, ʻo ia hoʻi, me ka mea nui, i hoʻokuʻu ʻia ma ka dev circuit, aia wale nō ʻelua mau mana o ka pūnaewele: ʻo ka mana mai ka loiloi loiloi a me ke kumu kumu o ka pūnaewele (aia nā waiwai nui a, inā ʻoe e hoʻomanaʻo. , hoʻokuʻu ʻikepili). No laila, ʻokoʻa ke kiʻi hou mai ka mea nui ma ka ʻāpana lawe mai (a, ʻoiaʻiʻo, ma ka inoa):

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

E like me ka mea i hōʻike ʻia ma luna nei, e hana ʻia ka artifact no ka loiloi loiloi i ka wā e holo ai ka hoʻololi kaiapuni i hoʻonohonoho ʻia REVIEW_SHA. ʻAʻole hiki ke hoʻopuka i ke kiʻi werf-dev inā ʻaʻohe ʻano hoʻololi kaiapuni REVIEW_SHA, aka, i mea e hoʻomaʻemaʻe ma nā kulekele ʻO nā kiʻi Docker ma werf i hana no ke kiʻi werf-dev, e waiho mākou e kūkulu ʻia me ke kumu kumu kumu (ua kūkulu ʻia ʻo ia), e hoʻomaʻamaʻa i ke ʻano o ka pipeline.

Ua mākaukau ka ʻaha! E neʻe kākou i ka CI/CD a me nā nuances koʻikoʻi.

Pipeline ma GitLab CI a me nā hiʻohiʻona o ke kūkulu ikaika

I ka holo ʻana i ke kūkulu ʻana, pono mākou e hoʻonohonoho i nā ʻano hoʻololi i hoʻohana ʻia i loko werf.yaml. ʻAʻole pili kēia i ka helu REVIEW_SHA, a mākou e hoʻonohonoho ai i ke kāhea ʻana i ka pipeline mai ka hook GitHub.

E hana mākou i ka ʻikepili waho e pono ai i kahi palapala Bash generate_artifacts, ka mea e hoʻopuka ai i ʻelua mau kiʻi kiʻi pipeline GitLab:

  • faila releases.yml me ka ʻikepili hoʻokuʻu,
  • faila common_envs.sh, loaʻa nā mea hoʻololi kaiapuni e lawe ʻia aku.

waihona waihona generate_artifacts e loaʻa iā ʻoe ma kā mākou waihona me nā laʻana. ʻO ka loaʻa ʻana o ka ʻikepili ponoʻī ʻaʻole ia ke kumuhana o ka ʻatikala, akā ʻo ka faila common_envs.sh mea nui ia kakou, no ka mea pili ka hana a werf. He laʻana o kāna ʻike:

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'

Hiki iā ʻoe ke hoʻohana i ka hopena o ia palapala, no ka laʻana, me ka hoʻohana ʻana i ka hana Bash source.

Ke hele mai nei ka ʻāpana leʻaleʻa. I mea e hana pono ai ka hana ʻana a me ka hoʻolaha ʻana o ka noi, pono e hōʻoia i kēlā werf.yaml e ka mea like mea liʻiliʻi loa i loko o kahi paipu. Inā ʻaʻole i hoʻokō ʻia kēia kūlana, a laila ʻokoʻa nā pūlima o nā pae i helu ʻia e werf i ka wā o ka ʻākoakoa ʻana a, no ka laʻana, hoʻolaha. E alakaʻi kēia i kahi hewa hoʻonohonoho, no ka mea ... e nalowale ana ke kiʻi i koi ʻia no ka hoʻolaha ʻana.

I nā huaʻōlelo ʻē aʻe, inā i ka wā o ka hui ʻana o ke kiʻi pūnaewele ka ʻike e pili ana i ka hoʻokuʻu ʻana a me nā ʻano like, a i ka manawa o ka hoʻokuʻu ʻana i hoʻokuʻu ʻia kahi mana hou a loaʻa nā ʻano like ʻole o ke kaiapuni, a laila e hāʻule ka deployment me kahi hewa: ma hope o nā mea a pau, ʻaʻole i kūkulu ʻia ka artifact o ka mana hou.

Ina hanauna werf.yaml pili i ka ʻikepili o waho (no ka laʻana, kahi papa inoa o nā mana o kēia manawa, e like me kā mākou hihia), a laila pono e hoʻopaʻa ʻia ka haku mele a me nā waiwai o ia ʻikepili i loko o ka pipeline. He mea koʻikoʻi kēia inā loli pinepine nā ʻāpana o waho.

Mākou loaʻa a hoʻopaʻa i ka ʻikepili waho i ka pae mua o ka pipeline ma GitLab (Hana mua) a hoʻouna hou aku iā lākou ma ke ʻano ʻO GitLab CI mea hana. E ʻae kēia iā ʻoe e holo a hoʻomaka hou i nā hana pipeline (kūkulu, kau, hoʻomaʻemaʻe) me ka hoʻonohonoho like i loko werf.yaml.

Nā mea o ke kahua Hana mua faila .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

Ma hope o ka hopu ʻana i ka ʻikepili waho i loko o ka artifact, hiki iā ʻoe ke kūkulu a hoʻonohonoho me ka hoʻohana ʻana i nā pae pipeline GitLab CI maʻamau: Build a Deploy. Hoʻomaka mākou i ka pipeline me ka hoʻohana ʻana i nā makau mai ka werf GitHub repository (ʻo ia hoʻi, ke loaʻa nā loli i ka waihona GitHub). Hiki ke loaʻa ka ʻikepili no lākou ma nā waiwai papahana GitLab ma ka ʻāpana CI/CD Settings -> Pipeline triggers, a laila hana i ka Webhook pili i GitHub (Nā hoʻonohonoho -> Webhooks).

E like me kēia ka pae kūkulu:

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

E hoʻohui ʻo GitLab i ʻelua mau mea kiʻi mai ke kahua a i ke kahua kūkulu Hana mua, no laila mākou e hoʻokuʻu aku ai i nā mea hoʻololi me nā ʻikepili hoʻokomo i hoʻomākaukau ʻia me ka hoʻohana ʻana i ke kūkulu source common_envs.sh. Hoʻomaka mākou i ke kahua kūkulu i nā hihia āpau, koe wale no ka hoʻomaka ʻana i ka pipeline e like me ka papa kuhikuhi. E like me ka papahana, e holo mākou i kahi pipeline no ka hoʻomaʻemaʻe - i kēia hihia ʻaʻole pono e hana i ka hui.

Ma ka pae hoʻolālā, e wehewehe mākou i ʻelua mau hana - kaʻawale no ka hoʻoili ʻana i ka hana a me nā kaʻa dev, me ka hoʻohana ʻana i kahi template 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

ʻOkoʻa wale nā ​​​​hana i ka wehewehe ʻana i ka pōʻaiapili puʻupuʻu kahi e hana ai ka werf i ka hoʻolaha (WERF_KUBE_CONTEXT), a me ka hoʻonohonoho ʻana i nā loli kaiapuni loop (environment.name и environment.url), a laila hoʻohana ʻia i nā mamana palapala Helm. ʻAʻole mākou e hāʻawi i nā ʻike o nā templates, no ka mea... ʻAʻohe mea hoihoi ma laila no ke kumuhana i nīnau ʻia, akā hiki iā ʻoe ke loaʻa iā lākou i loko nā waihona no ka ʻatikala.

Paʻi hope

No ka mea ua hoʻokuʻu pinepine ʻia nā mana werf, e kūkulu pinepine ʻia nā kiʻi hou, a e ulu mau ka Docker Registry. No laila, pono e hoʻonohonoho i ka hoʻomaʻemaʻe kiʻi ma muli o nā kulekele. He mea maʻalahi loa ke hana.

No ka hoʻokō ʻana, pono ʻoe:

  • Hoʻohui i kahi hana hoʻomaʻemaʻe i .gitlab-ci.yml;
  • Hoʻohui i ka hoʻokō manawa o kahi hana hoʻomaʻemaʻe;
  • Hoʻonohonoho i kahi ʻano hoʻololi kaiapuni me kahi hōʻailona hiki ke kākau.

Hoʻohui i kahi pae hoʻomaʻemaʻe i .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

Ua ʻike mua mākou i kēia mau mea āpau i kahi kiʻekiʻe iki - ʻo ka hoʻomaʻemaʻe wale nō e pono ʻoe e komo mua i ka Docker Registry me kahi hōʻailona i loaʻa nā kuleana e holoi i nā kiʻi ma ka Docker Registry (ʻaʻole i hoʻopuka ʻia ka hōʻailona hana GitLab CI loaʻa ia mau kuleana). Pono e hana ʻia ka hōʻailona ma GitLab ma mua a pono e kuhikuhi ʻia kona waiwai i loko o ka hoʻololi kaiapuni WERF_IMAGES_CLEANUP_PASSWORD ka papahana (Nā hoʻonohonoho CI/CD -> Nā ʻano like ʻole).

Hoʻohui ʻia kahi hana hoʻomaʻemaʻe me ka papa hana i koi ʻia i loko CI/CD ->
Nā Papa
.

ʻO ia: ʻaʻole e ulu mau kahi papahana ma ka Docker Registry mai nā kiʻi i hoʻohana ʻole ʻia.

I ka pau ʻana o ka ʻāpana hana, e hoʻomanaʻo wau iā ʻoe aia nā papa inoa piha mai ka ʻatikala ʻO Git:

hopena

  1. Ua loaʻa iā mākou kahi ʻōnaehana hui kūpono: hoʻokahi mea kiʻi no kēlā me kēia mana.
  2. He ākea ka hui a ʻaʻole koi i nā hoʻololi manual ke hoʻokuʻu ʻia nā mana hou o werf: hoʻonui ʻia nā palapala ma ka pūnaewele.
  3. Hoʻohui ʻia nā kiʻi ʻelua no nā contours like ʻole.
  4. Hana wikiwiki, no ka mea Hoʻohana ʻia ka cache e like me ka hiki - ke hoʻokuʻu ʻia kahi mana hou o ka werf a i ʻole ke kāhea ʻia kahi hook GitHub no ka hana loiloi, kūkulu hou ʻia ke ʻano mea like me ka mana i hoʻololi ʻia.
  5. ʻAʻole pono e noʻonoʻo e hoʻopau i nā kiʻi i hoʻohana ʻole ʻia: hoʻomaʻemaʻe e like me nā kulekele werf e mālama i ka Docker Registry.

haʻina

  • ʻO ka hoʻohana ʻana i ka werf e hiki ai i ka hui ke hana wikiwiki ma muli o ka hoʻopaʻa ʻana o ka hui ponoʻī a me ka caching i ka wā e hana ai me nā waihona waho.
  • ʻO ka hana ʻana me nā waihona Git waho e hoʻopau i ka pono e clone i ka waihona holoʻokoʻa i kēlā me kēia manawa a i ʻole e hana hou i ka huila me ka loiloi loiloi paʻakikī. Werf hoʻohana i kahi huna a hana i ka cloning hoʻokahi wale nō, a laila hoʻohana fetch a inā pono wale nō.
  • Hiki ke hoʻohana i nā mamana Go i ka waihona hoʻonohonoho kūkulu werf.yaml hiki iā ʻoe ke wehewehe i kahi hui e pili ana ka hopena i ka ʻikepili waho.
  • ʻO ka hoʻohana ʻana i ka mauna ma werf e wikiwiki i ka hōʻiliʻili ʻana i nā mea waiwai - ma muli o ka cache, ka mea maʻamau i nā pipeline āpau.
  • Werf maʻalahi ka hoʻonohonoho ʻana i ka hoʻomaʻemaʻe, ʻo ia ka mea koʻikoʻi i ke kūkulu ʻana me ka ikaika.

PS

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka