Skip to content

Commit fdca1bf

Browse files
committed
docs: Rakefile段階的移行計画を追加
- すべてのRubyスクリプトをRakefileに統合する4フェーズ計画 - 新規開発者の学習時間を1-2時間から5分に短縮する目標 - 実行可能操作のカタログとしてのRakefile活用 - Phase 1は現在のPR #250で最小限実装から開始 - セキュリティと開発者体験(DX)の両立を実現 将来的にすべてのスクリプトをrake -Tで確認可能にする
1 parent 63295b4 commit fdca1bf

File tree

1 file changed

+354
-0
lines changed

1 file changed

+354
-0
lines changed

docs/plan_rakefile_migration.md

Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
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

Comments
 (0)