progress-dashboard/scripts/deploy-to-surge.js
2026-04-03 19:28:30 +09:00

109 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
/**
* Deploy dashboard to Surge.sh
*
* Deploys dashboard.html to Surge.sh
*/
import 'dotenv/config';
import { exec } from 'child_process';
import { promisify } from 'util';
import fs from 'fs/promises';
import path from 'path';
import { fileURLToPath } from 'url';
const execAsync = promisify(exec);
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
async function deployToSurge() {
console.log('🚀 Surge.shにデプロイ中...');
try {
// HTMLファイルの存在確認
const htmlPath = path.join(__dirname, '..', 'output', 'dashboard.html');
try {
await fs.access(htmlPath);
} catch {
console.error('❌ HTMLファイルが見つかりません:', htmlPath);
console.log('💡 先に npm run generate-dashboard を実行してください');
process.exit(1);
}
// デプロイ用ディレクトリを準備
const deployDir = path.join(__dirname, '..', 'dist');
await fs.mkdir(deployDir, { recursive: true });
// HTMLファイルをコピー
const indexPath = path.join(deployDir, 'index.html');
await fs.copyFile(htmlPath, indexPath);
// surge.shのドメイン設定 - 固定ドメインを使用
const domain = process.env.MAGAZINE_SURGE_DOMAIN;
if (!domain) {
console.error('❌ MAGAZINE_SURGE_DOMAIN が設定されていません');
console.log('💡 .env ファイルに MAGAZINE_SURGE_DOMAIN=your-project-dashboard.surge.sh を設定してください');
process.exit(1);
}
console.log(`📝 デプロイ先ドメイン: ${domain}`);
// Surgeでデプロイ
console.log('📤 アップロード中...');
const { stdout, stderr } = await execAsync(
`npx surge --project "${deployDir}" --domain "${domain}"`,
{
env: {
...process.env,
// CI環境でのインタラクティブモードを無効化
CI: 'true',
SURGE_LOGIN: process.env.MAGAZINE_SURGE_LOGIN || '',
SURGE_TOKEN: process.env.MAGAZINE_SURGE_TOKEN || ''
}
}
);
if (stderr && !stderr.includes('Success')) {
console.error('⚠️ Surge警告:', stderr);
}
const deployedUrl = `https://${domain}`;
console.log('✅ デプロイ完了!');
console.log(`🌐 URL: ${deployedUrl}`);
// URLをファイルに保存他のスクリプトから参照用
const dataDir = path.join(__dirname, '..', 'data');
await fs.mkdir(dataDir, { recursive: true });
const urlPath = path.join(dataDir, 'deployed-url.txt');
await fs.writeFile(urlPath, deployedUrl, 'utf-8');
return deployedUrl;
} catch (error) {
console.error('❌ デプロイエラー:', error.message);
if (error.message.includes('surge: command not found') || error.message.includes('surge')) {
console.log('💡 npx surge が実行できません。npm ci を再実行してください。');
}
// 認証エラーの場合
if (error.message.includes('Not authenticated') || error.message.includes('Invalid token')) {
console.log('\n💡 Surge認証が必要です:');
console.log('1. npx surge login でログイン');
console.log('2. または環境変数 SURGE_TOKEN を設定');
console.log(' トークン取得: npx surge token');
}
process.exit(1);
}
}
// 実行
if (import.meta.url === `file://${process.argv[1]}`) {
deployToSurge();
}
export default deployToSurge;