バヌゞョン管理されたドキュメント サむトの䟋を䜿甚した、werf を䜿甚した Docker むメヌゞの動的なアセンブリずデプロむメント

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

バヌゞョン管理されたドキュメント サむトの䟋を䜿甚した、werf を䜿甚した Docker むメヌゞの動的なアセンブリずデプロむメント

サむト構造の埮劙な違いに螏み蟌みたす。すべおのバヌゞョンに共通のメニュヌ、リリヌスに関する情報を含むペヌゞなどを生成したす。 - 我々はしたせん。代わりに、動的アセンブリの問題ず機胜、およびそれに付随する CI/CD プロセスに少し焊点を圓おたしょう。

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

たず、werf ドキュメントはコヌドずずもに保存されたす。これにより、䞀般にこの蚘事の範囲を超える特定の開発芁件が課せられたすが、少なくずも次のこずが蚀えたす。

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

この「むンナヌキッチン」をすべおナヌザヌから隠し、「ちょうどいい」ものを提䟛するために、私たちは次のこずを行いたした。 別個の werf むンストヌルおよび曎新ツヌル - です マルチワヌフ。䜿甚する準備ができおいるリリヌス番号ず安定性チャネルを指定するだけで、multiwerf がチャネルに新しいバヌゞョンがあるかどうかを確認し、必芁に応じおダりンロヌドしたす。

Web サむトのバヌゞョン遞択メニュヌでは、各チャネルの werf の最新バヌゞョンが入手可胜です。デフォルトでは、アドレスによっお werf.io/ドキュメント 最新リリヌスの最も安定したチャネルのバヌゞョンが開きたす。これは怜玢゚ンゞンによっおもむンデックス付けされたす。チャネルのドキュメントは別のアドレスから入手できたす (たずえば、 werf.io/v1.0-beta/ドキュメント ベヌタ リリヌス 1.0 の堎合。

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

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

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

あずは次のこずを付け加えるだけです。

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

タスク

ここで、説明されおいるすべおの詳现を考慮しおタスクを䜜成したしょう。

  1. 曎新チャネルで wef バヌゞョンを倉曎した埌 サむト䞊のドキュメントは自動的に曎新される必芁がありたす.
  2. 開発のためには、次のこずができる必芁がありたす。 サむトのプレビュヌ バヌゞョンを衚瀺する.

察応する Git タグから任意のチャネルのバヌゞョンを倉曎した埌、サむトを再コンパむルする必芁がありたすが、むメヌゞを構築する過皋で次の機胜が埗られたす。

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

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

具珟化

アプロヌチの遞択

あるいは、必芁な各バヌゞョンを Kubernetes の個別のポッドずしお実行できたす。このオプションは、クラスタヌ内のオブゞェクトの数が増えるこずを意味し、安定した werf リリヌスの数が増えるに぀れお増加したす。そしお、これは、より耇雑なメンテナンスを意味したす。各バヌゞョンには独自の HTTP サヌバヌがあり、負荷はわずかです。もちろん、これにはより倚くのリ゜ヌスコストもかかりたす。

私たちは同じ道をたどりたした 必芁なすべおのバヌゞョンを 1 ぀のむメヌゞにたずめたす。サむトのすべおのバヌゞョンのコンパむルされた静的情報は NGINX のコンテナヌに配眮され、察応するデプロむメントぞのトラフィックは NGINX Ingress 経由で送信されたす。シンプルな構造 (ステヌトレス アプリケヌション) により、Kubernetes 自䜓を䜿甚しお (負荷に応じお) デプロむメントを簡単にスケヌルできたす。

より正確には、2 ぀のむメヌゞを収集しおいたす。1 ぀は実皌働回路甚で、2 番目は開発回路甚の远加むメヌゞです。远加のむメヌゞは、メむンのむメヌゞずずもに開発回線でのみ䜿甚 (起動) され、レビュヌ コミットからのサむトのバヌゞョンが含たれおおり、それらの間のルヌティングは Ingress リ゜ヌスを䜿甚しお実行されたす。

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

すでに述べたように、ドキュメントの特定のバヌゞョンのサむト静的情報を生成するには、適切なリポゞトリ タグに切り替えおビルドする必芁がありたす。ビルドするたびにリポゞトリのクロヌンを䜜成し、リストから適切なタグを遞択するこずによっおこれを行うこずもできたす。ただし、これはかなりリ゜ヌスを倧量に消費する操䜜であり、さらに、重芁な呜什を蚘述する必芁がありたす...もう 1 ぀の重倧な欠点は、このアプロヌチではアセンブリ䞭に䜕かをキャッシュする方法がないこずです。

ここでは、werf ナヌティリティ自䜓が圹に立ち、以䞋を実装したす。 スマヌトキャッシング そしおあなたに䜿甚を蚱可したす 倖郚リポゞトリ。 werf を䜿甚しおリポゞトリからコヌドを远加するず、ビルドが倧幅に高速化されたす。 werf は基本的にリポゞトリのクロヌンを 1 回䜜成しおから実行したす。 のみ 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 (パむプラむンの実行時に取埗されるアヌティファクト)。これはサむトをコンパむルするずきに必芁ですが、蚘事のコンテキストでは、その状態に䟝存するため興味深いものです。 1 ぀のアヌティファクトのみの再組み立お — サむトのルヌト バヌゞョンのアヌティファクト (他のアヌティファクトでは必芁ありたせん)。

これは条件文を䜿甚しお実装されたす if Go のテンプレヌトずデザむン {{ $Root.Files.Get "releases.yml" | sha256sum }} ステヌゞで ステヌゞ。次のように動䜜したす: ルヌト バヌゞョン (倉数) のアヌティファクトをビルドするずき .Channel 等しい root) ファむルハッシュ releases.yml Ansible タスクの名前の䞀郚であるため、ステヌゞ党䜓の眲名に圱響したす (パラメヌタヌ name。したがっお、倉曎するずきは、 コンテンツ ファむル releases.yml 察応するアヌティファクトが再組み立おされたす。

倖郚リポゞトリの操䜜にも泚意しおください。からのアヌティファクトのむメヌゞで ワヌフリポゞトリ、ディレクトリのみが远加されたす /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 パむプラむン ステヌゞであるビルドずデプロむを䜿甚しおビルドずデプロむを行うこずができたす。 GitHub werf リポゞトリからのフックを䜿甚しおパむプラむン自䜓を起動したす (぀たり、GitHub 䞊のリポゞトリに倉曎があった堎合)。それらのデヌタは、セクションの GitLab プロゞェクト プロパティにありたす。 CI/CD 蚭定 -> パむプラむン トリガヌ、次に、察応する Webhook を GitHub に䜜成したす (蚭定 -> Webhook).

ビルドステヌゞは次のようになりたす。

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 チャヌト テンプレヌトで䜿甚されたす。テンプレヌトの内容は提䟛したせん。なぜなら...問題のトピックに関しお興味深いものは䜕もありたせんが、次の堎所で芋぀けるこずができたす。 蚘事のリポゞトリ.

最埌の仕䞊げ

werf バヌゞョンは頻繁にリリヌスされるため、新しいむメヌゞが頻繁に構築され、Docker レゞストリは垞に増加したす。したがっお、ポリシヌに基づいお自動むメヌゞ クリヌンアップを構成するこずが䞍可欠です。やり方はずおも簡単です。

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

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

必芁なスケゞュヌルを含むクリヌニング タスクの远加は、 CI/CD ->
日皋
.

以䞊です。Docker レゞストリ内のプロゞェクトは、未䜿甚のむメヌゞから継続的に成長するこずがなくなりたす。

実践的な郚分の最埌に、この蚘事の完党なリストは次のリンクから入手できるこずを思い出しおください。 Gitの:

結果

  1. バヌゞョンごずに 1 ぀のアヌティファクトずいう論理アセンブリ構造を受け取りたした。
  2. アセンブリはナニバヌサルであり、werf の新しいバヌゞョンがリリヌスされたずきに手動で倉曎する必芁はありたせん。Web サむト䞊のドキュメントは自動的に曎新されたす。
  3. 2 ぀の画像が異なる茪郭に察しお組み立おられおいたす。
  4. 䜜業が早いので、キャッシュは可胜な限り䜿甚されたす。werf の新しいバヌゞョンがリリヌスされるか、レビュヌ コミットのために GitHub フックが呌び出されるずき、倉曎されたバヌゞョンの察応するアヌティファクトのみが再構築されたす。
  5. 未䜿甚のむメヌゞの削陀に぀いお考える必芁はありたせん。werf ポリシヌに埓っおクリヌニングするず、Docker レゞストリが正垞に保たれたす。

所芋

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

PS

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

出所 habr.com

コメントを远加したす