サーバー上でコードを実行する必要があるプロジェクトでは、開発中もコードをサーバーへ同期する仕組みが不可欠です。同期手法として以下の3つが考えられます。
- IDEのDeployment機能を使った同期
- Git + 手動pull
- Git + Webhook + 自動pull(CI/CDを模擬)
ローカル環境からGiteeへの同期
- ローカルマシンにGitをインストールする。
- Gitee上でアカウントを作成し、リポジトリを2つ用意する(例:Vueプロジェクト用の
city、Djangoプロジェクト用のmtb)。 - ローカルのコードをGiteeのリポジトリへプッシュする。
# 初回のみGitの初期化とリモート設定 git config --global user.name "Your Name" git config --global user.email "your.email@example.com" cd /path/to/project git init git remote add origin https://gitee.com/username/mtb.git # コードの追加とプッシュ git add . git commit -m "Initial commit" git push -u origin master
Gitee Webhookの設定
Giteeのプロジェクト設定画面からWebhookを追加します。プッシュイベント発生時に指定したURLへPOSTリクエストが送信され、サーバー側で自動処理が可能になります。
自動デプロイスクリプト(Python + Flask)
サーバー上でFlaskアプリを常駐させ、GiteeからのWebhookを受信してコードの更新・依存パッケージのインストールを自動化します。サーバーには事前にGit、Python、Node.js(Vueプロジェクト用)およびFlaskをインストールしておきます。
import os
import subprocess
from flask import Flask, request
app = Flask(__name__)
PROJECT_CONFIG = {
"mtb": {
"base_dir": "/opt/projects",
"install_cmd": "pip install -r requirements.txt"
},
"city": {
"base_dir": "/opt/projects",
"install_cmd": "npm install"
}
}
@app.route("/hook", methods=["POST"])
def handle_webhook():
payload = request.json
full_path = payload["project"]["path"] # 例: "username/mtb"
repo_name = full_path.split("/")[-1]
if repo_name not in PROJECT_CONFIG:
return "Unsupported project", 400
config = PROJECT_CONFIG[repo_name]
base_directory = config["base_dir"]
install_cmd = config["install_cmd"]
target_dir = os.path.join(base_directory, repo_name)
git_url = payload["project"]["git_http_url"]
if not os.path.isdir(target_dir):
subprocess.run(["git", "clone", git_url], cwd=base_directory, check=True)
else:
subprocess.run(["git", "pull", "origin", "master"], cwd=target_dir, check=True)
subprocess.run(install_cmd.split(), cwd=target_dir, check=True)
return "Deployment successful"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9000)
上記スクリプトをdeploy.pyなどとして保存し、python deploy.pyで起動します。事前にGiteeのWebhook送信先をこのサーバーの9000番ポートに設定し、セキュリティグループでポートを開放してください。
データベースの準備
サーバー上でMySQLをセットアップし、Djangoプロジェクト用のデータベースとユーザーを作成します。
CREATE DATABASE mtb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'mtb_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON mtb.* TO 'mtb_user'@'%';
FLUSH PRIVILEGES;
Djangoプロジェクトのデータベース接続設定はlocal_settings.pyなどに記述し、バージョン管理から除外しておきます。設定例を以下に示します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mtb',
'USER': 'mtb_user',
'PASSWORD': 'StrongPassword123!',
'HOST': 'your-server-ip',
'PORT': 3306,
}
}
その後、マイグレーションを実行してテーブルを作成します。
python manage.py makemigrations
python manage.py migrate
依存パッケージの管理
Pythonプロジェクトではpipreqsを使用してrequirements.txtを自動生成できます。
pip install pipreqs
pipreqs ./ --encoding=utf8 --force
生成されたファイルをリポジトリに含めることで、別環境での依存関係再現が容易になります。
アプリケーションの起動と開発ワークフロー
すべての準備が整ったら、サーバー上で各サービスを起動します。
- 自動デプロイ用のFlaskアプリを常時稼働させる。
- Djangoの開発サーバーを起動する(本番相当の検証用)。
ALLOWED_HOSTS = ['*']を設定し、python manage.py runserver 0.0.0.0:8000で起動。
サーバーのセキュリティグループで8000番ポートを開放する。 - Vue開発サーバーを起動し、バックエンドAPIの向き先をサーバーのIPアドレスに変更する。
npm run serve -- --port 80などで起動。
以降の開発では、ローカルでコードを編集しGiteeにプッシュするだけで、Webhook経由でサーバー上のコードが自動更新され、すぐに動作確認が行えるようになります。これはオンライン開発マシンを構築した状態であり、実際の本番環境とはOSや実行方式が異なりますが、迅速な共同検証に役立ちます。