Files
2026-07-23 16:15:57 +09:00

251 lines
7.4 KiB
PHP

<?php
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
// header("Content-Type: application/json; charset=utf-8");
// require __DIR__ . '/../vendor/autoload.php'; // AWS SDK 로드
// use Aws\S3\S3Client;
// use Aws\Exception\AwsException;
// // === DB 연결 ===
// $conn = new mysqli('localhost', 'egbim', 'baron3840!!', 'egbim');
// if ($conn->connect_error) {
// http_response_code(500);
// echo json_encode(['message' => 'DB 연결 실패']);
// exit;
// }
// mysqli_set_charset($conn, 'utf8mb4');
// // === 파라미터 ===
// $file_id = $_POST['id'] ?? 0;
// $releaser = $_POST['releaser'] ?? '관리자';
// if (!$file_id) {
// http_response_code(400);
// echo json_encode(['message' => '필수값 누락']);
// exit;
// }
// // === 파일 정보 가져오기 ===
// $res = $conn->query("SELECT * FROM deploy_files WHERE id=".(int)$file_id);
// $file = $res->fetch_assoc();
// if (!$file) {
// http_response_code(404);
// echo json_encode(['message' => '파일 정보 없음']);
// exit;
// }
// $sourceBucket = 'baron-software-test';
// $targetBucket = 'baron-software-release';
// $objectKey = $file['filepath'];
// // === S3 클라이언트 생성 ===
// // Test 버킷 (Read/Delete)
// $testS3 = new S3Client([
// 'version' => 'latest',
// 'region' => 'auto',
// 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com',
// 'credentials' => [
// 'key' => '9ade5915f7abd402db60a87f3b3b6d76', // ✅ write key
// 'secret' => 'a1a1cfd59f739977f98fb73f214894e39dbac9a39b1f6208020aa2e1303ea54c',
// ]
// ]);
// // Release 버킷 (Write)
// $releaseS3 = new S3Client([
// 'version' => 'latest',
// 'region' => 'auto',
// 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com',
// 'credentials' => [
// 'key' => '4d0b8feaf0e12873a3d95bd3aa0b787c',
// 'secret' => 'dc72a027e5263590f0bc89fc0b5a1e6c846cc4f036642430681364c4a9056ca4',
// ]
// ]);
// try {
// // 1. 원본 객체 다운로드
// $object = $testS3->getObject([
// 'Bucket' => $sourceBucket,
// 'Key' => $objectKey,
// ]);
// // 2. Release 버킷에 업로드
// $releaseS3->putObject([
// 'Bucket' => $targetBucket,
// 'Key' => $objectKey,
// 'Body' => $object['Body'],
// ]);
// // 3. Test 버킷에서 원본 삭제
// $testS3->deleteObject([
// 'Bucket' => $sourceBucket,
// 'Key' => $objectKey,
// ]);
// // 4. DB 업데이트
// $stmt = $conn->prepare("UPDATE deploy_files SET release_date=NOW(), releaser=? WHERE id=?");
// $stmt->bind_param("si", $releaser, $file_id);
// $stmt->execute();
// echo json_encode([
// 'status' => 'ok',
// 'message' => '릴리즈 확정 완료',
// 'targetKey' => $objectKey,
// ]);
// } catch (AwsException $e) {
// http_response_code(500);
// echo json_encode([
// 'status' => 'fail',
// 'message' => '릴리즈 실패: '.$e->getAwsErrorMessage(),
// 'error' => $e->getMessage()
// ]);
// }
?>
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
header("Content-Type: application/json; charset=utf-8");
require __DIR__ . '/../vendor/autoload.php'; // AWS SDK 로드
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
// === DB 연결 ===
$conn = new mysqli('localhost', 'egbim', 'baron3840!!', 'egbim');
if ($conn->connect_error) {
http_response_code(500);
echo json_encode(['message' => 'DB 연결 실패']);
exit;
}
mysqli_set_charset($conn, 'utf8mb4');
// === 파라미터 ===
$product_code = $_POST['product_code'] ?? '';
$sw_version = $_POST['sw_version'] ?? '';
// 릴리즈 처리 → releaser를 세션에서 가져옴
$releaser = $_POST['releaser'] ?? '알 수 없음'; // JS에서 넘겨준 userName
$loginId = $_POST['loginId'] ?? ''; // JS에서 넘겨준 loginId
if (!$product_code || !$sw_version) {
http_response_code(400);
echo json_encode(['message' => '필수값 누락']);
exit;
}
// === 대상 파일 목록 조회 ===
$sql = "SELECT * FROM deploy_files WHERE product_code=? AND sw_version=? AND deleted=0";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $product_code, $sw_version);
$stmt->execute();
$res = $stmt->get_result();
$files = [];
while ($row = $res->fetch_assoc()) {
$files[] = $row;
}
$stmt->close();
if (empty($files)) {
http_response_code(404);
echo json_encode(['message' => '해당 버전에 대한 파일이 없습니다.']);
exit;
}
// ✅ 테스트 완료 여부 체크
if (empty($files[0]['test_done_date'])) {
echo json_encode(['status'=>'fail','message'=>'테스트 완료 후 릴리즈 가능합니다.']);
exit;
}
// === 버킷 설정 ===
$sourceBucket = 'baron-software-test';
$targetBucket = 'baron-software-release';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'auto',
'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com',
'credentials' => [
// ❗ source(read/write) + target(write) 권한이 모두 있는 키
'key' => '11d7027f505658acb3aeb40c3955a206',
'secret' => '65a78f6c582e0bdfccc2f431fc7b7be2ba11f999f0a8a87142011eac8b84761f',
]
]);
$success = [];
$failed = [];
foreach ($files as $file) {
$objectKey = $file['filepath'];
try {
// 1. CopyObject (테스트 → 릴리즈)
$s3->copyObject([
'Bucket' => $targetBucket,
'Key' => $objectKey,
'CopySource' => $sourceBucket . '/' . $objectKey,
]);
// 2. 원본 삭제 (테스트 버킷)
$s3->deleteObject([
'Bucket' => $sourceBucket,
'Key' => $objectKey,
]);
$success[] = $objectKey;
} catch (AwsException $e) {
$failed[] = $objectKey;
}
}
if (!empty($failed)) {
// ❌ 하나라도 실패 → 전체 실패 처리
echo json_encode([
'status' => 'fail',
'message' => '릴리즈 실패: 일부 파일 이동 오류',
'failed' => $failed
]);
exit;
}
// ✅ 여기까지 오면 전체 이동 성공
// 1) deploy_files 업데이트
$stmt = $conn->prepare("
UPDATE deploy_files
SET release_date = NOW(), releaser = ?
WHERE product_code=? AND sw_version=? AND deleted=0
");
$stmt->bind_param("sss", $releaser, $product_code, $sw_version);
$stmt->execute();
$stmt->close();
// 2) deploy_versions.family_version 갱신
$stmt2 = $conn->prepare("
INSERT INTO deploy_versions (product_code, family_version, updated_at)
VALUES (?, ?, NOW())
ON DUPLICATE KEY UPDATE
family_version = VALUES(family_version),
updated_at = NOW()
");
$stmt2->bind_param("ss", $product_code, $sw_version);
$stmt2->execute();
$stmt2->close();
// 최종 응답
echo json_encode([
'status' => 'ok',
'message' => '릴리즈 확정 완료',
'moved' => $success,
'release_date' => date('Y-m-d H:i:s'),
'releaser' => $releaser
]);