|
| 1 | +# Rakefile移行計画:DojoPaaSスクリプトの段階的統合 |
| 2 | + |
| 3 | +## 📝 概要 |
| 4 | + |
| 5 | +DojoPaaSプロジェクトの全Rubyスクリプトを段階的にRakefileに統合し、新規開発者にとって分かりやすい「**実行可能操作のカタログ**」を構築する計画。 |
| 6 | + |
| 7 | +## 🎯 目的と価値 |
| 8 | + |
| 9 | +### 現状の課題 |
| 10 | + |
| 11 | +新規開発者がプロジェクトに参加した際の問題: |
| 12 | +```bash |
| 13 | +# 新規開発者の体験 |
| 14 | +$ ls scripts/ |
| 15 | +deploy.rb initialize_server.rb sakura_server_user_agent.rb smart_wait_helper.rb |
| 16 | +# 「これ何?実行していいの?引数は?」 |
| 17 | + |
| 18 | +$ ls test/ |
| 19 | +check_server_status.rb find_resources.rb test_regex_patterns.rb ... |
| 20 | +# 「テスト?ツール?どっち?」 |
| 21 | +``` |
| 22 | + |
| 23 | +**学習時間**: 1-2時間(README熟読 + 各スクリプト調査) |
| 24 | + |
| 25 | +### Rakefile導入後の価値 |
| 26 | + |
| 27 | +```bash |
| 28 | +$ rake -T |
| 29 | +rake server:find[input] # Find server information by IP address |
| 30 | +rake server:initialize[ip] # Initialize (delete and recreate) a server |
| 31 | +rake deploy:production # Deploy new servers from servers.csv |
| 32 | +rake test:verify[ip] # Verify server setup and connectivity |
| 33 | +# 即座に利用可能な操作が分かる! |
| 34 | +``` |
| 35 | + |
| 36 | +**学習時間**: 1分(`rake -T`実行のみ) |
| 37 | + |
| 38 | +## 🏗️ アーキテクチャ設計 |
| 39 | + |
| 40 | +### 最終形のビジョン |
| 41 | + |
| 42 | +``` |
| 43 | +Rakefile # 📖 実行可能な操作のカタログ |
| 44 | +├── Default Tasks |
| 45 | +│ ├── rake -T # すべての操作を一覧 |
| 46 | +│ └── rake help # 詳細なヘルプ |
| 47 | +├── Server Management |
| 48 | +│ ├── rake server:find # サーバー情報検索 |
| 49 | +│ ├── rake server:initialize # サーバー初期化 |
| 50 | +│ └── rake server:status # ステータス確認 |
| 51 | +├── Deployment |
| 52 | +│ ├── rake deploy:production # 本番デプロイ |
| 53 | +│ └── rake deploy:check # デプロイ前チェック |
| 54 | +├── Testing & Verification |
| 55 | +│ ├── rake test:all # 全テスト実行 |
| 56 | +│ ├── rake test:verify # サーバー検証 |
| 57 | +│ └── rake test:find # リソース検索 |
| 58 | +└── Maintenance |
| 59 | + ├── rake maintenance:cleanup # クリーンアップ |
| 60 | + └── rake maintenance:audit # 監査ログ |
| 61 | +``` |
| 62 | + |
| 63 | +## 📋 段階的移行計画 |
| 64 | + |
| 65 | +### Phase 1: 初期実装(PR #250 - 実施中) |
| 66 | + |
| 67 | +**目的**: 最小限の実装でGitHub Actions統合を実現 |
| 68 | + |
| 69 | +```ruby |
| 70 | +# Rakefile - 最小限の実装 |
| 71 | +namespace :server do |
| 72 | + desc "Find server by IP for initialization request" |
| 73 | + task :find_for_initialization, [:ip] do |t, args| |
| 74 | + require 'ipaddr' |
| 75 | + |
| 76 | + ip = args[:ip] || ENV['IP_ADDRESS'] |
| 77 | + abort "IP address required" unless ip |
| 78 | + |
| 79 | + # Ruby IPAddrで検証(セキュリティ層) |
| 80 | + begin |
| 81 | + validated_ip = IPAddr.new(ip).to_s |
| 82 | + rescue IPAddr::InvalidAddressError |
| 83 | + abort "Invalid IP address: #{ip}" |
| 84 | + end |
| 85 | + |
| 86 | + sh "ruby scripts/initialize_server.rb --find #{validated_ip}" |
| 87 | + end |
| 88 | +end |
| 89 | +``` |
| 90 | + |
| 91 | +**スコープ**: |
| 92 | +- ✅ サーバー初期化依頼の自動応答のみ |
| 93 | +- ✅ IPAddr検証によるセキュリティ強化 |
| 94 | +- ✅ GitHub Actions統合 |
| 95 | + |
| 96 | +**期限**: 2024年1月(PR #250) |
| 97 | + |
| 98 | +### Phase 2: 頻用コマンドの追加 |
| 99 | + |
| 100 | +**目的**: よく使われるスクリプトをRakeタスク化 |
| 101 | + |
| 102 | +```ruby |
| 103 | +namespace :server do |
| 104 | + desc "Initialize (delete and recreate) a server - ⚠️ DESTRUCTIVE" |
| 105 | + task :initialize, [:ip] => [:confirm_destructive] do |t, args| |
| 106 | + sh "ruby scripts/initialize_server.rb --delete #{args[:ip]} --force" |
| 107 | + end |
| 108 | + |
| 109 | + desc "Check server status" |
| 110 | + task :status, [:name] do |t, args| |
| 111 | + sh "ruby test/check_server_status.rb #{args[:name]}" |
| 112 | + end |
| 113 | +end |
| 114 | + |
| 115 | +namespace :deploy do |
| 116 | + desc "Deploy servers from servers.csv to production" |
| 117 | + task :production => [:environment, :validate_csv] do |
| 118 | + sh "bundle exec ruby scripts/deploy.rb" |
| 119 | + end |
| 120 | + |
| 121 | + task :validate_csv do |
| 122 | + sh "bundle exec rake test" # 既存のCSVテスト |
| 123 | + end |
| 124 | +end |
| 125 | + |
| 126 | +namespace :test do |
| 127 | + desc "Find test resources by pattern" |
| 128 | + task :find_resources, [:pattern] do |t, args| |
| 129 | + pattern = args[:pattern] || "" |
| 130 | + sh "ruby test/find_resources.rb #{pattern}" |
| 131 | + end |
| 132 | + |
| 133 | + desc "Verify server setup and connectivity" |
| 134 | + task :verify, [:ip] => [:validate_ip] do |t, args| |
| 135 | + sh "ruby test/verify_server_setup.rb #{args[:ip]}" |
| 136 | + end |
| 137 | +end |
| 138 | +``` |
| 139 | + |
| 140 | +**スコープ**: |
| 141 | +- 日常的に使用される5-7個のタスク |
| 142 | +- 破壊的操作への確認プロンプト追加 |
| 143 | +- 基本的な依存関係の定義 |
| 144 | + |
| 145 | +**期限**: 2024年2月 |
| 146 | + |
| 147 | +### Phase 3: 完全統合 |
| 148 | + |
| 149 | +**目的**: すべてのスクリプトをカタログ化 |
| 150 | + |
| 151 | +```ruby |
| 152 | +# 共通ヘルパーモジュール |
| 153 | +module RakeHelpers |
| 154 | + def validate_ip!(ip) |
| 155 | + require 'ipaddr' |
| 156 | + IPAddr.new(ip).to_s |
| 157 | + rescue IPAddr::InvalidAddressError |
| 158 | + abort "❌ Invalid IP: #{ip}" |
| 159 | + end |
| 160 | + |
| 161 | + def validate_issue_url!(url) |
| 162 | + unless url =~ %r{^https://github\.com/coderdojo-japan/dojopaas/issues/\d+$} |
| 163 | + abort "❌ Invalid Issue URL: #{url}" |
| 164 | + end |
| 165 | + url |
| 166 | + end |
| 167 | + |
| 168 | + def confirm_destructive_action! |
| 169 | + return if ENV['FORCE'] == 'true' |
| 170 | + |
| 171 | + print "⚠️ This is a destructive action. Continue? (yes/no): " |
| 172 | + response = STDIN.gets.chomp |
| 173 | + abort "Cancelled" unless response.downcase == 'yes' |
| 174 | + end |
| 175 | +end |
| 176 | + |
| 177 | +# 内部ライブラリの明示 |
| 178 | +namespace :internal do |
| 179 | + desc "[INTERNAL] Sakura API client library - not for direct execution" |
| 180 | + task :sakura_api do |
| 181 | + abort "This is a library file, not meant to be executed directly" |
| 182 | + end |
| 183 | + |
| 184 | + desc "[INTERNAL] Smart wait helper module" |
| 185 | + task :smart_wait do |
| 186 | + abort "This is a helper module, not meant to be executed directly" |
| 187 | + end |
| 188 | +end |
| 189 | + |
| 190 | +# メンテナンスタスク |
| 191 | +namespace :maintenance do |
| 192 | + desc "Clean up orphaned resources" |
| 193 | + task :cleanup => [:environment, :dry_run_warning] do |
| 194 | + sh "ruby scripts/cleanup_orphaned_resources.rb" |
| 195 | + end |
| 196 | + |
| 197 | + desc "Generate audit report" |
| 198 | + task :audit do |
| 199 | + sh "ruby scripts/generate_audit_report.rb" |
| 200 | + end |
| 201 | +end |
| 202 | +``` |
| 203 | + |
| 204 | +**スコープ**: |
| 205 | +- すべてのスクリプトの分類と整理 |
| 206 | +- 内部ライブラリの明示的な区別 |
| 207 | +- 高度なヘルパー機能の実装 |
| 208 | + |
| 209 | +**期限**: 2024年3月 |
| 210 | + |
| 211 | +### Phase 4: ドキュメント生成 |
| 212 | + |
| 213 | +**目的**: Rakefileから自動的にドキュメント生成 |
| 214 | + |
| 215 | +```ruby |
| 216 | +namespace :docs do |
| 217 | + desc "Generate task documentation in Markdown" |
| 218 | + task :generate do |
| 219 | + output = "# DojoPaaS Available Tasks\n\n" |
| 220 | + output += "Generated at: #{Time.now}\n\n" |
| 221 | + |
| 222 | + # Rakeタスクを解析してMarkdown生成 |
| 223 | + Rake.application.tasks.each do |task| |
| 224 | + next if task.name.start_with?('internal:') |
| 225 | + output += "## `rake #{task.name}`\n" |
| 226 | + output += "#{task.comment}\n\n" if task.comment |
| 227 | + end |
| 228 | + |
| 229 | + File.write('docs/TASKS.md', output) |
| 230 | + puts "📝 Documentation generated: docs/TASKS.md" |
| 231 | + end |
| 232 | +end |
| 233 | +``` |
| 234 | + |
| 235 | +**期限**: 2024年4月 |
| 236 | + |
| 237 | +## 🔒 セキュリティ設計 |
| 238 | + |
| 239 | +### 中央集権的な入力検証 |
| 240 | + |
| 241 | +すべての入力検証をRakefileで一元管理: |
| 242 | + |
| 243 | +```ruby |
| 244 | +# lib/rake_security.rb |
| 245 | +module RakeSecurity |
| 246 | + SAKURA_IP_RANGES = [ |
| 247 | + IPAddr.new("153.127.0.0/16"), # 石狩第二 |
| 248 | + IPAddr.new("163.43.0.0/16"), # 東京 |
| 249 | + IPAddr.new("133.242.0.0/16"), # 大阪 |
| 250 | + ].freeze |
| 251 | + |
| 252 | + def validate_sakura_ip!(ip) |
| 253 | + ip_addr = IPAddr.new(ip) |
| 254 | + |
| 255 | + # プライベートIP除外 |
| 256 | + raise "Private IP not allowed" if ip_addr.private? |
| 257 | + |
| 258 | + # さくらクラウド範囲チェック |
| 259 | + unless SAKURA_IP_RANGES.any? { |range| range.include?(ip_addr) } |
| 260 | + raise "IP not in Sakura Cloud range" |
| 261 | + end |
| 262 | + |
| 263 | + ip_addr.to_s |
| 264 | + end |
| 265 | +end |
| 266 | +``` |
| 267 | + |
| 268 | +## 📊 成功指標 |
| 269 | + |
| 270 | +| 指標 | 現在 | 目標(Phase 4後) | |
| 271 | +|------|------|------------------| |
| 272 | +| **新規開発者の学習時間** | 1-2時間 | 5分以内 | |
| 273 | +| **実行可能操作の発見性** | 低(要調査) | 高(rake -T) | |
| 274 | +| **スクリプトの重複** | あり | なし | |
| 275 | +| **セキュリティ検証** | 分散 | 中央集権 | |
| 276 | +| **ドキュメント同期** | 手動 | 自動生成 | |
| 277 | + |
| 278 | +## 🎯 重要な設計原則 |
| 279 | + |
| 280 | +### 1. Progressive Enhancement(段階的改善) |
| 281 | +- 小さく始めて徐々に拡大 |
| 282 | +- 各フェーズで価値を提供 |
| 283 | +- 後方互換性を維持 |
| 284 | + |
| 285 | +### 2. Self-Documenting(自己文書化) |
| 286 | +- タスク名が操作を説明 |
| 287 | +- `desc`で詳細な説明 |
| 288 | +- `rake -T`で一覧表示 |
| 289 | + |
| 290 | +### 3. Fail-Safe Design(フェイルセーフ設計) |
| 291 | +- 破壊的操作には確認 |
| 292 | +- 入力検証を必須化 |
| 293 | +- エラーメッセージを明確に |
| 294 | + |
| 295 | +### 4. DRY (Don't Repeat Yourself) |
| 296 | +- 共通処理はヘルパーに |
| 297 | +- 設定は一箇所で管理 |
| 298 | +- 重複コードを排除 |
| 299 | + |
| 300 | +## 🚀 実装チェックリスト |
| 301 | + |
| 302 | +### Phase 1(現在のPR) |
| 303 | +- [ ] 基本的なRakefile作成 |
| 304 | +- [ ] server:find_for_initializationタスク実装 |
| 305 | +- [ ] IPAddr検証の組み込み |
| 306 | +- [ ] GitHub Actionsとの統合 |
| 307 | +- [ ] 基本的なヘルプ機能 |
| 308 | + |
| 309 | +### Phase 2 |
| 310 | +- [ ] deploy名前空間の追加 |
| 311 | +- [ ] test名前空間の追加 |
| 312 | +- [ ] 依存関係の定義 |
| 313 | +- [ ] 環境変数の管理 |
| 314 | + |
| 315 | +### Phase 3 |
| 316 | +- [ ] すべてのスクリプトの分類 |
| 317 | +- [ ] 内部ライブラリの区別 |
| 318 | +- [ ] メンテナンスタスクの追加 |
| 319 | +- [ ] 高度なヘルパー機能 |
| 320 | + |
| 321 | +### Phase 4 |
| 322 | +- [ ] 自動ドキュメント生成 |
| 323 | +- [ ] タスクの使用統計 |
| 324 | +- [ ] パフォーマンス最適化 |
| 325 | + |
| 326 | +## 📝 関連ドキュメント |
| 327 | + |
| 328 | +- [GitHub Actions自動化計画](./plan_github_action_initialize.md) |
| 329 | +- [サーバー初期化スクリプト計画](./plan_initialize_server.md) |
| 330 | +- [Rake公式ドキュメント](https://ruby.github.io/rake/) |
| 331 | + |
| 332 | +## 🎉 期待される成果 |
| 333 | + |
| 334 | +**Before(現在)**: |
| 335 | +```bash |
| 336 | +# 新規開発者 |
| 337 | +"どのスクリプトを使えばいい?" |
| 338 | +"引数は何?" |
| 339 | +"実行して大丈夫?" |
| 340 | +# → 不安と時間の浪費 |
| 341 | +``` |
| 342 | + |
| 343 | +**After(完全移行後)**: |
| 344 | +```bash |
| 345 | +$ rake -T |
| 346 | +# すべての操作が一目瞭然! |
| 347 | +$ rake -D server:find |
| 348 | +# 詳細な説明も即座に確認 |
| 349 | +# → 自信を持って作業開始 |
| 350 | +``` |
| 351 | + |
| 352 | +--- |
| 353 | + |
| 354 | +**この計画により、DojoPaaSは新規開発者にとって親しみやすく、既存開発者にとって効率的なプロジェクトへと進化します。** |
0 commit comments