[CI/CD] Docker + Jenkins + Git Webhookを活用したFastAPIサーバーの自動デプロイまとめ
実戦的な圧縮と自動デプロイの実装
内容整理中 > 2023 年 5 月時点で 1 次更新完了 デプロイ関連の内容は、もう少し整えた 2 編を参照するのがよいです。
はじめに
現在進めているプロジェクトで、AI モデルを活用したアウトプットを提供するサービスを構築していた。
その機能を Firebase Cloud Function で構築したかったが、モデルをロードする過程などで nodeJS + tensorflow.js を使う関係上モデルの変形が避けられず、もともと重いことによるタイムアウトなど、さまざまな形で苦戦したため、AI モデルを通じた結果を返すシンプルなサーバを構築してみることにした。
これに伴いサーバの構築とデプロイ作業が自分の役目となり、一次目標として自動デプロイの実現、その後の追加目標として無停止デプロイまで自分の手で進めることにした。
本記事では AWS などのインスタンスをベースとしたシステム構築および自動デプロイまでだけを扱う。
事前知識
CI: Continuous Integration (継続的インテグレーション)
開発者向けの自動化プロセスで、コード変更点がビルド・テストを経て定期的に共有リポジトリへマージされるという過程。これを自動化することで、開発過程のリスクを減らす手段として使われている
CI Server, Source Control Management, Build Tool, Test Tool などで構成される
CD: Continuous Delivery / Deployment (継続的デリバリー / デプロイ)
デプロイ自動化プロセスを意味し、パイプラインの追加段階を自動化することで、手動の介入なしに変更点が product まで自動的にデプロイされ得る。継続的インテグレーションの裏付けが必要であり、信頼できる環境を作れば 1 日に何度でもリリース可能になる
結果として、こうした CI/CD 過程を通じて製品リリースまでの時間を短縮でき、人員の効率を高め、漸進的かつ継続的なプロセスの連続なので、大きな問題が発生する確率を減らしていける。
Docker 環境のセットアップ
- インスタンス情報
EC2 のフリーティアの代わりに、相対的に条件のよい Oracle Cloud のフリーティアを採用 arm64 ベースの Ampere A1 Compute 2 Core と 12GB RAM を割り当てて使用
このほかにもバックアップなどのオプションを無料である程度サポートしているので参考に!
- Linux のセットアップ EC2 を password で接続する方法 - ログイン関連の利便のため、ssh セットアップを扱う記事 Docker のインストール - Ubuntu 基準の Docker インストール公式 DOCS
筆者が参考にした資料をまとめた。Docker のインストール手順やインスタンスのセットアップに関する記事は多数存在するので、調べながら Docker をセットアップすれば良い。
Docker in Docker のセットアップ (失敗 > API を活用した Docker out of Docker で進行)
使う理由
Docker の上でさらに Docker を扱う理由は、コンテナをコンテナで制御するためであり、基本的にそのコンテナの権限が非常に強くなるためセキュリティ上のリスクは指摘されるが、それ自体として魅力的なのは確かだ。
試したセットアップ方法
1. Docker 上で Jenkins コンテナを構築
まず Jenkins コンテナを Docker で構築する。 Docker Compose を使うとより楽に構築できるので参考に。
docker pull jenkins/jenkins:lts
まず Jenkins LTS 版のコンテナを取得する。
vim docker-compose.yml
yml ファイルをこのコマンドで作成 / 開く。
version: "2.5.0" # compose のバージョンを入力すること
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts # Jenkins LTS 版を使う
restart: always # 自動再起動オプション
ports:
- "8181:8080" # host の 8181 ポートを Jenkins の 8080 ポートに接続
volumes: # host の volume をこのオプションで共有可能
- /home/opendocs/jenkins:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
user: root
privileged: true # Docker In Docker のための重要オプション
yml ファイルに例示コードのように必要な内容を記述する。
docker-compose -f {ファイル名} up
このコマンドで docker-compose.yml をベースにしたセットアップを進められる。ファイル名を変えずに docker-compose.yml そのままなら -f オプションは不要。詳細は Docker Compose Docs を参照すること。
+ sudo を使わずに docker を扱う方法 → Docker グループに現在のユーザーを追加する
# このコマンドで現ユーザーを Docker グループに追加できる
sudo usermod -aG docker $USER
2. Jenkins Container のセットアップ
- 設定した IP アドレスの Docker から割り当てた Port Number でブラウザにアクセス
- Jenkins インストールログに記載されたキーを画面に入力する
# このコマンドでコンテナのログを確認できる
docker logs jenkins
- 推奨プラグインのインストール
問題が起きうるが、ひとまずインストールを完了してから対処すれば良い。 完了せずにいると、未インストールのプラグインに起因する依存性エラーが続く…
- GitHub API Plugin のインストール
Webhook トリガーで動かすためのプラグイン。インストールしたあと、Secret として Git ID/PW を登録しておくこと。
3. GitHub の設定
-
Settings の Developer Settings 内で Token を作る。本記事執筆時点では Classic トークンを使い、repo と admin:repo_hook 程度の権限設定で十分。
-
自動デプロイ対象 Repo の設定で Webhooks に Webhook を追加する。http://{jenkins_url}/github-webhook/ 程度に設定すればよい。最後の / を外すと問題が起きうるのでおとなしく付けておくこと。
4. Jenkins プロジェクトのセットアップ
-
プロジェクトを追加する。
-
ビルド設定 - ソースコード管理で Git を選び、登録済みの Secret を選べば webhook 信号を受け取れる。
-
GitHub hook trigger for GITScm polling オプションを選ばないとトリガーが動作しない。
-
必要に応じてブランチ選定も行い、セットアップを締めくくってテストする。
댓글 작성
게시글에 대한 의견을 남겨 주세요.