Skip to content

Commit 3f9f2a4

Browse files
committed
feat: 個別サーバー作成用のRakeタスクを追加
新機能: - rake server:create[サーバー名] で個別にサーバーを作成可能 - rake server:recreate[サーバー名] で再作成をガイド - 既存のdeploy.rbのロジックを最大限再利用(DRY原則) 使用例: rake "server:create[coderdojo-japan]" 目的: - CI/CDを通さずに即座にサーバーをテスト - SSH修正などの機能テストが容易に - 開発効率の向上
1 parent 8592ec5 commit 3f9f2a4

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed

Rakefile

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,113 @@ namespace :server do
367367
abort "❌ エラー: #{e.message}"
368368
end
369369
end
370+
371+
# ========================================
372+
# 個別サーバー作成タスク(テスト用)
373+
# ========================================
374+
desc "指定したサーバーを個別に作成(テスト用)"
375+
task :create, [:server_name] => [:check_api_credentials] do |t, args|
376+
server_name = args[:server_name]
377+
378+
unless server_name
379+
abort "❌ エラー: サーバー名が必要です\n" \
380+
"使い方: rake server:create[coderdojo-japan]\n" \
381+
"注意: servers.csvに登録されているサーバー名を指定してください"
382+
end
383+
384+
puts "="*60
385+
puts "🚀 DojoPaaS 個別サーバー作成"
386+
puts "="*60
387+
puts ""
388+
puts "サーバー名: #{server_name}"
389+
puts ""
390+
391+
# deploy.rbのCoderDojoSakuraCLIクラスを使用(DRY原則)
392+
require_relative 'scripts/deploy'
393+
394+
cli = CoderDojoSakuraCLI.new([])
395+
success = cli.create_single_server(server_name)
396+
397+
if success
398+
puts ""
399+
puts "="*60
400+
puts "✅ サーバー作成プロセス完了"
401+
puts "="*60
402+
puts ""
403+
puts "【次のステップ】"
404+
puts "1. SSHで接続確認:"
405+
puts " ssh ubuntu@<IPアドレス>"
406+
puts ""
407+
puts "2. スタートアップスクリプトの実行状況確認:"
408+
puts " ssh ubuntu@<IPアドレス> 'sudo tail -f /var/log/cloud-init-output.log'"
409+
puts ""
410+
else
411+
puts ""
412+
puts "="*60
413+
puts "❌ サーバー作成に失敗しました"
414+
puts "="*60
415+
exit 1
416+
end
417+
end
418+
419+
desc "指定したサーバーを再作成(削除して作成)"
420+
task :recreate, [:server_name] => [:check_api_credentials] do |t, args|
421+
server_name = args[:server_name]
422+
423+
unless server_name
424+
abort "❌ エラー: サーバー名が必要です\n" \
425+
"使い方: rake server:recreate[coderdojo-japan]"
426+
end
427+
428+
puts "="*60
429+
puts "🔄 DojoPaaS サーバー再作成"
430+
puts "="*60
431+
puts ""
432+
433+
# 1. まず既存サーバーを検索
434+
puts "📍 ステップ1: 既存サーバーの検索"
435+
require_relative 'scripts/deploy'
436+
require_relative 'scripts/sakura_server_user_agent'
437+
438+
# 初期化パラメータとAPIクライアントのセットアップ
439+
cli = CoderDojoSakuraCLI.new([])
440+
request_params = cli.send(:perform_init_params)
441+
ssua = SakuraServerUserAgent.new(**request_params)
442+
443+
# 既存サーバーを検索
444+
servers = ssua.get_servers()['Servers']
445+
existing_server = servers.find { |s| s['Name'] == server_name }
446+
447+
if existing_server
448+
ip_address = existing_server['Interfaces'].first['IPAddress']
449+
puts " ✅ 既存サーバーが見つかりました"
450+
puts " - サーバー名: #{server_name}"
451+
puts " - IPアドレス: #{ip_address}"
452+
puts ""
453+
454+
# 2. サーバー削除
455+
puts "📍 ステップ2: サーバーの削除"
456+
puts " 削除実行のため、rake server:execute_deletion を使用してください:"
457+
puts " rake \"server:execute_deletion[#{ip_address},true]\""
458+
puts ""
459+
puts " 削除完了後、以下のコマンドで再作成:"
460+
puts " rake \"server:create[#{server_name}]\""
461+
else
462+
puts " ℹ️ サーバーが存在しません。新規作成します。"
463+
puts ""
464+
465+
# 3. サーバー作成
466+
puts "📍 ステップ3: サーバーの新規作成"
467+
success = cli.create_single_server(server_name)
468+
469+
if success
470+
puts "✅ 再作成完了"
471+
else
472+
puts "❌ 作成に失敗しました"
473+
exit 1
474+
end
475+
end
476+
end
370477
end
371478

372479
# ヘルパーメソッド(将来の拡張用に保持)

scripts/deploy.rb

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,74 @@ def run()
7070
puts "the #{RESULT_INSTANCE_CSV} was saved!"
7171
end
7272

73+
# 個別サーバー作成メソッド(Rakeタスク用)
74+
# DRY原則: 既存のロジックを最大限再利用
75+
def create_single_server(server_name)
76+
# 初期化パラメータとAPIクライアントのセットアップ(既存ロジック再利用)
77+
request_params = perform_init_params()
78+
@ssua = SakuraServerUserAgent.new(**request_params)
79+
@ssua.archive_id = initial_archive_id()
80+
81+
# servers.csvから指定されたサーバー情報を取得
82+
server_info = nil
83+
CSV.read(INSTANCE_CSV, headers: true).each do |line|
84+
if line['name'] == server_name
85+
server_info = line
86+
break
87+
end
88+
end
89+
90+
unless server_info
91+
puts "❌ エラー: サーバー '#{server_name}' が servers.csv に見つかりません"
92+
return false
93+
end
94+
95+
# 既存サーバーのチェック
96+
puts '🔍 既存サーバーをチェック中...'
97+
sakura_servers = (@ssua.get_servers())['Servers']
98+
sakura_servers.each do |s|
99+
if s['Name'] == server_name
100+
puts "⚠️ 警告: サーバー '#{server_name}' は既に存在します"
101+
puts " IPアドレス: #{s['Interfaces'].first['IPAddress']}"
102+
puts " 説明: #{s['Description']}"
103+
return false
104+
end
105+
end
106+
107+
# サーバー作成(既存のcreateメソッドを再利用)
108+
puts "🚀 サーバー '#{server_name}' を作成中..."
109+
puts " 説明: #{server_info['description']}"
110+
puts " ブランチ: #{server_info['branch']}"
111+
112+
begin
113+
@ssua.create(
114+
name: server_info['name'],
115+
description: server_info['description'],
116+
pubkey: server_info['pubkey'],
117+
tag: server_info['branch']
118+
)
119+
120+
# 作成結果の確認
121+
sleep(5) # APIの反映待ち
122+
result_servers = (@ssua.get_servers())['Servers']
123+
created_server = result_servers.find { |s| s['Name'] == server_name }
124+
125+
if created_server
126+
puts "✅ サーバー作成成功!"
127+
puts " サーバー名: #{created_server['Name']}"
128+
puts " IPアドレス: #{created_server['Interfaces'].first['IPAddress']}"
129+
puts " 説明: #{created_server['Description']}"
130+
return true
131+
else
132+
puts "❌ サーバー作成に失敗した可能性があります"
133+
return false
134+
end
135+
rescue => e
136+
puts "❌ エラー: #{e.message}"
137+
return false
138+
end
139+
end
140+
73141

74142
private
75143

0 commit comments

Comments
 (0)