Majelis dinamis sareng panyebaran gambar Docker sareng werf nganggo conto situs dokuméntasi versi

Kami parantos nyarioskeun alat GitOps kami langkung ti sakali. werf, sareng waktos ieu kami hoyong bagikeun pangalaman urang dina ngumpul situs sareng dokuméntasi proyék éta sorangan - werf.io (versi Rusia nya en.werf.io). Ieu mangrupikeun situs statik biasa, tapi rakitanna pikaresepeun sabab diwangun nganggo jumlah artefak dinamis.

Majelis dinamis sareng panyebaran gambar Docker sareng werf nganggo conto situs dokuméntasi versi

Pindah kana nuansa struktur situs: ngahasilkeun ménu umum pikeun sadaya vérsi, halaman kalayan inpormasi ngeunaan sékrési, jsb. - urang moal. Sabalikna, hayu urang difokuskeun masalah sareng fitur tina rakitan dinamis sareng sakedik kana prosés CI / CD anu dibarengan.

bubuka: kumaha situs jalan

Pikeun mimitian, dokuméntasi werf disimpen sareng kode na. Ieu maksakeun sarat pangwangunan anu tangtu anu umumna di luar ruang lingkup tulisan ieu, tapi sahenteuna tiasa disebatkeun yén:

  • fungsi werf anyar teu kudu dileupaskeun tanpa ngamutahirkeun dokuméntasi jeung, Sabalikna, sagala parobahan dina dokuméntasi imply sékrési versi anyar tina werf;
  • Proyék ngagaduhan pamekaran anu cukup intensif: versi énggal tiasa dileupaskeun sababaraha kali sadinten;
  • Sakur operasi manual pikeun nyebarkeun situs kalayan vérsi dokuméntasi énggal sahenteuna nyusahkeun;
  • Proyék ngadopsi pendekatan semantik versioning, kalawan 5 saluran stabilitas. Prosés ngaleupaskeun ngalibatkeun petikan sequential versi ngaliwatan saluran dina urutan ngaronjatkeun stabilitas: ti alfa ka rock-padet;
  • Situs ngagaduhan versi basa Rusia, anu "hirup sareng mekar" (nyaéta, eusina diropéa) paralel sareng versi utama (nyaéta, basa Inggris).

Pikeun nyumputkeun sakabéh ieu "dapur batin" ti pamaké, maturan anjeunna hal anu "ngan jalan", urang ngalakukeun instalasi werf misah jeung alat update - eta multiwerf. Anjeun ngan perlu nangtukeun jumlah release jeung saluran stabilitas nu geus siap dipaké, sarta multiwerf bakal pariksa lamun aya versi anyar dina saluran tur ngundeur éta lamun perlu.

Dina menu pilihan versi dina website, versi panganyarna tina werf sadia dina unggal channel. Sacara standar, ku alamat werf.io/documentation Vérsi saluran anu paling stabil pikeun sékrési panganyarna dibuka - éta ogé diindeks ku mesin pencari. Dokuméntasi pikeun saluran sayogi di alamat anu misah (contona, werf.io/v1.0-beta/documentation pikeun sékrési béta 1.0).

Dina total, situs ngagaduhan versi di handap ieu anu sayogi:

  1. root (muka sacara standar),
  2. pikeun tiap saluran apdet aktif unggal release (contona, werf.io/v1.0-beta).

Pikeun ngahasilkeun versi spésifik situs, sacara umum, cukup pikeun nyusun éta nganggo Jekyllku ngajalankeun dina diréktori /docs werf Repository paréntah saluyu (jekyll build), saatos ngalih ka tag Git tina versi anu diperyogikeun.

Éta ngan ukur nambihan yén:

  • utiliti sorangan (werf) dipaké pikeun assembly;
  • prosés CI / CD diwangun dina dasar GitLab CI;
  • sarta sakabeh ieu, tangtosna, ngajalankeun di Kubernetes.

pancén

Ayeuna hayu urang ngarumuskeun tugas anu tumut kana sadaya spésifik anu dijelaskeun:

  1. Saatos ngarobah versi werf dina sagala saluran update dokuméntasi dina loka kudu otomatis diropéa.
  2. Pikeun ngembangkeun anjeun kudu bisa kadang nempo versi sawangan loka éta.

Situs kedah dikompilasi deui saatos ngarobih versi dina saluran mana waé tina tag Git anu saluyu, tapi dina prosés ngawangun gambar urang bakal nampi fitur-fitur ieu:

  • Kusabab daptar versi dina saluran robah, éta ngan perlu ngawangun deui dokuméntasi pikeun saluran dimana versi geus robah. Barina ogé, ngawangun deui sadayana henteu saé pisan.
  • Susunan saluran pikeun siaran tiasa robih. Dina sababaraha waktos, contona, moal aya versi dina saluran anu langkung stabil tibatan sékrési awal-aksés 1.1, tapi kana waktosna aranjeunna bakal muncul - dina hal ieu, naha anjeun henteu kedah ngarobih rakitan sacara manual?

Tétéla éta assembly gumantung kana ngarobah data éksternal.

Реализация

Milih hiji Pendekatan

Alternatipna, Anjeun bisa ngajalankeun unggal versi diperlukeun salaku pod misah di Kubernetes. Pilihan ieu nunjukkeun sajumlah ageung objék dina kluster, anu bakal ningkat kalayan paningkatan jumlah sékrési werf anu stabil. Sareng ieu, kahareupna nunjukkeun pangropéa anu langkung rumit: unggal vérsi ngagaduhan server HTTP sorangan, sareng kalayan beban anu alit. Tangtu, ieu ogé merlukeun waragad sumberdaya gede.

Kami nyandak jalan anu sami assembling sadaya versi diperlukeun dina hiji gambar. Statika anu disusun sadaya vérsi situs ieu aya dina wadah sareng NGINX, sareng lalu lintas ka Deployment anu saluyu ngalangkungan NGINX Ingress. Struktur basajan - aplikasi stateless - ngidinan Anjeun pikeun gampang skala Deployment (gumantung kana beban) ngagunakeun Kubernetes sorangan.

Pikeun langkung tepatna, kami ngumpulkeun dua gambar: hiji pikeun sirkuit produksi, anu kadua mangrupikeun tambahan pikeun sirkuit dev. Gambar tambahan dipaké (dibuka) ngan dina sirkuit dev bareng jeung nu utama sarta ngandung versi situs ti review commit, sarta routing antara aranjeunna dipigawé ngagunakeun sumberdaya Ingress.

werf vs git clone sareng artefak

Sakumaha anu parantos disebatkeun, pikeun ngahasilkeun statik situs pikeun versi dokuméntasi khusus, anjeun kedah ngawangun ku ngagentos ka tag Repositori anu pas. Anjeun ogé tiasa ngalakukeun ieu ku cara ngakloning gudang unggal waktos anjeun ngawangun, milih tag anu cocog tina daptar. Sanajan kitu, ieu téh operasi rada sumberdaya-intensif jeung, komo deui, merlukeun nulis parentah non-trivial ... disadvantage serius sejen nyaeta kalawan pendekatan ieu euweuh jalan ka cache hal salila assembly.

Di dieu utilitas werf sorangan datang ka bantuan urang, ngalaksanakeun cache pinter sarta ngidinan Anjeun pikeun ngagunakeun repositories éksternal. Ngagunakeun werf pikeun nambahkeun kode ti Repository bakal nyata nyepetkeun ngawangun, sabab werf dasarna clone gudang sakali lajeng executes ngan fetch lamun perlu. Salaku tambahan, nalika nambihan data tina gudang, urang ngan ukur tiasa milih diréktori anu diperyogikeun (dina hal urang ieu mangrupikeun diréktori. docs), anu sacara signifikan bakal ngirangan jumlah data tambihan.

Kusabab Jekyll mangrupikeun alat anu dirancang pikeun nyusun data statik sareng henteu diperyogikeun dina gambar ahir, éta logis pikeun nyusun artefak werf, jeung kana gambar ahir impor ngan hasil kompilasi.

Urang nulis werf.yaml

Ku kituna, urang mutuskeun yén urang bakal compile unggal versi dina artefak werf misah. Najan kitu urang urang teu nyaho sabaraha artefak ieu bakal aya salila assembly, Ku kituna urang teu bisa nulis konfigurasi ngawangun tetep (sacara ketat diomongkeun, urang masih bisa, tapi moal sagemblengna éféktif).

werf ngidinan Anjeun pikeun make Buka témplat dina file konfigurasi anjeun (werf.yaml), sareng ieu ngamungkinkeun ngahasilkeun config on laleur nu gumantung kana data éksternal (naon nu peryogi!). Data éksternal dina hal kami nyaéta inpormasi ngeunaan versi sareng sékrési, anu dumasar kana kami ngumpulkeun jumlah artefak anu diperyogikeun sareng salaku hasilna kami nampi dua gambar: werf-doc и werf-dev ngajalankeun on sirkuit béda.

Data éksternal disalurkeun ngaliwatan variabel lingkungan. Ieu komposisi maranéhanana:

  • RELEASES - garis sareng daptar sékrési sareng versi werf ayeuna anu saluyu, dina bentuk daptar nilai anu dipisahkeun ku rohangan dina format <НОМЕР_РЕЛИЗА>%<НОМЕР_ВЕРСИИ>... Conto: 1.0%v1.0.4-beta.20
  • CHANNELS - garis sareng daptar saluran sareng versi werf ayeuna anu saluyu, dina bentuk daptar nilai anu dipisahkeun ku rohangan dina format <КАНАЛ>%<НОМЕР_ВЕРСИИ>... Conto: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION - Vérsi release werf bakal dipintonkeun sacara standar dina loka (teu salawasna perlu nembongkeun dokuméntasi ku jumlah release pangluhurna). conto: v1.0.4-beta.20
  • REVIEW_SHA - Hash of review commit ti mana anjeun kudu ngawangun versi pikeun loop test.

Variabel ieu bakal dieusi dina pipa GitLab CI, sareng kumaha persisna ditulis di handap ieu.

Anu mimiti, pikeun genah, urang tangtukeun dina werf.yaml Buka variabel template, pasihan aranjeunna nilai tina variabel lingkungan:

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

Katerangan ngeunaan artefak pikeun kompilasi versi statik situs umumna sami pikeun sadaya kasus anu urang butuhkeun (kaasup ngahasilkeun versi akar, ogé versi pikeun sirkuit dev). Kituna, urang bakal mindahkeun kana blok misah ngagunakeun fungsi define - pikeun pamakéan deui saterusna include. Urang bakal ngalebetkeun argumen di handap ieu kana citakan:

  • Version - versi dihasilkeun (ngaran tag);
  • Channel - nami saluran update dimana artefak dibangkitkeun;
  • Commit - commit hash, upami artefak dihasilkeun pikeun review commit;
  • konteks.

Artefak Citakan Katerangan

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

Ngaran artefak kedah unik. Urang tiasa ngahontal ieu, contona, ku nambihan nami saluran (nilai variabel .Channel) salaku ahiran kana ngaran artefak: artifact: doc-{{ .Channel }}. Tapi anjeun kedah ngartos yén nalika ngimpor tina artefak, anjeun kedah ngarujuk kana nami anu sami.

Nalika ngajelaskeun artefak, fitur werf di handap ieu dianggo: ningkatna. Pamasangan nunjukkeun diréktori jasa build_dir ngidinan Anjeun pikeun nyimpen cache Jekyll antara pipa ngalir, nu nyata speeds up reassembly.

Anjeun oge bisa geus noticed pamakéan file releases.yml mangrupakeun file YAML kalawan data release dipénta ti github.com (artefak anu dicandak nalika ngalaksanakeun pipa). Diperlukeun nalika nyusun situs, tapi dina konteks tulisan éta pikaresepeun pikeun urang sabab gumantung kana kaayaanana reassembly ngan hiji artefak - artefak tina versi akar situs (henteu diperlukeun dina artefak séjén).

Ieu dilaksanakeun ngagunakeun pernyataan kondisional if Buka témplat sareng desain {{ $Root.Files.Get "releases.yml" | sha256sum }} dina panggung tahapan. Gawéna sapertos kieu: nalika ngawangun artefak pikeun versi root (variabel .Channel sarua jeung root) file hash releases.yml mangaruhan tanda tangan tina sakabéh tahap, sabab éta bagian tina nami tugas Ansible (parameter name). Ku kituna, nalika ngarobah eusi file releases.yml artefak pakait bakal reassembled.

Punten perhatosan ogé pikeun damel sareng gudang éksternal. Dina gambar tina hiji artefak ti gudang werf, ngan diréktori nu ditambahkeun /docs, sarta gumantung kana parameter nu lulus, data tina tag diperlukeun atawa commit review ditambahkeun langsung.

Pikeun nganggo template artefak pikeun ngahasilkeun déskripsi artefak tina versi saluran sareng sékrési anu ditransfer, urang ngatur loop dina variabel .WerfVersions в werf.yaml:

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

Sabab loop bakal ngahasilkeun sababaraha artefak (kami miharep kitu), perlu tumut kana akun pamisah antara aranjeunna - runtuyan --- (Pikeun inpormasi lengkep ngeunaan sintaksis file konfigurasi, tingali dokuméntasi). Sakumaha anu didefinisikeun sateuacana, nalika nyauran témplat dina loop, urang lulus parameter versi, URL sareng kontéks akar.

Nya kitu, tapi tanpa loop a, urang nelepon template artefak pikeun "kasus husus": pikeun versi root, kitu ogé versi ti review 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 }}

Perhatikeun yén artefak pikeun review commit ngan bakal diwangun lamun variabel disetel .WerfReviewCommit.

Artefak parantos siap - waktosna pikeun ngamimitian ngimpor!

Gambar ahir, dirancang pikeun ngajalankeun on Kubernetes, mangrupakeun NGINX biasa kalawan file konfigurasi server ditambahkeun nginx.conf sarta statik tina artefak. Salian artefak tina versi akar situs, urang kedah ngulang loop dina variabel .WerfVersions pikeun ngimpor artefak saluran sareng versi sékrési + turutan aturan nami artefak anu kami angkat sateuacana. Kusabab unggal artefak nyimpen versi situs pikeun dua basa, urang ngimpor eta kana tempat disadiakeun ku konfigurasi.

Katerangan ngeunaan gambar ahir 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 -}}

Gambar tambahan, anu, sareng anu utami, diluncurkeun dina sirkuit dev, ngan ukur ngandung dua vérsi situs: vérsi ti ulasan commit sareng versi akar situs (aya aset umum sareng, upami anjeun émut. , ngaleupaskeun data). Ku kituna, gambar tambahan bakal béda ti nu utama ukur dina bagian impor (jeung, tangtosna, dina nami):

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

Sakumaha anu kacatet di luhur, artefak pikeun koméntar ulasan bakal dibangkitkeun ngan ukur nalika variabel lingkungan set dijalankeun REVIEW_SHA. Ieu bakal mungkin mun teu ngahasilkeun gambar werf-dev pisan lamun euweuh variabel lingkungan REVIEW_SHA, tapi dina raraga beberesih ku kawijakan Gambar Docker di werf digawé pikeun gambar werf-dev, urang bakal ninggalkeun eta diwangun ngan ku artefak versi root (eta geus diwangun atoh), pikeun simplify struktur pipa.

Majelis parantos siap! Hayu urang ngaléngkah ka CI / CD sareng nuansa penting.

Pipeline di GitLab CI sareng fitur ngawangun dinamis

Nalika ngajalankeun ngawangun urang kedah nyetél variabel lingkungan anu dianggo werf.yaml. Ieu henteu dilarapkeun kana variabel REVIEW_SHA, anu bakal urang setel nalika nelepon pipa tina hook GitHub.

Urang bakal ngahasilkeun data éksternal diperlukeun dina Aksara Bash generate_artifacts, anu bakal ngahasilkeun dua artefak pipa GitLab:

  • file releases.yml kalawan data release,
  • file common_envs.sh, ngandung variabel lingkungan pikeun diékspor.

eusi file generate_artifacts anjeun bakal manggihan di urang repositories kalawan conto. Narima data sorangan sanes subyek artikel, tapi file common_envs.sh penting pikeun urang, sabab karya werf gumantung kana eta. Conto eusina:

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'

Anjeun tiasa nganggo kaluaran naskah sapertos kitu, contona, nganggo fungsi Bash source.

Ayeuna datang bagian senang. Supados duanana ngawangun sareng panyebaran aplikasi tiasa dianggo leres, perlu pikeun mastikeun éta werf.yaml ieu sami pangleutikna dina hiji pipa. Upami kaayaan ieu henteu kapendak, maka tanda tangan tina tahapan anu diitung nalika majelis sareng, contona, panyebaran, bakal béda. Ieu bakal ngakibatkeun kasalahan deployment, sabab ... gambar diperlukeun pikeun deployment bakal leungit.

Kalayan kecap sanésna, upami nalika ngarakit gambar situs inpormasi ngeunaan sékrési sareng vérsi sami, sareng dina waktos panyebaran versi énggal dileupaskeun sareng variabel lingkungan gaduh nilai anu béda-béda, maka panyebaran bakal gagal sareng kasalahan: Barina ogé, artefak tina versi anyar teu acan diwangun.

Lamun generasi werf.yaml gumantung kana data éksternal (contona, daptar vérsi anu ayeuna, sapertos dina kasus urang), maka komposisi sareng nilai data sapertos kitu kedah dirékam dina pipa. Ieu hususna penting lamun parameter éksternal robah rada mindeng.

Kami bakal nampi sareng ngarékam data éksternal dina tahap mimiti pipa di GitLab (Prebuild) sarta ngirimkeunana salajengna dina formulir GitLab CI artefak. Ieu bakal ngidinan Anjeun pikeun ngajalankeun sarta balikan deui jobs pipeline (ngawangun, nyebarkeun, cleanup) jeung konfigurasi sarua dina werf.yaml.

Eusi panggung Prebuild file .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

Saatos néwak data éksternal dina artefak, anjeun tiasa ngawangun sareng nyebarkeun nganggo tahapan pipa GitLab CI standar: Ngawangun sareng Nyebarkeun. Kami ngaluncurkeun pipa sorangan nganggo kait tina gudang GitHub werf (nyaéta, nalika aya parobahan dina gudang GitHub). Data pikeun aranjeunna tiasa dipendakan dina sipat proyék GitLab dina bagian éta Setélan CI/CD -> Pipeline micu, teras jieun Webhook anu aya dina GitHub (Setélan -> Webhooks).

Tahap ngawangun bakal sapertos kieu:

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 bakal nambihan dua artefak ti panggung ka panggung ngawangun Prebuild, Ku kituna urang ékspor variabel kalayan data input disusun ngagunakeun ngawangun source common_envs.sh. Urang ngamimitian tahap ngawangun dina sagala hal, iwal mun launching pipa nurutkeun jadwal a. Numutkeun jadwal, urang bakal ngajalankeun pipa pikeun beberesih - dina hal ieu teu kudu ngalakukeun assembly.

Dina tahap deployment, urang bakal ngajelaskeun dua tugas - misah pikeun deployment kana produksi jeung sirkuit dev, ngagunakeun 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

Tugas dasarna ngan ukur béda dina nunjukkeun kontéks klaster dimana werf kedah ngalaksanakeun panyebaran (WERF_KUBE_CONTEXT), sareng netepkeun variabel lingkungan loop (environment.name и environment.url), anu teras dianggo dina témplat bagan Helm. Kami moal nyayogikeun eusi témplat, sabab ... aya nanaon metot aya pikeun topik sual, tapi anjeun bisa manggihan aranjeunna dina repositories pikeun artikel.

touch ahir

Kusabab versi werf dileupaskeun rada sering, gambar anyar bakal sering diwangun, sareng pendaptaran Docker bakal terus ningkat. Ku alatan éta, éta penting pikeun ngonpigurasikeun cleanup gambar otomatis dumasar kana kawijakan. Gampang pisan pikeun ngalakukeunana.

Pikeun ngalaksanakeun anjeun peryogi:

  • Tambahkeun léngkah beberesih ka .gitlab-ci.yml;
  • Tambahkeun palaksanaan périodik tina tugas beberesih;
  • Nyetél variabel lingkungan kalayan token aksés nulis.

Nambahkeun tahap beberesih ka .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

Kami parantos ningali ampir sadayana ieu langkung luhur - ngan pikeun ngabersihan éta anjeun kedah log in heula ka Docker Registry kalayan token anu ngagaduhan hak ngahapus gambar dina Docker Registry (token tugas GitLab CI anu dikaluarkeun sacara otomatis henteu. gaduh hak sapertos kitu). Token kudu dijieun dina GitLab sateuacanna sarta nilai na kudu dieusian dina variabel lingkungan WERF_IMAGES_CLEANUP_PASSWORD proyékna (Setélan CI/CD -> Variabel).

Nambahkeun tugas beberesih jeung jadwal diperlukeun geus rengse di CI/CD ->
jadwal
.

Éta waé: proyék di Docker Registry moal terus-terusan tumbuh tina gambar anu henteu dianggo.

Dina ahir bagian praktis, hayu atuh ngingetan yén listings lengkep tina artikel nu sadia di indit:

hasil

  1. Kami nampi struktur rakitan logis: hiji artefak per versi.
  2. Majelis téh universal tur teu merlukeun parobahan manual nalika versi anyar tina werf dileupaskeun: dokuméntasi dina ramatloka ieu otomatis diropéa.
  3. Dua gambar dirakit pikeun kontur anu béda.
  4. Gawéna gancang, sabab Caching dipaké saloba mungkin - nalika versi anyar tina werf dileupaskeun atawa hook GitHub disebut pikeun review commit, ngan artefak pakait jeung versi robah diwangun deui.
  5. Henteu kedah mikir ngeunaan ngahapus gambar anu henteu dianggo: beberesih dumasar kana kabijakan werf bakal ngajaga pendaptaran Docker dina urutan.

papanggihan

  • Ngagunakeun werf ngamungkinkeun rakitan tiasa dianggo gancang kusabab cache tina assembly sorangan sareng cache nalika damel sareng repositori éksternal.
  • Gawe sareng repositori Git éksternal ngaleungitkeun kabutuhan pikeun clone sadayana gudang unggal waktos atanapi nyiptakeun deui roda kalayan logika optimasi anu rumit. werf ngagunakeun cache sarta ngalakukeun kloning ngan sakali, lajeng ngagunakeun fetch sarta ngan lamun diperlukeun.
  • Kamampuhan ngagunakeun témplat Go dina file konfigurasi ngawangun werf.yaml ngidinan Anjeun pikeun ngajelaskeun hiji assembly nu hasilna gumantung kana data éksternal.
  • Ngagunakeun mount in werf nyata speeds up kumpulan artefak - alatan cache, nu ilahar pikeun sakabéh pipelines.
  • werf ngagampangkeun pikeun ngonpigurasikeun beberesih, anu penting pisan nalika ngawangun sacara dinamis.

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar