티스토리 뷰

카테고리 없음

qb storage 현황

자바바라 2025. 9. 16. 21:52

QuickBuild Configuration 생성 가이드

QuickBuild(Perforce의 CI/CD 도구)에서 여러 configuration들의 스토리지 사용률을 모니터링하고 로그로 출력하며 MySQL에 저장하는 기능을 구현하려면, 별도의 "모니터링 configuration"을 생성. 이 configuration은 Groovy 스크립트를 master step으로 사용해 QuickBuild의 내부 API를 활용하여 모든 configuration의 스토리지 디렉토리를 스캔하고, 사용량 계산.

 1. Configuration 생성 단계
QuickBuild UI에서 다음을 수행하세요:
- 새 Configuration 생성: QuickBuild 대시보드에서 "Create Configuration"을 클릭. 이름은 "Storage Monitoring"으로 설정. 부모 configuration은 루트(root)로 하거나 적절한 상위 config 아래에 배치.
- Storage 설정: Configuration의 "Storage" 탭에서 전용 스토리지 디렉토리를 지정 (예: `/path/to/quickbuild/data/storage/monitoring`). 이는 이 config 자체의 빌드 아티팩트를 저장하기 위함.
- Steps 추가: Master Step 아래에 "Groovy Script" step을 추가. 이 step에서 스크립트를 실행.
- Scheduler 추가: "Triggers" 섹션에서 "Schedule" trigger를 추가해 주기적 실행 (예: 매일 오전 2시, cron 표현식: `0 0 2 * * ?`).
- Variables 설정: Configuration variables로 MySQL 연결 정보를 정의:
  - `MYSQL_URL`: "jdbc:mysql://localhost:3306/quickbuild_db" (DB URL)
  - `MYSQL_USER`: "your_username"
  - `MYSQL_PASSWORD`: "your_password"
  - `MYSQL_DRIVER_CLASS`: "cohttp://m.mysql.cj.jdbc.Driver" (MySQL Connector/J 클래스, QuickBuild 서버에 JDBC 드라이버가 설치되어 있어야 함. 없으면 QuickBuild의 lib 디렉토리에 추가.)
- 권한 설정: 이 configuration을 실행할 사용자가 모든 하위 configuration에 접근할 수 있도록 권한 부여 (Administration > Users/Groups).

이 configuration을 실행하면, QuickBuild의 모든 configuration(자신 포함)의 스토리지 사용률을 계산해 로그로 출력하고 MySQL 테이블에 삽입합니다. 테이블은 미리 생성 (아래 스크립트 설명 참조).

 2. Groovy Script
Master Step의 Groovy Script 필드에 아래 스크립트를 입력하세요. 이 스크립트는:
- QuickBuild API를 사용해 모든 configuration 목록을 가져옴.
- 각 config의 스토리지 디렉토리 크기를 재귀적으로 계산.
- 로그로 출력 (QuickBuild 로그 파일 또는 콘솔에 기록).
- MySQL에 삽입 (테이블: `storage_usage` – 미리 생성 필요).

groovy
import com.pmease.quickbuild.model.*
import com.pmease.quickbuild.plugin.commons.util.*
import java.sql.*
import java.io.File

// MySQL 테이블 생성 SQL (이 스크립트 실행 전에 QuickBuild 외부에서 실행하세요)
// CREATE TABLE IF NOT EXISTS storage_usage (
//   id INT AUTO_INCREMENT PRIMARY KEY,
//   config_id INT NOT NULL,
//   config_name VARCHAR(255) NOT NULL,
//   storage_usage_gb DECIMAL(10,2) NOT NULL,
//   checked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
// );

// 모든 configuration 가져오기 (루트부터 재귀적으로)
def rootConfig = ConfigurationManager.getInstance().getRootConfiguration()
def allConfigs = rootConfig.getDescendants(true) // true: recursive 포함

// 디렉토리 크기 계산 함수 (바이트 단위, 재귀)
def calculateDirectorySize(File dir) {
    if (!dir.exists() || !dir.isDirectory()) {
        return 0L
    }
    long size = 0L
    dir.eachFileRecurse { file ->
        size += file.length()
    }
    return size
}

// MySQL 연결 및 insert 함수
def insertToMySQL(configId, configName, usageGB) {
    def url = vars.get("MYSQL_URL")
    def user = vars.get("MYSQL_USER")
    def password = vars.get("MYSQL_PASSWORD")
    def driverClass = vars.get("MYSQL_DRIVER_CLASS")
    
    try {
        Class.forName(driverClass)
        def conn = DriverManager.getConnection(url, user, password)
        def stmt = conn.prepareStatement("INSERT INTO storage_usage (config_id, config_name, storage_usage_gb) VALUES (?, ?, ?)")
        stmt.setInt(1, configId)
        stmt.setString(2, configName)
        stmt.setDouble(3, usageGB)
        stmt.executeUpdate()
        stmt.close()
        conn.close()
        logger.info("Inserted to MySQL: Config ${configName} usage ${usageGB} GB")
    } catch (Exception e) {
        logger.error("MySQL insert failed for ${configName}: ${e.message}")
    }
}

// 메인 로직: 각 config 처리
allConfigs.each { config ->
    def configId = config.getId()
    def configName = config.getName()
    def storageDir = config.getStorageDir() // QuickBuild API로 스토리지 디렉토리 경로 가져옴
    def totalSizeBytes = calculateDirectorySize(storageDir)
    def usageGB = totalSizeBytes / (1024.0 * 1024 * 1024) // GB로 변환
    
    // 로그 출력 (QuickBuild 로그에 기록됨)
    logger.info("Configuration ID: ${configId}, Name: ${configName}, Storage Dir: ${storageDir.absolutePath}, Usage: ${String.format('%.2f', usageGB)} GB")
    
    // MySQL에 insert
    insertToMySQL(configId, configName, usageGB)
}

// 전체 완료 로그
logger.info("Storage monitoring completed for all ${allConfigs.size()} configurations.")


 3. Script 설명
- import 문: QuickBuild의 모델 클래스(`ConfigurationManager`, `Configuration`)와 유틸리티, Java SQL/File 클래스를 임포트. QuickBuild 환경에서 Groovy는 Java 라이브러리를 자동으로 사용할 수 있음.
- Configuration 목록 가져오기:
  - `ConfigurationManager.getInstance().getRootConfiguration()`: QuickBuild의 루트 configuration을 가져옴.
  - `getDescendants(true)`: 루트 아래 모든 하위 configuration을 재귀적으로 목록화 (자신의 config도 포함). 이는 QuickBuild API의 표준 메서드.
- 스토리지 사용률 계산 (`calculateDirectorySize`):
  - `config.getStorageDir()`: 각 configuration의 전용 스토리지 디렉토리(File 객체)를 반환 (QuickBuild 문서의 Storage tab 참조. 여러 config이 공유할 수 있지만, 이 메서드는 config별 경로 제공).
  - `eachFileRecurse`: Groovy의 File 확장으로 디렉토리를 재귀 스캔하며 파일 크기(`length()`)를 합산. 대형 디렉토리에서 시간이 걸릴 수 있으니, 필요 시 병렬 처리나 캐싱 고려.
  - GB 변환: 바이트를 1024^3으로 나누어 소수점 2자리 포맷.
- 로그 출력 (`logger.info`):
  - QuickBuild의 내장 로거 사용. 실행 로그는 QuickBuild 서버 로그 파일(보통 `/path/to/quickbuild/logs/`)이나 UI의 Build Log에서 확인 가능. 형식: "Configuration ID: 123, Name: MyBuildConfig, Storage Dir: /data/quickbuild/storage/123, Usage: 15.34 GB".
- MySQL Insert (`insertToMySQL`):
  - Variables(`vars.get()`)로 연결 정보 가져옴 (보안 위해 암호화 추천).
  - JDBC 드라이버 로드(`Class.forName`) 후 연결.
  - PreparedStatement로 SQL injection 방지하며 insert. 테이블에 `config_id`, `config_name`, `storage_usage_gb`, `checked_at`(자동 타임스탬프) 저장.
  - 예외 처리: 연결 실패 시 로그만 출력하고 계속 진행.
- 전체 실행:
  - 루프에서 각 config 처리. 대규모 QuickBuild 인스턴스(수백 config)라면 메모리/시간 최적화 필요 (예: 배치 처리).
  - 완료 로그: 총 config 수 출력.

 주의사항
- 성능: 스토리지 디렉토리가 크면 스크립트 실행 시간이 길어짐. QuickBuild의 "Non-interruptible" 옵션으로 설정해 중단 방지.
- MySQL 테이블 생성: 스크립트 위 주석의 SQL을 MySQL 클라이언트(예: MySQL Workbench)에서 실행.
- JDBC 드라이버: QuickBuild 서버의 `conf/lib`에 MySQL Connector/J JAR 추가 (다운로드: mysql.com). 재시작 필요.
- 테스트: 작은 QuickBuild 인스턴스에서 먼저 실행. 로그 확인: Administration > Logs.
- 공유 스토리지: 일부 config이 스토리지를 공유하면 중복 계산될 수 있음. 필요 시 `config.isSharedStorage()` 체크 추가.
- 보안: MySQL 비밀번호는 QuickBuild의 암호화 변수 사용 추천.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함