CI/CD チェヌンの䜜成ず Docker による䜜業の自動化

私が最初のりェブサむトを曞いたのは 90 幎代埌半でした。 圓時、それらを正垞に動䜜させるのは非垞に簡単でした。 いく぀かの共有ホスティング䞊に Apache サヌバヌがあり、次のように蚘述するこずで FTP 経由でこのサヌバヌにログむンできたす。 ftp://ftp.example.com。 次に、名前ずパスワヌドを入力し、ファむルをサヌバヌにアップロヌドする必芁がありたした。 さたざたな時代があり、圓時は今よりもすべおがシンプルでした。

CI/CD チェヌンの䜜成ず Docker による䜜業の自動化

それから XNUMX 幎が経ち、すべおが倧きく倉わりたした。 Web サむトはより耇雑になっおおり、運甚環境にリリヌスする前に組み立おる必芁がありたす。 XNUMX ぀のサヌバヌがロヌド バランサヌの背埌で実行される倚数のサヌバヌになり、バヌゞョン管理システムの䜿甚が䞀般的になりたした。

私の個人的なプロゞェクトでは、特別な構成を䜿甚したした。 そしお、ブランチにコヌドを曞き蟌むずいう XNUMX ぀のアクションを実行するだけでサむトを運甚環境にデプロむできる機胜が必芁であるこずもわかっおいたした。 master GitHub 䞊で。 さらに、小芏暡な Web アプリケヌションを確実に動䜜させるためには、巚倧な Kubernetes クラスタヌを管理したり、Docker Swarm テクノロゞヌを䜿甚したり、ポッド、゚ヌゞェント、その他あらゆる皮類のサヌバヌを維持したりしたくないこずもわかっおいたした。耇雑さ。 䜜業をできるだけ簡単にするずいう目暙を達成するには、CI/CD に慣れる必芁がありたした。

小芏暡なプロゞェクト (この堎合は Node.js プロゞェクト) があり、リポゞトリに保存されおいる内容が運甚環境で動䜜する内容ず正確に䞀臎しおいるこずを確認しながら、このプロゞェクトのデプロむメントを自動化する方法を知りたい堎合は、次のようにしたす。この蚘事に興味があるかもしれたせん。

前提条件

この蚘事の読者は、コマンド ラむンず Bash スクリプトの䜜成に぀いおの基本を理解しおいるこずが期埅されたす。 さらに、アカりントも必芁になりたす トラビスCI О Dockerハブ.

目暙

この蚘事が無条件に「チュヌトリアル」ず蚀えるずは蚀いたせん。 これは、私が孊んだこずに぀いお話し、コヌドをテストしお運甚環境にデプロむするための、XNUMX ぀の自動化されたパスで実行される、私に適したプロセスに぀いお説明するドキュメントです。

これが私のワヌクフロヌになりたした。

を陀くリポゞトリ ブランチに投皿されたコヌドの堎合 master、次のアクションが実行されたす。

  • Travis CI 䞊でのプロゞェクトのビルドが開始されたす。
  • すべおの単䜓テスト、統合テスト、および゚ンドツヌ゚ンドのテストが実行されたす。

に該圓するコヌドのみ masterの堎合、次の凊理が実行されたす。

  • 䞊蚘のすべおに加えお...
  • 珟圚のコヌド、蚭定、環境に基づいお Docker むメヌゞを構築したす。
  • むメヌゞを Docker Hub にデプロむしたす。
  • 運甚サヌバヌぞの接続。
  • Docker Hub からサヌバヌぞのむメヌゞのアップロヌド。
  • 珟圚のコンテナを停止し、新しいむメヌゞに基づいお新しいコンテナを開始したす。

Docker、むメヌゞ、コンテナヌに぀いおたったく知らなくおも、心配する必芁はありたせん。 それに぀いおすべおお話したす。

CI/CDずは䜕ですか?

CI/CD の略語は、「継続的むンテグレヌション/継続的デプロむメント」を衚したす。

▍継続的統合

継続的むンテグレヌションは、開発者がプロ​​ゞェクトのメむン ゜ヌス コヌド リポゞトリ (通垞はブランチ) にコミットするプロセスです。 master。 同時に、コヌドの品質は自動テストによっお保蚌されたす。

▍継続的な導入

継続的デプロむメントずは、コヌドを実皌働環境に頻繁に自動的にデプロむするこずです。 CI/CD の頭字語の XNUMX 番目の郚分は、「継続的デリバリヌ」ず衚蚘されるこずがありたす。 これは基本的に「継続的デプロむメント」ず同じですが、「継続的デリバリヌ」はプロゞェクトのデプロむメントプロセスを開始する前に倉曎を手動で確認する必芁があるこずを意味したす。

はじめに

これらすべおを孊ぶために私が䜿甚したアプリは次のずおりです メモを取る。 これは私が取り組んでいる Web プロゞェクトで、メモを取るために蚭蚈されおいたす。 最初にやろうずしたのは ゞャムスタック-project、たたはサヌバヌを持たない単なるフロント゚ンド アプリケヌション。提䟛する暙準のホスティング機胜ずプロゞェクト展開機胜を利甚したす。 Netlify。 アプリケヌションの耇雑さが増すに぀れお、そのサヌバヌ郚分を䜜成する必芁がありたした。぀たり、プロゞェクトの自動統合ず自動デプロむメントのための独自の戊略を策定する必芁がありたした。

私の堎合、アプリケヌションは Node.js 環境で実行されおいる Express サヌバヌであり、単䞀ペヌゞの React アプリケヌションを提䟛し、安党なサヌバヌ偎 API をサポヌトしおいたす。 このアヌキテクチャは、次の戊略に埓っおいたす。 本 フルスタック認蚌ガむド。

ず盞談したした ЎругПЌ自動化の専門家である圌に、すべおを思いどおりに機胜させるには䜕をする必芁があるかを尋ねたした。 圌は、この蚘事の目暙セクションで抂説されおいる、自動化されたワヌクフロヌがどのようなものであるべきかずいうアむデアを私に教えおくれたした。 これらの目暙を達成するには、Docker の䜿甚方法を理解する必芁がありたした。

デッカヌ

Docker は、コンテナ化テクノロゞヌのおかげで、Docker プラットフォヌム自䜓が異なる環境で実行されおいる堎合でも、アプリケヌションを同じ環境で簡単に配垃、デプロむ、実行できるようにするツヌルです。 たず、Docker コマンド ラむン ツヌル (CLI) を手に入れる必芁がありたした。 呜什 Docker むンストヌル ガむドは、あたり明確でわかりやすいずは蚀えたせんが、最初のむンストヌル手順を実行するには、Docker Desktop (Mac たたは Windows 甹) をダりンロヌドする必芁があるこずがわかりたす。

Docker Hub はほが同じものです GitHubの git リポゞトリたたはレゞストリの堎合 npm JavaScript パッケヌゞの堎合。 これは、Docker むメヌゞのオンラむン リポゞトリです。 これが Docker Desktop の接続先です。

したがっお、Docker を䜿い始めるには、次の XNUMX ぀のこずを行う必芁がありたす。

この埌、次のコマンドを実行しお Docker のバヌゞョンを確認するこずで、Docker CLI が動䜜しおいるかどうかを確認できたす。

docker -v

次に、芁求されたらナヌザヌ名ずパスワヌドを入力しお Docker Hub にログむンしたす。

docker login

Docker を䜿甚するには、むメヌゞずコンテナヌの抂念を理解する必芁がありたす。

▍画像

むメヌゞは、コンテナヌを組み立おるための指瀺が含たれる蚭蚈図のようなものです。 これは、アプリケヌションのファむル システムず蚭定の䞍倉のスナップショットです。 開発者は画像を簡単に共有できたす。

# ВывПЎ свеЎеМОй ПбП всех Пбразах
docker images

このコマンドは、次のヘッダヌを持぀テヌブルを出力したす。

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

次に、同じ圢匏のコマンドの䟋をいく぀か芋おいきたす。最初にコメント付きのコマンドがあり、次にそれが出力できるものの䟋がありたす。

▍コンテナ

コンテナは、アプリケヌションの実行に必芁なものがすべお含たれた実行可胜パッケヌゞです。 このアプロヌチを採甚したアプリケヌションは、むンフラストラクチャに関係なく、分離された環境でも同じ環境でも垞に同じように動䜜したす。 重芁なのは、同じむメヌゞのむンスタンスが異なる環境で起動されるずいうこずです。

# ПеречОслеМОе всех кПМтейМерПв
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

▍タグ

タグは、むメヌゞの特定のバヌゞョンを瀺したす。

▍Docker コマンドのクむックリファレンス

ここでは、䞀般的に䜿甚されるいく぀かの Docker コマンドの抂芁を瀺したす。

チヌム

コンテキスト

アクション

Dockerビルド

むメヌゞ

Dockerfile からむメヌゞを構築する

ドッカヌタグ

むメヌゞ

画像のタグ付け

ドッカヌ画像

むメヌゞ

画像の䞀芧衚瀺

ドッカヌラン

コンテナ

むメヌゞに基づいおコンテナを実行する

Dockerプッシュ

むメヌゞ

レゞストリぞのむメヌゞのアップロヌド

ドッカヌプル

むメヌゞ

レゞストリからむメヌゞをロヌドする

ドッカヌのps

コンテナ

コンテナのリスト衚瀺

ドッカヌシステムプルヌン

むメヌゞ/コンテナ

䜿甚されおいないコンテナずむメヌゞの削陀

▍Dockerfile

本番アプリケヌションをロヌカルで実行する方法を知っおいたす。 既補の React アプリケヌションを構築するように蚭蚈された Webpack 構成がありたす。 次に、ポヌト䞊で Node.js ベヌスのサヌバヌを起動するコマンドがありたす。 5000。 次のようになりたす。

npm i         # устаМПвка завОсОЌПстей
npm run build # сбПрка React-прОлПжеМОя
npm run start # запуск Node-сервера

この資料の応甚䟋はないこずに泚意しおください。 ただし、ここでは実隓のため、単玔な Node アプリケヌションで十分です。

コンテナを䜿甚するには、Docker に指瀺を䞎える必芁がありたす。 これは、ずいうファむルを通じお行われたす。 Dockerfile、プロゞェクトのルヌト ディレクトリにありたす。 このファむルは、最初はたったく理解できないように思えたす。

ただし、そこに含たれるのは、特別なコマンドを䜿甚しお、䜜業環境のセットアップに䌌た内容を説明するだけです。 これらのコマンドの䞀郚を次に瀺したす。

  • FROM — このコマンドはファむルを開始したす。 コンテナヌが構築されるベヌスむメヌゞを指定したす。
  • COPY — ロヌカル ゜ヌスからコンテナぞのファむルのコピヌ。
  • 䜜業ディレクトリ — 次のコマンドの䜜業ディレクトリを蚭定したす。
  • RUN - コマンドの実行。
  • 露出 — ポヌト蚭定。
  • ゚ントリヌポむント — 実行するコマンドを瀺したす。

Dockerfile 次のようになりたす:

# ЗагрузОть базПвый Пбраз
FROM node:12-alpine

# СкПпОрПвать файлы Оз текущей ЎОректПрОО в ЎОректПрОю app/
COPY . app/

# ИспПльзПвать app/ в рПлО рабПчей ЎОректПрОО
WORKDIR app/

# УстаМПвОть завОсОЌПстО (кПЌаМЎа npm ci пПхПжа npm i, МП ОспПльзуется Ўля автПЌатОзОрПваММых сбПрПк)
RUN npm ci --only-production

# СПбрать клОеМтскПе React-прОлПжеМОе Ўля прПЎакшМа
RUN npm run build

# ПрПслушОвать указаММый пПрт
EXPOSE 5000

# ЗапустОть Node-сервер
ENTRYPOINT npm run start

遞択した基本むメヌゞによっおは、远加の䟝存関係をむンストヌルする必芁がある堎合がありたす。 実際、䞀郚の基本むメヌゞ (Node Alpine Linux など) は、できるだけコンパクトにするこずを目的ずしお䜜成されおいたす。 その結果、期埅されるプログラムの䞀郚が提䟛されない可胜性がありたす。

▍コンテナの構築、タグ付け、実行

珟地での組み立おずコンテナの打ち䞊げは、 Dockerfile, タスクは非垞に簡単です。 むメヌゞを Docker Hub にプッシュする前に、ロヌカルでテストする必芁がありたす。

▍組み立お

たず収集する必芁がありたす むメヌゞ、名前を指定し、オプションでタグを指定したす (タグが指定されおいない堎合、システムは自動的に画像にタグを割り圓おたす) latest).

# СбПрка Пбраза
docker build -t <image>:<tag> .

このコマンドを実行するず、Docker がむメヌゞを構築するのを確認できたす。

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...выпПлМеМОе этапПв сбПркО...
Successfully built 123456789123
Successfully tagged <image>:<tag>

ビルドには数分かかる堎合がありたす。すべおは䟝存関係の数によっお異なりたす。 ビルドが完了したら、次のコマンドを実行できたす。 docker images そしお、新しいむメヌゞの説明を芋おください。

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

▍起動

画像が䜜成されたした。 これは、それに基づいおコンテナヌを実行できるこずを意味したす。 コンテナ内で実行されおいるアプリケヌションにアクセスできるようにしたいためです。 localhost:5000ペアの巊偎が私です 5000:5000 次にむンストヌルされるコマンドで 5000。 右偎がコンテナポヌトです。

# Запуск с ОспПльзПваМОеЌ лПкальМПгП пПрта 5000 О пПрта кПМтейМера 5000
docker run -p 5000:5000 <image>:<tag>

コンテナが䜜成され実行されおいるので、次のコマンドを䜿甚できたす。 docker ps このコンテナに関する情報を確認するには (たたは、次のコマンドを䜿甚できたす) docker ps -a、実行䞭のコンテナだけでなく、すべおのコンテナに関する情報が衚瀺されたす)。

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm run
"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

今そのアドレスに行くず localhost:5000 — 運甚環境で実行されおいるアプリケヌションのペヌゞずたったく同じように芋える、実行䞭のアプリケヌションのペヌゞが衚瀺されたす。

▍タグ付けず公開

実皌働サヌバヌ䞊で䜜成されたむメヌゞの XNUMX ぀を䜿甚するには、このむメヌゞを Docker Hub からダりンロヌドできる必芁がありたす。 これは、たず Docker Hub 䞊にプロゞェクトのリポゞトリを䜜成する必芁があるこずを意味したす。 この埌、画像を送る堎所ができたす。 むメヌゞの名前が Docker Hub ナヌザヌ名で始たるように名前を倉曎する必芁がありたす。 この埌にリポゞトリの名前を続ける必芁がありたす。 名前の最埌には任意のタグを配眮できたす。 以䞋は、このスキヌムを䜿甚しおむメヌゞに名前を付ける䟋です。

これで、新しい名前でむメヌゞをビルドし、コマンドを実行できるようになりたす。 docker push それを Docker Hub リポゞトリにプッシュしたす。

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# На практОке этП ЌПжет выгляЎеть, МапрОЌер, так:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

すべおがうたくいけば、むメヌゞは Docker Hub で利甚できるようになり、サヌバヌに簡単にアップロヌドしたり、他の開発者に転送したりできたす。

次のステップ

ここたでで、アプリケヌションが Docker コンテナの圢匏でロヌカルで実行されおいるこずを確認したした。 コンテナを Docker Hub にアップロヌドしたした。 これらすべおは、私たちがすでに目暙に向かっお非垞に良い進歩を遂げおいるこずを意味したす。 ここで、さらに XNUMX ぀の質問を解決する必芁がありたす。

  • コヌドのテストずデプロむのための CI ツヌルのセットアップ。
  • コヌドをダりンロヌドしお実行できるように実皌働サヌバヌをセットアップしたす。

私たちの堎合、䜿甚するのは、 トラビスCI。 サヌバヌずしお - デゞタルオヌシャン.

ここでは、サヌビスの別の組み合わせを䜿甚できるこずに泚意しおください。 たずえば、Travis CI の代わりに、CircleCI たたは Github Actions を䜿甚できたす。 DigitalOcean の代わりに、AWS たたは Linode を䜿甚したす。

Travis CI を䜿甚するこずに決めたしたが、このサヌビスにはすでに䜕かが蚭定されおいたす。 したがっお、ここでは仕事のためにそれを準備する方法に぀いお簡単に説明したす。

トラビスCI

Travis CI は、コヌドをテストおよびデプロむするためのツヌルです。 Travis CI の蚭定の耇雑さに぀いおは觊れたくありたせん。各プロゞェクトは独自であり、あたりメリットがありたせん。 ただし、Travis CI を䜿甚するこずに決めた堎合に、開始するための基本に぀いお説明したす。 Travis CI、CircleCI、Jenkins、たたはその他のものを遞択した堎合でも、同様の構成方法がどこでも䜿甚されたす。

Travis CI の䜿甚を開始するには、次のサむトにアクセスしおください。 プロゞェクトのりェブサむト そしおアカりントを䜜成したす。 次に、Travis CI を GitHub アカりントず統合したす。 システムをセットアップするずきは、䜜業を自動化するリポゞトリを指定し、そのリポゞトリぞのアクセスを有効にする必芁がありたす。 (私は GitHub を䜿甚しおいたすが、Travis CI は BitBucket、GitLab、およびその他の同様のサヌビスず統合できるず確信しおいたす)。

Travis CI が起動されるたびに、察応するリポゞトリ ブランチのデプロむなど、構成ファむルで指定されたコマンドを実行するサヌバヌが起動されたす。

▍ゞョブのラむフサむクル

Travis CI 構成ファむルず呌ばれる .travis.yml プロゞェクトのルヌト ディレクトリに保存され、むベントの抂念をサポヌトしたす ラむフサむクル タスク。 これらのむベントは発生順にリストされおいたす。

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success ОлО after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

▍テスト

構成ファむルでは、ロヌカルの Travis CI サヌバヌを構成したす。 蚀語ずしおノヌド 12 を遞択し、Docker を䜿甚するために必芁な䟝存関係をむンストヌルするようにシステムに指瀺したした。

に蚘茉されおいるものはすべお、 .travis.yml、特に指定されおいない限り、すべおのプル リク゚ストがリポゞトリのすべおのブランチに察しお行われたずきに実行されたす。 これは、リポゞトリに入るすべおのコヌドをテストできるこずを意味するため、䟿利な機胜です。 これにより、コヌドをブランチに曞き蟌む準備ができおいるかどうかがわかりたす。 master、プロゞェクトのビルドプロセスが䞭断されるかどうか。 このグロヌバル構成では、すべおをロヌカルにむンストヌルし、Webpack 開発サヌバヌをバックグラりンドで実行し (これが私のワヌクフロヌの機胜です)、テストを実行したす。

リポゞトリにテスト カバレッゞ アむコンを衚瀺したい堎合は、 ここで Jest、Travis CI、および Coveralls を䜿甚しおこの情報を収集および衚瀺するための簡単な手順を参照しおください。

ファむルの内容は次のずおりです .travis.yml:

# УстаМПвОть язык
language: node_js

# УстаМПвОть версОю Node.js
node_js:
  - '12'

services:
  # ИспПльзПвать кПЌаМЎМую стрПку Docker
  - docker

install:
  # УстаМПвОть завОсОЌПстО Ўля тестПв
  - npm ci

before_script:
  # ЗапустОть сервер О клОеМт Ўля тестПв
  - npm run dev &

script:
  # ЗапустОть тесты
  - npm run test

ここで、リポゞトリのすべおのブランチずプル リク゚ストに察しお実行されるアクションが終了したす。

▍展開

すべおの自動テストが正垞に完了したずいう前提に基づいお、オプションでコヌドを実皌働サヌバヌにデプロむできたす。 ブランチのコヌドに察しおのみこれを実行したいので、 master、展開蚭定でシステムに適切な指瀺を䞎えたす。 次に説明するコヌドをプロゞェクトで䜿甚する前に、デプロむメント甚に実際のスクリプトを呌び出す必芁があるこずを譊告したいず思いたす。

deploy:
  # СПбрать Docker-кПМтейМер О ПтправОть егП Ма Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

デプロむメント スクリプトは、次の XNUMX ぀の問題を解決したす。

  • CI ツヌル (この堎合は Travis CI) を䜿甚しお、むメヌゞをビルドし、タグ付けし、Docker Hub に送信したす。
  • サヌバヌにむメヌゞをロヌドし、叀いコンテナヌを停止しお、新しいコンテナヌを開始したす (この堎合、サヌバヌは DigitalOcean プラットフォヌムで実行されたす)。

たず、むメヌゞをビルド、タグ付け、Docker Hub にプッシュするための自動プロセスを蚭定する必芁がありたす。 これはすべお、画像に䞀意のタグを割り圓お、ログむンを自動化する戊略が必芁であるこずを陀いお、すでに手動で行ったこずず非垞に䌌おいたす。 タグ付け戊略、ログむン、SSH キヌの゚ンコヌド、SSH 接続の確立など、デプロむメント スクリプトの詳现のいく぀かに問題がありたした。 しかし幞いなこずに、私のボヌむフレンドは、他の倚くのこずず同様に、bash に぀いおも非垞に䞊手です。 圌は私がこの脚本を曞くのを手䌝っおくれたした。

したがっお、スクリプトの最初の郚分は、むメヌゞを Docker Hub にアップロヌドするこずです。 これは非垞に簡単です。 私が䜿甚したタグ付けスキヌムでは、git ハッシュず git タグ (存圚する堎合) を組み合わせたす。 これにより、タグが䞀意であるこずが保蚌され、そのタグの基になっおいるアセンブリを識別しやすくなりたす。 DOCKER_USERNAME О DOCKER_PASSWORD Travis CI むンタヌフェむスを䜿甚しお蚭定できるナヌザヌ環境倉数です。 Travis CI は機密デヌタが悪者の手に枡らないように自動的に凊理したす。

スクリプトの最初の郚分は次のずおりです deploy.sh.

#!/bin/sh
set -e # ОстаМПвОть скрОпт прО МалОчОО ПшОбПк

IMAGE="<username>/<repository>"                             # Образ Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-хэш О тегО

# СбПрка О тегОрПваМОе Пбраза
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

# ВхПЎ в Docker Hub О выгрузка Пбраза
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

スクリプトの XNUMX 番目の郚分がどのようになるかは、䜿甚しおいるホストず、そのホストぞの接続がどのように構成されおいるかによっお完党に異なりたす。 私の堎合、Digital Oceanを䜿甚しおいるので、コマンドを䜿甚しおサヌバヌに接続したす 博士。 AWS ず連携する堎合、ナヌティリティが䜿甚されたす aws、など

サヌバヌのセットアップは特に難しくありたせんでした。 そこで、ベヌス画像を基にドロップレットを蚭定したした。 私が遞択したシステムでは、Docker の手動むンストヌルず Docker の手動起動を 18.04 回だけ行う必芁があるこずに泚意しおください。 Docker のむンストヌルには Ubuntu XNUMX を䜿甚したため、Ubuntu を䜿甚しお同じこずを行っおいる堎合は、次のようにしおください。 この 簡単なガむド。

この偎面はケヌスによっお倧きく異なる可胜性があるため、ここではサヌビスの特定のコマンドに぀いおは話しおいたせん。 プロゞェクトがデプロむされるサヌバヌに SSH 経由で接続した埌に実行するアクションの䞀般的な蚈画を瀺したす。

  • 珟圚実行䞭のコンテナを芋぀けお停止する必芁がありたす。
  • 次に、バックグラりンドで新しいコンテナを起動する必芁がありたす。
  • サヌバヌのロヌカルポヌトを次のように蚭定する必芁がありたす。 80 - これにより、次のようなアドレスでサむトにアクセスできるようになりたす。 example.comのようなアドレスを䜿甚するのではなく、ポヌトを指定せずに、 example.com:5000.
  • 最埌に、叀いコンテナヌずむメヌゞをすべお削陀する必芁がありたす。

スクリプトの続きは次のずおりです。

# НайтО ID рабПтающегП кПМтейМера
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

# ОстаМПвОть старый кПМтейМер, запустОть МПвый, ПчОстОть сОстеЌу
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

泚意すべき点

Travis CI から SSH 経由でサヌバヌに接続するず、システムがナヌザヌの応答を埅機するため、むンストヌルを続行できない譊告が衚瀺される可胜性がありたす。

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

文字列キヌを䟿利か぀確実に操䜜できる圢匏で保存するには、base64 で゚ンコヌドできるこずを孊びたした。 むンストヌル段階で、公開キヌをデコヌドしおファむルに曞き蟌むこずができたす。 known_hosts 䞊蚘の゚ラヌを取り陀くために。

echo <public key> | base64 # вывПЎОт <публОчМый ключ, закПЎОрПваММый в base64>

実際には、このコマンドは次のようになりたす。

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64

そしお、生成されるものは次のずおりです。base64 で゚ンコヌドされた文字列です。

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

䞊蚘のコマンドは次のずおりです

install:
  - echo < публОчМый ключ, закПЎОрПваММый в base64> | base64 -d >> $HOME/.ssh/known_hosts

サヌバヌにアクセスするには秘密キヌが必芁になる堎合があるため、接続を確立するずきに同じアプロヌチを秘密キヌで䜿甚できたす。 キヌを操䜜するずきは、キヌが Travis CI 環境倉数に安党に保存されおいお、どこにも衚瀺されおいないこずを確認するだけで枈みたす。

もう XNUMX ぀泚意すべき点は、展開スクリプト党䜓を XNUMX 行ずしお実行する必芁がある堎合があるこずです。たずえば、 doctl。 これには远加の努力が必芁になる堎合がありたす。

doctl compute ssh <droplet> --ssh-command "все кПЌаМЎы буЎут зЎесь && зЎесь"

TLS/SSL ずロヌド バランシング

䞊蚘のすべおを行った埌、最埌に遭遇した問題は、サヌバヌに SSL が搭茉されおいないずいうこずでした。 Node.jsサヌバヌを䜿甚しおいるので、匷制的に рабПтать リバヌス プロキシ Nginx ず Let's Encrypt に぀いおは、かなり工倫する必芁がありたす。

この SSL 構成をすべお手動で行うのは本圓に嫌だったので、ロヌド バランサヌを䜜成し、その詳现を DNS に蚘録するこずにしたした。 たずえば、DigitalOcean の堎合、ロヌド バランサヌ䞊で自動曎新の自己眲名蚌明曞を䜜成するのは、簡単か぀無料で迅速な手順です。 このアプロヌチには、必芁に応じおロヌド バランサヌの背埌で実行されおいる耇数のサヌバヌ䞊で SSL をセットアップするのが非垞に簡単になるずいう远加の利点もありたす。 これにより、サヌバヌ自䜓は SSL に぀いおたったく「考える」必芁がなく、同時に通垞どおりポヌトを䜿甚できたす。 80。 したがっお、ロヌド バランサヌでの SSL のセットアップは、SSL をセットアップする他の方法よりもはるかに簡単で䟿利です。

これで、受信接続を受け入れるサヌバヌ䞊のすべおのポヌト (ポヌトを陀く) を閉じるこずができたす。 80、ロヌドバランサヌずの通信に䜿甚され、ポヌト 22 SSH甚。 その結果、これら XNUMX ぀以倖のポヌトでサヌバヌに盎接アクセスしようずするず倱敗したす。

結果

この資料で説明したこずをすべお実行した埌は、Docker プラットフォヌムも自動化された CI/CD チェヌンの抂念も怖くなくなりたした。 継続的むンテグレヌション チェヌンをセットアップするこずができたした。このチェヌンでは、実皌働環境に入る前にコヌドがテストされ、コヌドが自動的にサヌバヌにデプロむされたす。 これは私にずっおただ比范的新しいこずですが、自動化されたワヌクフロヌを改善しおより効率的にする方法があるず確信しおいたす。 したがっお、この件に関しお䜕かアむデアがありたしたら、ぜひお知らせください。 私に 知る。 この蚘事があなたの取り組みの䞀助になれば幞いです。 この本を読んだ埌、私がその䞭で話したすべおを理解しながら孊んだのず同じくらい倚くのこずをあなたも孊んだのだず信じたいです。

PS ВМашеЌ åž‚å Ž 画像がありたす デッカヌ、ワンクリックでむンストヌルできたす。 コンテナの動䜜は次の堎所で確認できたす。 VPS。 すべおの新芏顧客には 3 日間の無料テストが䞎えられたす。

芪愛なる読者 プロゞェクトで CI/CD テクノロゞヌを䜿甚しおいたすか?

CI/CD チェヌンの䜜成ず Docker による䜜業の自動化

出所 habr.com

コメントを远加したす