プロジェクト概要
本記事では、チームでソフトウェア開発を行うためのインフラストラクチャ構成とDevOps環境の準備について説明します。チーム開発の効率化と品質向上を目的として、サーバー構成、コミュニケーション手法、コード管理、CI/CDパイプラインの設定を詳細に記述します。
サーバー環境
プロジェクトで使用するサーバー環境の詳細設定は以下の通りです。
| 項目 | 仕様 |
|---|---|
| プロバイダー | テンセントクラウド |
| ロケーション | 北京リージョン |
| OS | Ubuntu 24.04 LTS |
| CPU/メモリ | 2コア/2GB |
| ストレージ | 40GB SSD |
| ネットワーク帯域 | 3Mbps |
テンセントクラウドを選択した理由は、WeChatミニプログラムエコシステムとの親和性が高く、後続の管理が容易であるためです。また、WeChatミニプログラムは高速なレスポンスが求められるため、北京リージョンを選定しました。その他の仕様はミニプログラムの要件を満たす最小限の構成としています。
チームコミュニケーションとコード管理
- 日常的な連絡にはWeChatを使用
- 週次定例会議にはTencent Meetingを活用
- コード管理にはGitHubを採用
CI/CDパイプライン
継続的インテグレーションおよび継続的デプロイメントにはGitHub Actionsを採用しました。以下にバックエンドとフロントエンドのワークフロー設定を示します。
バックエンドCIワークフロー
name: バックエンドCIパイプライン
# トリガー条件: mainまたはdevブランチへのpushまたはPRで、バックエンドコードに変更があった場合
on:
push:
branches: [main, dev]
paths:
- "api/**"
- ".github/workflows/backend.yml"
pull_request:
branches: [main, dev]
paths:
- "api/**"
jobs:
code-quality:
name: コード品質チェック (Python ${{ matrix.python-version }})
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11"]
# 統合テスト用のサービスコンテナ
services:
db:
image: postgres:16
env:
POSTGRES_USER: dev_user
POSTGRES_PASSWORD: dev_password
POSTGRES_DB: dev_database
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U dev_user"
--health-interval=10s
--health-timeout=5s
--health-retries=5
cache:
image: redis:7
ports:
- 6379:6379
options: >-
--health-cmd="redis-cli ping"
--health-interval=10s
--health-timeout=5s
--health-retries=5
defaults:
run:
working-directory: api
steps:
- name: コードチェックアウト
uses: actions/checkout@v4
- name: Python環境セットアップ
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
# pip依存関係のキャッシュ
- name: pipパッケージのキャッシュ
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('api/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: 依存関係のインストール
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
- name: コードリンティング(Ruff)
run: |
ruff check --fix src/ tests/
ruff format src/ tests/
# 型チェック
- name: 型チェック(mypy)
run: mypy src/ --ignore-missing-imports
# ユニットテストとカバレッジレポート
- name: テスト実行(pytest)
env:
DB_CONNECTION: postgresql://dev_user:dev_password@localhost:5432/dev_database
CACHE_CONNECTION: redis://localhost:6379/0
TEST_MODE: "true"
run: pytest tests/ -v --cov=src --cov-report=term-missing --cov-report=xml
# カバレッジレポートのアップロード
- name: カバレッジレポートのアップロード
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: test-coverage
path: api/coverage.xml
フロントエンドCIワークフロー
name: フロントエンドCIパイプライン
# トリガー条件: mainまたはdevブランチへのpushまたはPRで、フロントエンドコードに変更があった場合
on:
push:
branches: [main, dev]
paths:
- "client/**"
- ".github/workflows/frontend.yml"
pull_request:
branches: [main, dev]
paths:
- "client/**"
jobs:
build-and-lint:
name: ビルドとリンティング
runs-on: ubuntu-latest
defaults:
run:
working-directory: client
steps:
- name: コードチェックアウト
uses: actions/checkout@v4
- name: Node.js環境セットアップ
uses: actions/setup-node@v4
with:
node-version: "18"
# node_modulesのキャッシュ
- name: node_modulesのキャッシュ
uses: actions/cache@v4
with:
path: client/node_modules
key: ${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: 依存関係のインストール
run: npm install
# ESLintによるコードチェック
- name: コードリンティング
run: npm run lint
# WeChatミニプログラムのビルド
- name: WeChatミニプログラムのビルド
run: npm run build:weixin
# ビルド成果物の保存
- name: ビルド成果物のアップロード
if: github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: weixin-build
path: client/dist/build/weixin/
retention-days: 7