お客様のプラットフォヌム䞊での継続的デプロむメントの実装

私たち True Engineering は、お客様のサヌバヌに曎新を継続的に配信するプロセスを蚭定しおおり、この経隓を共有したいず考えおいたす。

たず、顧客向けにオンラむン システムを開発し、独自の Kubernetes クラスタヌにデプロむしたした。 珟圚、圓瀟の高負荷゜リュヌションはお客様のプラットフォヌムに移行しおおり、そのプラットフォヌムに察しお完党に自動化された継続的展開プロセスがセットアップされおいたす。 このおかげで、垂堎投入たでの時間が短瞮され、補品環境に倉曎を加えるこずができたした。

この蚘事では、継続的展開 (CD) プロセスたたは顧客のプラットフォヌムぞの曎新の配信のすべおの段階に぀いお説明したす。

  1. このプロセスはどのようにしお始たるのでしょうか?
  2. 顧客の Git リポゞトリずの同期、
  3. バック゚ンドずフロント゚ンドのアセンブリ、
  4. テスト環境でのアプリケヌションの自動展開、
  5. 本番環境ぞの自動デプロむメント。

途䞭で蚭定の詳现を共有したす。

お客様のプラットフォヌム䞊での継続的デプロむメントの実装

1.CDを起動する

継続的デプロむメントは、開発者が Git リポゞトリのリリヌス ブランチに倉曎をプッシュするこずから始たりたす。

私たちのアプリケヌションはマむクロサヌビス アヌキテクチャ䞊で実行され、そのすべおのコンポヌネントは XNUMX ぀のリポゞトリに保存されたす。 このおかげで、マむクロサヌビスの XNUMX ぀が倉曎された堎合でも、すべおのマむクロサヌビスが収集されおむンストヌルされたす。

いく぀かの理由から、XNUMX ぀のリポゞトリを通じお䜜業を敎理したした。

  • 開発の容易さ - アプリケヌションは積極的に開発されおいるため、すべおのコヌドを䞀床に操䜜できたす。
  • 単䞀のシステムずしおのアプリケヌションがすべおのテストに合栌し、顧客の実皌働環境に配信されるこずを保蚌する単䞀の CI/CD パむプラむン。
  • バヌゞョンの混乱を排陀したす。マむクロサヌビスのバヌゞョンのマップを保存し、Helm スクリプトで各マむクロサヌビスの構成を蚘述する必芁がありたせん。

2. お客様の゜ヌスコヌドのGitリポゞトリずの同期

加えられた倉曎は、顧客の Git リポゞトリず自動的に同期されたす。 そこでアプリケヌション アセンブリが構成され、ブランチの曎新埌に起動され、継続ぞのデプロむが行われたす。 どちらのプロセスも、環境内の Git リポゞトリから始たりたす。

開発ずテストには独自の環境が必芁であるため、顧客のリポゞトリを盎接操䜜するこずはできたせん。 圓瀟はこれらの目的で Git リポゞトリを䜿甚しおおり、Git リポゞトリず同期されおいたす。 開発者がリポゞトリの適切なブランチに倉曎を投皿するず、GitLab は盎ちにこれらの倉曎を顧客にプッシュしたす。

お客様のプラットフォヌム䞊での継続的デプロむメントの実装

この埌、組み立おを行う必芁がありたす。 これは、バック゚ンドずフロント゚ンドのアセンブリ、テスト、本番環境ぞの配信ずいう耇数の段階で構成されたす。

3. バック゚ンドずフロント゚ンドの組み立お

バック゚ンドずフロント゚ンドの構築は、GitLab Runner システムで実行される XNUMX ぀の䞊行タスクです。 元のアセンブリ構成は同じリポゞトリにありたす。

GitLab でビルドするための YAML スクリプトを䜜成するためのチュヌトリアル.

GitLab Runner は、必芁なリポゞトリからコヌドを取埗し、Java アプリケヌションのビルド コマンドを䜿甚しおそれをアセンブルし、Docker レゞストリに送信したす。 ここではバック゚ンドずフロント゚ンドを組み立お、Docker むメヌゞを取埗し、それを顧客偎のリポゞトリに眮きたす。 䜿甚する Docker むメヌゞを管理するため グラドルプラグむン.

むメヌゞのバヌゞョンを、Docker で公開されるリリヌス バヌゞョンず同期したす。 スムヌズな操䜜のために、いく぀かの調敎を行いたした。

1. コンテナはテスト環境ず実皌働環境の間で再構築されたせん。 パラメヌタ化を行っお、同じコンテナヌが再構築せずにテスト環境ず運甚環境の䞡方ですべおの蚭定、環境倉数、サヌビスを䜿甚できるようにしたした。

2. Helm 経由でアプリケヌションを曎新するには、そのバヌゞョンを指定する必芁がありたす。 バック゚ンド、フロント゚ンドを構築し、アプリケヌションを曎新したす。これらは 8 ぀の異なるタスクであるため、どこでも同じバヌゞョンのアプリケヌションを䜿甚するこずが重芁です。 KXNUMXS クラスタヌ構成ずアプリケヌションが同じ Git リポゞトリヌにあるため、このタスクでは Git 履歎のデヌタを䜿甚したす。

コマンド実行結果からアプリケヌションのバヌゞョンを取埗したす
git describe --tags --abbrev=7.

4. テスト環境ぞのすべおの倉曎の自動展開 (UAT)

このビルド スクリプトの次のステップは、K8S クラスタヌを自動的に曎新するこずです。 これは、アプリケヌション党䜓が構築され、すべおのアヌティファクトが Docker レゞストリに公開されおいる堎合に発生したす。 この埌、テスト環境のアップデヌトが開始されたす。

クラスタヌの曎新は次を䜿甚しお開始されたす ヘルムのアップデヌト。 その結果、䜕かが蚈画どおりに進たなかった堎合、Helm はすべおの倉曎を自動的か぀個別にロヌルバックしたす。 圌の仕事をコントロヌルする必芁はない。

K8S クラスタヌ構成をアセンブリずずもに提䟛したす。 したがっお、次のステップは、configMap、デプロむメント、サヌビス、シヌクレット、および倉曎したその他の K8S 構成を曎新するこずです。

次に、Helm はテスト環境でアプリケヌション自䜓の RollOut 曎新を実行したす。 アプリケヌションが運甚環境にデプロむされる前。 これは、テスト環境に導入したビゞネス機胜をナヌザヌが手動でテストできるようにするために行われたす。

5. すべおの倉曎を本番環境に自動的にデプロむする

曎新を運甚環境にデプロむするには、GitLab でボタンを XNUMX ぀クリックするだけで、コンテナがすぐに運甚環境に配信されたす。

同じアプリケヌションは、再構築するこずなく、テスト環境ず運甚環境の異なる環境で動䜜できたす。 アプリケヌションでは䜕も倉曎せずに同じ成果物を䜿甚し、パラメヌタヌを倖郚で蚭定したす。

アプリケヌション蚭定の柔軟なパラメヌタ化は、アプリケヌションが実行される環境に応じお異なりたす。 すべおの環境蚭定を倖郚に移動したした。すべおが K8S 構成ず Helm パラメヌタヌを通じおパラメヌタヌ化されたす。 Helm がアセンブリをテスト環境にデプロむするず、テスト蚭定がアセンブリに適甚され、補品蚭定が運甚環境に適甚されたす。

最も困難だったのは、䜿甚されるすべおのサヌビスず環境に䟝存する倉数をパラメヌタ化し、それらを環境倉数ず Helm の環境パラメヌタの説明構成に倉換するこずでした。

アプリケヌション蚭定では環境倉数を䜿甚したす。 それらの倀は、Go テンプレヌトを䜿甚しおテンプレヌト化された K8S configmap を䜿甚しおコンテナヌに蚭定されたす。 たずえば、環境倉数をドメむン名に蚭定するには、次のように実行できたす。

APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}

.Values.global.env – この倉数には、環境 (prod、stage、UAT) の名前が栌玍されたす。
.Values.app.properties.app_external_domain – この倉数では、.Values.yaml ファむル内の目的のドメむンを蚭定したす。

アプリケヌションを曎新するずき、Helm はテンプレヌトから configmap.yaml ファむルを䜜成し、アプリケヌションの曎新が開始される環境に応じお APP_EXTERNAL_DOMAIN 倀に必芁な倀を入力したす。 この倉数はコンテナ内にすでに蚭定されおいたす。 アプリケヌションからアクセスできるため、アプリケヌション環境ごずにこの倉数の倀が異なりたす。

比范的最近、configMaps ずの連携を含む K8S サポヌトが Spring Cloud に登堎したした。 Spring Cloud Kubernetes。 プロゞェクトは積極的に開発され、根本的に倉化しおいたすが、実皌働環境で䜿甚するこずはできたせん。 しかし、私たちはその状態を積極的に監芖し、DEV 構成で䜿甚したす。 安定し次第、環境倉数の䜿甚から移行する予定です。

合蚈で

したがっお、継続的デプロむメントは構成され、機胜しおいたす。 すべおの曎新は XNUMX 回のキヌストロヌクで行われたす。 補品環境ぞの倉曎は自動的に反映されたす。 そしお重芁なのは、アップデヌトによっおシステムが停止するわけではありたせん。

お客様のプラットフォヌム䞊での継続的デプロむメントの実装

今埌の蚈画: デヌタベヌスの自動移行

私たちはデヌタベヌスをアップグレヌドし、これらの倉曎をロヌルバックする可胜性を怜蚎したした。 結局のずころ、アプリケヌションの XNUMX ぀の異なるバヌゞョンが同時に実行されおいたす。叀いバヌゞョンが実行䞭で、新しいバヌゞョンが起動しおいたす。 そしお、新しいバヌゞョンが動䜜するこずが確実な堎合にのみ、叀いバヌゞョンをオフにしたす。 デヌタベヌスを移行するず、䞡方のバヌゞョンのアプリケヌションで䜜業できるようになりたす。

したがっお、列名やその他のデヌタを単玔に倉曎するこずはできたせん。 ただし、新しい列を䜜成し、叀い列からそこにデヌタをコピヌし、デヌタを曎新するずきに別の列で同時にコピヌず曎新を行うトリガヌを䜜成できたす。 たた、アプリケヌションの新しいバヌゞョンのデプロむが成功した埌、リリヌス埌のサポヌト期間が終了するず、䞍芁になった叀い列ずトリガヌを削陀できるようになりたす。

アプリケヌションの新しいバヌゞョンが正しく動䜜しない堎合は、デヌタベヌスの以前のバヌゞョンを含む、以前のバヌゞョンにロヌルバックできたす。 ぀たり、今回の倉曎により、アプリケヌションの耇数のバヌゞョンを同時に䜜業できるようになりたす。

K8S ゞョブを介しおデヌタベヌスの移行を自動化し、CD プロセスに統合する予定です。 そしお、私たちはこの経隓をハブレで必ず共有したす。

出所 habr.com

コメントを远加したす