バヌゞョン管理されたドキュメントサむトの䟋を䜿甚しお、werf で Docker むメヌゞを動的にビルドおよびデプロむする

GitOpsツヌルに぀いおはすでに䜕床も話しおきたした ワヌフ今回は、りェブサむト構築の経隓をプロゞェクト自䜓のドキュメントずずもに共有したいず思いたす。 werf.io ロシア語版は ru.werf.io。これは通垞の静的サむトですが、動的な数の成果物を䜿甚しお構築されおいる点でそのアセンブリは興味深いものです。

バヌゞョン管理されたドキュメントサむトの䟋を䜿甚しお、werf で Docker むメヌゞを動的にビルドおよびデプロむする

すべおのバヌゞョンに共通のメニュヌやリリヌスに関する情報を含むペヌゞなどの生成ずいったサむト構造のニュアンスに぀いおは説明したせん。代わりに、動的アセンブリの問題ず機胜、および付随する CI/CD プロセスに぀いお少し焊点を圓おたす。

はじめに: サむトの仕組み

たず、werfのドキュメントがコヌドず䞀緒に保存されるずいう事実から始めたしょう。これは開発に䞀定の芁件を課したすが、この蚘事の範囲倖であるこずは抂ね理解できたすが、少なくずも以䞋の点を指摘できたす。

  • 新しい werf 関数はドキュメントを曎新せずにリリヌスしおはならず、逆に、ドキュメントの倉曎は werf の新しいバヌゞョンのリリヌスを意味したす。
  • このプロゞェクトは非垞に集䞭的に開発されおおり、新しいバヌゞョンが 1 日に数回リリヌスされるこずがありたす。
  • 新しいバヌゞョンのドキュメントを含むサむトを展開するための手動操䜜は、少なくずも面倒です。
  • このプロゞェクトはセマンティックアプロヌチを採甚しおいる バヌゞョン管理5぀の安定性チャネルを備えおいたす。リリヌスプロセスでは、アルファからロック゜リッドたで、安定性が増す順にチャネルを通じおバヌゞョンが順次送信されたす。
  • このサむトにはロシア語版があり、メむン英語版ず䞊行しお「存続し、発展」しおいたす぀たり、コンテンツが曎新されたす。

この「内郚の仕組み」をナヌザヌから隠しお、「ただ動䜜する」ものを提䟛するために、私たちは werfのむンストヌルずアップデヌトのための別のツヌル - です マルチワヌフ䜿甚するリリヌス番号ず安定性チャネルを指定するだけで、multiwerf はチャネルに新しいバヌゞョンがあるかどうかを確認し、必芁に応じおダりンロヌドしたす。

werfの最新バヌゞョンは、サむトのバヌゞョン遞択メニュヌの各チャンネルで利甚可胜です。デフォルトでは、 werf.io/ドキュメント 最新リリヌスの最も安定したチャンネルバヌゞョンが公開され、怜玢゚ンゞンにもむンデックスされたす。チャンネルのドキュメントは別のアドレス䟋 werf.io/v1.0-beta/ドキュメント (ベヌタリリヌス 1.0 の堎合)。

合蚈するず、このサむトでは次のバヌゞョンが利甚可胜です:

  1. ルヌトデフォルトで開きたす、
  2. 各リリヌスのアクティブな曎新チャネルごずに (䟋: werf.io/v1.0-ベヌタ).

サむトの特定のバヌゞョンを生成するには、通垞、以䞋を䜿甚しおコンパむルするだけで十分です。 ゞキル、ディレクトリ内で実行䞭 /docs werfリポゞトリ察応コマンド(jekyll build) で、必芁なバヌゞョンの Git タグに切り替えたした。

残っおいるのは、次の点を付け加えるこずだけです。

  • ナヌティリティ自䜓 (werf) は組み立おに䜿甚されたす。
  • CI/CD プロセスは GitLab CI に基づいお構築されたす。
  • もちろん、これらすべおは Kubernetes で実行されたす。

タスク

ここで、説明したすべおの詳现を考慮したタスクを定匏化しおみたしょう。

  1. 任意のアップデヌトチャネルでwerfバヌゞョンを倉曎した埌 サむト䞊のドキュメントは自動的に曎新される必芁がある.
  2. 成長するには、時には サむトのプレビュヌを衚瀺する.

サむトの再コンパむルは、察応する Git タグから任意のチャネルのバヌゞョンを倉曎した埌に実行する必芁がありたすが、むメヌゞを組み立おるプロセス䞭に次の機胜が埗られたす。

  • チャンネルのバヌゞョンリストは倉曎されるため、バヌゞョンが倉曎されたチャンネルのドキュメントのみを再構築する必芁がありたす。結局のずころ、すべおをれロから再構築するのはあたり良いこずではありたせん。
  • リリヌス甚のチャンネルセットは倉曎される可胜性がありたす。䟋えば、ある時点では、早期アクセス版の1.1リリヌスよりも安定したバヌゞョンがチャンネル䞊に存圚しない可胜性がありたすが、時間の経過ずずもにそれらのバヌゞョンが登堎したす。この堎合、ビルドを手動で倉曎するこずはできたせんよね

これは、こずが刀明 アセンブリは倖郚デヌタの倉曎に䟝存したす.

具珟化

アプロヌチの遞択

あるいは、Kubernetes 内で必芁なバヌゞョンごずに個別のポッドずしお実行するこずもできたす。このオプションでは、クラスタヌ内のオブゞェクト数が増加し、安定した werf リリヌスの数が増えるに぀れおオブゞェクト数も増加したす。たた、これはメンテナンスの耇雑化を招きたす。各バヌゞョンにはそれぞれ負荷の小さい HTTP サヌバヌが甚意されるためです。圓然、リ゜ヌスコストも増加したす。

私たちは同じ道を行きたした 必芁なすべおのバヌゞョンを 1 ぀のむメヌゞにビルドしたすサむトの党バヌゞョンの統蚈デヌタはNGINXコンテナに栌玍され、察応するデプロむメントぞのトラフィックはNGINX Ingressを介しお送信されたす。ステヌトレスアプリケヌションずいうシンプルな構造により、Kubernetes自䜓を䜿甚しお、負荷に応じおデプロむメントを簡単にスケヌルできたす。

より正確に蚀うず、2぀のむメヌゞを構築したす。1぀は本番環境甚、もう1぀は開発環境甚の远加むメヌゞです。远加むメヌゞは、メむンむメヌゞず共に開発環境甚でのみ䜿甚実行され、レビュヌコミットのサむトバヌゞョンを含みたす。これらのむメヌゞ間のルヌティングはIngressリ゜ヌスを䜿甚しお実行されたす。

werf vs git clone ずアヌティファクト

前述の通り、特定のバヌゞョンのドキュメントのサむト統蚈情報を生成するには、察応するリポゞトリタグに切り替えおビルドする必芁がありたす。たた、ビルドのたびにリポゞトリをクロヌンし、リストから察応するタグを遞択するこずもできたす。ただし、これはかなりリ゜ヌスを消費する操䜜であり、さらに耇雑な呜什を蚘述する必芁もありたす。さらに、このアプロヌチではビルド䞭に䜕もキャッシュできないずいう倧きな欠点もありたす。

ここでwerfナヌティリティ自䜓が私たちを助け、実装したす スマヌトキャッシュ そしお、あなたは 倖郚リポゞトリwerfを䜿っおリポゞトリからコヌドを远加するず、werfは基本的にリポゞトリを䞀床クロヌンしおから実行するので、ビルド速床が倧幅に向䞊したす。 のみ fetch 必芁に応じお。さらに、リポゞトリからデヌタを远加する際には、必芁なディレクトリのみを遞択できたすこの堎合は、 docs) により、远加されるデヌタの量が倧幅に削枛されたす。

Jekyllは静的ファむルをコンパむルするために蚭蚈されたツヌルであり、最終むメヌゞには必芁ないので、 アヌティファクトワヌフそしお最終画像では コンパむル結果のみをむンポヌトする.

werf.yamlを曞きたす

そこで、それぞれのバヌゞョンを別々のWerfアヌティファクトにコンパむルするこずにしたした。しかし、 組み立お䞭にこれらのアヌティファクトがいく぀あるかはわかりたせんしたがっお、固定のビルド構成を蚘述するこずはできたせん (厳密に蚀えば、蚘述するこずはできたすが、あたり効率的ではありたせん)。

werfを䜿甚するず Goテンプレヌト 蚭定ファむルwerf.yaml、そしおこれが可胜になる 蚭定を「オンザフラむ」で生成する 倖郚デヌタたさに必芁なものに䟝存したす。この堎合、倖郚デヌタずはバヌゞョンずリリヌスに関する情報であり、それに基づいお必芁な数のアヌティファクトを収集し、結果ずしお2぀のむメヌゞを取埗したす。 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 環境倉数から倀を割り圓おおテンプレヌト倉数をGoしたす。

{{ $_ := 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 }}ただし、アヌティファクトからむンポヌトする堎合は、同じ名前を参照する必芁があるこずに泚意しおください。

アヌティファクトを蚘述する堎合、次の werf 機胜が䜿甚されたす。 取り付けサヌビスディレクトリを指定しおマりントする build_dir パむプラむン実行間でJekyllキャッシュを保存できるため、 再組み立おを倧幅に高速化.

ファむルの䜿甚にも気づいたかもしれたせん releases.yml — は、リリヌスデヌタを芁求するYAMLファむルです。 github.com パむプラむン実行時に埗られる成果物。これはサむトをコンパむルする際に必芁ずなるが、この蚘事の文脈では、その状態が以䞋の芁玠に䟝存するため、興味深い。 たった䞀぀の遺物の再構成 — サむトのルヌト バヌゞョンのアヌティファクト (他のアヌティファクトでは必芁ありたせん)。

これは条件挔算子を䜿甚しお実装されたす。 if Goのテンプレヌトず構造 {{ $Root.Files.Get "releases.yml" | sha256sum }} ステヌゞ䞊 ステヌゞルヌトバヌゞョン倉数 .Channel 等しい rootファむルハッシュ releases.yml これはAnsibleタスク名パラメヌタのコンポヌネントであるため、ステヌゞ党䜓の眲名に圱響したす。 name。したがっお、倉曎する堎合 コンテンツ ファむル releases.yml 察応するアヌティファクトが再構築されたす。

倖郚リポゞトリでの䜜業にも泚意しおください。 werfリポゞトリディレクトリのみが远加されたす /docs枡されたパラメヌタに応じお、必芁なタグたたはレビュヌコミットのデヌタがすぐに远加されたす。

アヌティファクトテンプレヌトを䜿甚しお、転送されたチャネルバヌゞョンずリリヌスのアヌティファクトの説明を生成するには、倉数ごずにルヌプを構成したす。 .WerfVersions в werf.yaml:

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

サむクルは耇数のアヌティファクトを生成するのでそう願っおいたす、それらの間の区切り、぀たりシヌケンスを考慮する必芁がありたす。 --- 蚭定ファむルの構文の詳现に぀いおは、 ドキュメンテヌション。先ほど定矩したように、ルヌプ内でテンプレヌトを呌び出すずきは、バヌゞョン パラメヌタヌ、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 チャンネルずリリヌスバヌゞョンのアヌティファクトをむンポヌトし、先ほど採甚したアヌティファクトの呜名芏則に埓いたす。各アヌティファクトには2぀の蚀語のサむトバヌゞョンが栌玍されおいるため、構成で指定された堎所にむンポヌトしたす。

最終画像の説明 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 -}}

メむンむメヌゞず共に開発回路䞊に起動される远加むメヌゞには、サむトの2぀のバヌゞョンレビュヌコミットのバヌゞョンずサむトのルヌトバヌゞョン共通アセットず、リリヌスデヌタ芚えおいるず思いたすがを含むのみが含たれたすが含たれたす。したがっお、远加むメヌゞはメむンむメヌゞずはむンポヌトセクションそしおもちろん名前のみ異なりたす。

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 ず重芁なニュアンスに぀いお説明したす。

GitLab CIのパむプラむンず動的ビルドの機胜

ビルドを実行する際には、 werf.yamlこれは、GitHub フックからパむプラむンを呌び出すずきに蚭定する REVIEW_SHA 倉数には適甚されたせん。

必芁な倖郚デヌタの圢成をBashスクリプトに移行したす generate_artifactsこれにより、2 ぀の 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 それでした 同じ 少なくずも 1぀のパむプラむン内この条件が満たされない堎合、werfがアセンブリ時ずデプロむメント時に蚈算するステヌゞシグネチャが異なりたす。デプロむメントに必芁なむメヌゞが䞍足するため、デプロむメント゚ラヌが発生したす。

぀たり、サむト むメヌゞのアセンブリ䞭にリリヌスずバヌゞョンに関する情報が同じで、デプロむメント時に新しいバヌゞョンがリリヌスされ、環境倉数の倀が異なる堎合、デプロむメントぱラヌで終了したす。結局、新しいバヌゞョンの成果物はただアセンブリされおいたせん。

䞖代が werf.yaml 倖郚デヌタ䟋えば、今回のケヌスのように珟圚のバヌゞョンのリストに䟝存する堎合は、そのようなデヌタの構成ず倀をパむプラむン内に蚘録する必芁がありたす。これは、倖郚パラメヌタが頻繁に倉曎される堎合に特に重芁です。

私たちは 倖郚デヌタを受信しお​​蚘録する GitLabのパむプラむンの最初のステヌゞプリビルドずいう圢でさらに送信する GitLab CI アヌティファクトこれにより、同じ構成でパむプラむンタスクビルド、デプロむ、クリヌンを実行および再開できるようになりたす。 werf.yaml.

ステヌゞの内容 プリビルド ファむル .gitlab-ci.yml:

Prebuild:
  stage: prebuild
  script:
    - bash ./generate_artifacts 1> common_envs.sh
    - cat ./common_envs.sh
  artifacts:
    paths:
      - releases.yml
      - common_envs.sh
    expire_in: 2 week

アヌティファクトに倖郚デヌタを固定すれば、GitLab CIパむプラむンの暙準ステヌゞであるビルドずデプロむを䜿っおビルドずデプロむを行うこずができたす。パむプラむン自䜓は、werf GitHubリポゞトリのフックを䜿っお起動したすGitHubリポゞトリに倉曎があった堎合など。これらのデヌタは、GitLabプロゞェクトのプロパティのセクションから取埗できたす。 CI/CD 蚭定 -> パむプラむントリガヌ、そしおGitHubで察応するWebhookを䜜成したす蚭定 -> 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はステヌゞからビルドステヌゞに2぀の成果物を远加したす プリビルドなので、準備された入力デヌタを持぀倉数を゚クスポヌトするには、 source common_envs.shパむプラむンをスケゞュヌル通りに起動する堎合を陀き、すべおのケヌスでビルドステヌゞを起動したす。スケゞュヌル通りに起動する堎合は、パむプラむンをクリヌンアップのために起動したす。この堎合、ビルドを実行する必芁はありたせん。

デプロむメント段階では、YAML テンプレヌトを䜿甚しお、本番環境ず開発環境ぞのデプロむメントの 2 ぀のタスクを個別に蚘述したす。

.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がデプロむメントを実行するクラスタコンテキストの指定のみが異なるWERF_KUBE_CONTEXT、茪郭環境倉数の蚭定environment.name О environment.urlはHelm Chartテンプレヌトで䜿甚されたす。テンプレヌトの内容はここでは提䟛したせんが、ここでは以䞋のリンクから参照できたす。 蚘事のリポゞトリ.

最埌の仕䞊げ

werfのバヌゞョンは頻繁にリリヌスされるため、新しいむメヌゞが頻繁にビルドされ、Docker Registryは垞に拡匵されたす。そのため、ポリシヌによる自動むメヌゞクリヌニングの蚭定が必芁です。これは非垞に簡単に蚭定できたす。

実装には次のものが必芁です:

  • クリヌニングステップを远加する .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 Registry内のむメヌゞを削陀する暩限を持぀トヌクンでDocker Registryにログむンする必芁がありたすGitLab CIタスクで自動的に発行されるトヌクンにはそのような暩限はありたせん。トヌクンは事前にGitLabで䜜成し、その倀を環境倉数に指定する必芁がありたす。 WERF_IMAGES_CLEANUP_PASSWORD プロゞェクト CI/CD蚭定 -> 倉数.

必芁なスケゞュヌルで枅掃タスクを远加するには、 CI/CD ->
日皋
.

これで完了です。Docker Registry プロゞェクトは、未䜿甚のむメヌゞから継続的に拡倧するこずはなくなりたす。

実践的な郚分の結論ずしお、この蚘事の完党なリストは以䞋で入手可胜であるこずをお知らせしたいず思いたす。 Gitの:

結果

  1. 論理アセンブリ構造バヌゞョンごずに 1 ぀のアヌティファクトが埗られたした。
  2. アセンブリは汎甚的であり、werf の新しいバヌゞョンがリリヌスされおも手動での倉曎は必芁ありたせん。サむト䞊のドキュメントは自動的に曎新されたす。
  3. 異なる茪郭に察しお 2 ぀の画像が収集されたす。
  4. キャッシュが最倧限に䜿甚されるため、動䜜が高速になりたす。werf の新しいバヌゞョンがリリヌスされるか、レビュヌ コミットのために GitHub フックが呌び出されるず、倉曎されたバヌゞョンの察応する成果物のみが再構築されたす。
  5. 未䜿甚のむメヌゞを削陀する心配はありたせん。werf ポリシヌベヌスのクリヌンアップにより、Docker レゞストリが敎理された状態に保たれたす。

所芋

  • werf を䜿甚するず、ビルド自䜓のキャッシュず倖郚リポゞトリを操䜜するずきのキャッシュの䞡方により、ビルドが高速化されたす。
  • 倖郚のGitリポゞトリを䜿甚するず、毎回リポゞトリを完党にクロヌンしたり、耇雑な最適化ロゞックを䜿っお車茪の再発明をしたりする必芁がなくなりたす。werfはキャッシュを䜿甚しお䞀床だけクロヌンを䜜成し、その埌 fetch 必芁な堎合のみ。
  • ビルド構成ファむルで Go テンプレヌトを䜿甚する機胜 werf.yaml 結果が倖郚デヌタに䟝存するアセンブリを蚘述できたす。
  • werf でマりントを䜿甚するず、すべおのパむプラむンに共通のキャッシュにより、アヌティファクトの収集速床が倧幅に向䞊したす。
  • werf を䜿甚するず、クリヌンアップを簡単に構成できたす。これは、動的ビルドにずっお特に重芁です。

PS

私たちのブログもお読みください:

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster