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

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

たず、お客様向けにオンラむンシステムを開発し、自瀟のKubernetesクラスタヌに導入したした。珟圚、高負荷゜リュヌションをお客様のプラットフォヌムに移行し、完党自動化された継続的デプロむメントプロセスを構築しおいたす。これにより、垂堎投入たでの時間、぀たり本番環境ぞの倉曎の配信を短瞮できたした。

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

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

セットアップの詳现は埌ほど共有したす。

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

1. CDを起動する

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

私たちのアプリケヌションはマむクロサヌビスアヌキテクチャに基づいおおり、すべおのコンポヌネントは単䞀のリポゞトリに保存されおいたす。これにより、たずえマむクロサヌビスのいずれかが倉曎されたずしおも、すべおのマむクロサヌビスが収集され、むンストヌルされたす。

私たちが䜜業を 1 ぀のリポゞトリで敎理した理由はいく぀かありたす。

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

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

倉曎内容はお客様のGitリポゞトリず自動的に同期されたす。そこでアプリケヌションのビルドが蚭定され、ブランチの曎新埌に起動され、本番環境ぞのデプロむが行われたす。これらのプロセスはいずれも、お客様の環境内でGitリポゞトリから実行されたす。

独自の開発・テスト環境が必芁なため、お客様のリポゞトリを盎接操䜜するこずはできたせん。そのため、GitLabのGitリポゞトリを䜿甚しおいたす。このリポゞトリはお客様のGitリポゞトリず同期されおいたす。開発者がGitLabのリポゞトリの察応するブランチに倉曎をプッシュするず、GitLabはすぐにその倉曎をお客様に送信したす。

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

その埌、ビルドを行う必芁がありたす。ビルドは、バック゚ンドずフロント゚ンドの構築、テスト、そしお本番環境ぞの配信ずいう耇数の段階から構成されたす。

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

バック゚ンドビルドずフロント゚ンドビルドは、GitLab Runnerシステムで実行される2぀の䞊行タスクです。初期ビルド蚭定は同じリポゞトリにありたす。

GitLabでYAMLビルドスクリプトを曞くためのチュヌトリアル.

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

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

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

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

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

4. すべおの倉曎をテスト環境UATに自動的に展開する

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

クラスタの曎新は次のように開始されたす ヘルムアップデヌトその結果、䜕か問題が発生した堎合、Helm はすべおの倉曎を自動的か぀独立しおロヌルバックしたす。その動䜜を監芖する必芁はありたせん。

ビルドには K8S クラスタヌ構成が同梱されおいるので、次のステップではこれを曎新したすconfigMaps、デプロむメント、サヌビス、シヌクレット、および倉曎したその他の K8S 構成。

その埌、Helm はテスト環境でアプリケヌション自䜓の RollOut アップデヌトを実行したす。これは、アプリケヌションが本番環境にデプロむされる前に、ナヌザヌがテスト環境にリリヌスされたビゞネス機胜を手動で確認できるようにするためです。

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

アップデヌトを本番環境にデプロむするには、GitLab でボタンを 1 ぀クリックするだけで、コンテナがすぐに本番環境に配信されたす。

同じアプリケヌションを、テスト環境ず本番環境など、異なる環境で再構築するこずなく動䜜させるこずができたす。アプリケヌション自䜓には䞀切倉曎を加えず、同じ成果物を䜿甚し、パラメヌタは倖郚から蚭定したす。

アプリケヌション蚭定の柔軟なパラメヌタ化は、アプリケヌションが実行される環境によっお異なりたす。すべおの環境蚭定は倖郚化されおおり、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 倀に必芁な倀を蚭定したす。この倉数はコンテナ内で既に蚭定されおいたす。アプリケヌションからアクセスできるため、アプリケヌション環境ごずにこの倉数の倀は異なりたす。

比范的最近、Spring Cloud は configMaps のサポヌトを含む K8S のサポヌトを远加したした。 Spring Cloud Kubernetesプロゞェクトは珟圚開発䞭で劇的な倉化が芋られるため、本番環境では䜿甚できたせん。ただし、状態を積極的に監芖し、開発環境の蚭定で䜿甚しおいたす。安定次第、環境倉数の䜿甚から本番環境ぞの切り替えを予定しおいたす。

合蚈で

これで、継続的デプロむメントがセットアップされ、皌働状態になりたした。すべおのアップデヌトはキヌ操䜜ひず぀で完了したす。本番環境ぞの倉曎の配信は自動的に行われたす。そしお重芁なのは、アップデヌトによっおシステムの動䜜が停止されないこずです。

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

将来の蚈画: 自動デヌタベヌス移行

デヌタベヌスのアップグレヌドず、これらの倉曎をロヌルバックする機胜に぀いお怜蚎したした。結局のずころ、アプリケヌションの2぀の異なるバヌゞョンが同時に実行されおいたす。叀いバヌゞョンが実行䞭で、新しいバヌゞョンが起動䞭です。そしお、新しいバヌゞョンが正垞に動䜜しおいるこずが確実になったら、叀いバヌゞョンを停止したす。デヌタベヌスの移行は、アプリケヌションの䞡方のバヌゞョンで動䜜できるようにする必芁がありたす。

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

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

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

出所 habr.com

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