コンテンツにスキップ

デプロイメント概要

KanjiIQは、mainへのプッシュごとにDockerイメージをビルドし、Forgejo Container Registryにプッシュし、k3sクラスターにデプロイする、完全に自動化されたCI/CDパイプラインを使用しています。

パイプラインフロー

graph LR
    A[git push main] --> B[Forgejo Actions<br/>Triggered]
    B --> C[Docker Build<br/>Multi-stage]
    C --> D[Push to Registry<br/><registry>]
    D --> E[kubectl set image<br/>Rolling update]
    E --> F[Rollout Status<br/>Health check]

パスベースのトリガー

各コンポーネントには、関連ファイルが変更された場合にのみトリガーされる独自のワークフローがあります:

ワークフロー トリガーパス イメージ
deploy-frontend.yml frontend/**, Dockerfile.frontend, nginx.frontend.conf jlpt-kanji-frontend
deploy-backend.yml backend/**, Dockerfile.backend jlpt-kanji-backend
deploy-docs.yml docs/**, mkdocs.yml, Dockerfile.docs jlpt-kanji-docs

これにより、ドキュメントページの変更がフロントエンドやバックエンドの再ビルドをトリガーすることはありません。

デプロイメント戦略

KanjiIQはKubernetesのローリングアップデートを使用しています:

  • 更新されたイメージで新しいPodが作成されます
  • 古いPodが終了する前にreadinessプローブが通過する必要があります
  • 新しいバージョンがヘルスチェックに失敗した場合、ロールアウトは自動的に停止されます
  • 2レプリカによるゼロダウンタイムデプロイメント

環境

環境 用途 URL
本番 ライブアプリケーション kanjiiq.com
ステージング リリース前テスト ローカルk8s namespace
開発 ローカル開発 localhost:8080 / localhost:3000

ステージング環境は、独自のPostgreSQLインスタンスを持つ別のKubernetes namespace(jlpt-kanji-staging)で本番マニフェストをミラーリングしています。

イメージタグ付け

すべてのビルドで2つのタグが生成されます:

  • :latest — 常に最新のビルドを指す
  • :COMMIT_SHA — トレーサビリティのための不変タグ

デプロイメントは決定論的なロールアウトを保証するためにコミットSHAタグを使用します:

kubectl set image deployment/jlpt-kanji \
  frontend=<registry>/jlpt-kanji-frontend:abc1234 \
  -n jlpt-kanji