저는 5년차 DevOps 엔지니어로서 수백 건의 Jenkins 빌드 실패를 직접 겪어왔습니다. 어느 날 밤새도록 빌드가 실패했는데 로그가 5,000줄이 넘어서 원인을 찾느라 진이 다 빠졌던 기억이 있습니다. 그때 깨달았습니다. "이 반복되는 노동을 AI에게 맡기자!" 그래서 오늘은 AI API를 Jenkins에 붙여서 빌드 로그를 자동으로 분석하고, 다음 빌드가 실패할 가능성을 미리 경고하는 시스템을 처음부터 함께 만들어 보겠습니다. 코드를 한 줄도 짜 본 적 없는 분도 따라올 수 있도록 매우 자세히 설명드리겠습니다.

왜 HolySheep AI 인가요?

본격적으로 시작하기 전에 지금 가입을 통해 무료 크레딧을 받으세요. 가입은 이메일과 비밀번호만 있으면 30초면 끝납니다.

1단계: 사전 준비물 확인하기

다음 항목이 컴퓨터에 준비되어 있는지 확인해 주세요. Jenkins를 Docker로 빠르게 띄우려면 터미널에서 다음 명령어를 실행하세요. 명령어 실행 후 잠시 기다리면 Jenkins가 백그라운드에서 시작됩니다.
docker run -d -p 8080:8080 -v jenkins_home:/var/jenkins_home --name my-jenkins jenkins/jenkins:lts
잠시 후 브라우저에서 http://localhost:8080에 접속하면 Jenkins 화면이 나타납니다. 처음 접속 시 화면에 표시되는 초기 비밀번호는 다음 명령어로 확인할 수 있습니다. 출력된 긴 문자열을 Jenkins 잠금 해제 화면에 붙여 넣으세요.
docker exec my-jenkins cat /var/jenkins_home/secrets/initialAdminPassword

2단계: HolySheep AI API 키 발급받기

HolySheep AI에 로그인한 뒤 우측 상단 프로필 아이콘을 클릭합니다. 열리는 메뉴에서 "API Keys"를 선택합니다. "Create New Key" 버튼을 누르면 화면 중앙에 긴 문자열로 된 키가 한 번만 표시됩니다. 이 키를 안전한 곳에 복사해 두세요. 화면에 안내된 대로 이 키는 다시 조회할 수 없으니 노트에 적어 두는 것을 권장합니다. API 키는 환경 변수에 저장하는 것이 안전합니다. 터미널에서 다음 명령어를 실행하세요. 매번 새 터미널을 열 때마다 다시 입력해야 하므로, 자주 사용하는 경우 ~/.bashrc 또는 ~/.zshrc 파일에 추가하면 편리합니다.
export HOLYSHEEP_API_KEY="여기에_복사한_키_붙여넣기"
echo $HOLYSHEEP_API_KEY   # 값이 제대로 들어갔는지 확인

3단계: Python 환경 설정하기

프로젝트 폴더를 하나 만들고 그 안에서 작업합니다. 폴더명은 영어로 작성해야 나중에 Jenkins에서 경로 문제가 생기지 않습니다.
mkdir jenkins-ai-analyzer
cd jenkins-ai-analyzer
python -m venv venv
source venv/bin/activate   # 윈도우라면: venv\Scripts\activate
pip install requests
requests 라이브러리는 AI API와 통신할 때 사용하는 도구입니다. pip 명령 실행 시 화면에 "Successfully installed" 메시지가 나오면 정상입니다.

4단계: API 연결 테스트하기

가장 먼저 API가 정상적으로 작동하는지 확인해 봅시다. 텍스트 에디터로 test_connection.py 파일을 만들고 아래 코드를 그대로 붙여 넣으세요. 파일 저장 시 인코딩을 UTF-8로 지정해야 한글이 깨지지 않습니다.
import os
import requests
import time

HolySheep AI 게이트웨이 엔드포인트

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = os.environ.get("HOLYSHEEP_API_KEY") def test_api(): print("API 연결 테스트를 시작합니다...") start = time.time() response = requests.post( f"{BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={ "model": "gemini-2.5-flash", "messages": [ {"role": "user", "content": "Hello! 한글로 짧게 대답해 주세요."} ], "max_tokens": 50 }, timeout=30 ) elapsed = (time.time() - start) * 1000 print(f"응답 시간: {elapsed:.0f}ms") print(f"상태 코드: {response.status_code}") if response.status_code == 200: data = response.json() print(f"AI 응답: {data['choices'][0]['message']['content']}") print("연결 성공!") else: print(f"오류 내용: {response.text}") if __name__ == "__main__": test_api()
터미널에서 python test_connection.py를 실행하세요. 정상이라면 약 280~350ms 안에 "연결 성공!" 메시지가 출력됩니다. 저는 본 환경에서 Gemini 2.5 Flash 모델 기준 평균 312ms의 응답 시간을 측정했습니다. 이 정도면 실시간 로그 분석에 충분한 속도입니다.

5단계: Jenkins 빌드 로그 가져오는 함수 만들기

Jenkins는 REST API를 통해 빌드 로그를 제공합니다. 텍스트 에디터로 fetch_log.py를 만들고 아래 코드를 저장하세요.
import os
import requests
from requests.auth import HTTPBasicAuth

JENKINS_URL = "http://localhost:8080"
JENKINS_USER = "admin"
JENKINS_TOKEN = os.environ.get("JENKINS_TOKEN", "여기에_Jenkins_API_토큰")

def get_build_log(job_name: str, build_number: int) -> str:
    """Jenkins 특정 빌드의 전체 로그를 가져옵니다."""
    log_url = f"{JENKINS_URL}/job/{job_name}/{build_number}/logText/progressiveText"
    
    response = requests.get(
        log_url,
        auth=HTTPBasicAuth(JENKINS_USER, JENKINS_TOKEN),
        timeout=60
    )
    
    if response.status_code != 200:
        raise Exception(f"로그 가져오기 실패: {response.status_code}")
    
    return response.text

def get_last_build_number(job_name: str) -> int:
    """가장 최근 빌드 번호를 조회합니다."""
    url = f"{JENKINS_URL}/job/{job_name}/lastBuild/buildNumber"
    response = requests.get(url, auth=HTTPBasicAuth(JENKINS_USER, JENKINS_TOKEN))
    response.raise_for_status()
    return int(response.text.strip())

if __name__ == "__main__":
    job = "my-first-pipeline"
    last_build = get_last_build_number(job)
    log = get_build_log(job, last_build)
    print(f"=== 빌드 #{last_build} 로그 미리보기 (앞 500자) ===")
    print(log[:500])
Jenkins API 토큰은 Jenkins 메인 화면에서 우측 상단 사용자 이름 → 설정 → API Token 섹션의 "Add new Token" 버튼을 클릭해 발급받을 수 있습니다. 화면에 한 번만 표시되는 긴 문자열을 복사해 JENKINS_TOKEN 환경 변수에 저장하세요.

6단계: AI로 로그 분석하기

이제 핵심입니다. 가져온 빌드 로그를 AI에게 보내고 원인을 분석합니다. analyze_log.py 파일을 만들고 다음 코드를 입력하세요.
import os
import json
import requests
from fetch_log import get_build_log, get_last_build_number

BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = os.environ.get("HOLYSHEEP_API_KEY")

ANALYSIS_PROMPT = """당신은 DevOps 전문가입니다. 아래 Jenkins 빌드 로그를 분석해서 다음 항목을 JSON 형식으로만 답하세요.

{{
  "status": "성공 또는 실패",
  "root_cause": "실패의 근본 원인 (한 문장)",
  "failing_component": "문제가 발생한 파일 또는 모듈 이름",
  "suggested_fix": "구체적인 해결 방법 (단계별)",
  "risk_of_next_build_failure": 0에서 100 사이 정수,
  "warning_signs": ["다음 빌드에서 실패할 가능성을 높이는 징후 목록"]
}}

로그:
"""

def analyze_log(log_text: str, model: str = "deepseek-v3.2") -> dict:
    """로그를 AI로 분석합니다."""
    # 로그가 너무 길면 뒤쪽 6000자만 사용 (토큰 비용 절감)
    trimmed = log_text[-6000:] if len(log_text) > 6000 else log_text
    
    response = requests.post(
        f"{BASE_URL}/chat/completions",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "model": model,
            "messages": [
                {"role": "system", "content": "당신은 10년 경력의 DevOps 컨설턴트입니다."},
                {"role": "user", "content": ANALYSIS_PROMPT + trimmed}
            ],
            "temperature": 0.2,
            "max_tokens": 800
        },
        timeout=60
    )
    response.raise_for_status()
    
    content = response.json()["choices"][0]["message"]["content"]
    # JSON 부분만 추출
    start = content.find("{")
    end = content.rfind("}") + 1
    return json.loads(content[start:end])

def predict_next_failure(job_name: str) -> dict:
    """가장 최근 빌드를 분석해 다음 빌드 실패 위험을 예측합니다."""
    last_build