DevSecOps/etc

Flask를 활용한 GitHub 프로젝트 자동 빌드 시스템 구축(소스 동기화)

봉의일상 2025. 3. 3. 16:13

개발을 하다 보면 GitHub에 저장된 코드를 자동으로 가져와 빌드하고 실행해야 하는 경우가 많습니다.

이를 위해 Flask와 GitPython을 활용하여 간단한 자동 빌드 시스템을 구축하는 방법을 소개합니다.

1. 개요

이 프로젝트에서는 Flask 웹 서버를 구축하여 다음 기능을 수행하도록 합니다:

  • GitHub에서 지정된 프로젝트를 클론 또는 업데이트
  • 프로젝트 빌드 실행
  • API 호출을 통해 빌드 결과를 확인

2. Ubuntu에서 필요한 패키지 설치

먼저, Python과 필요한 패키지를 설치해야 합니다.

sudo apt update
sudo apt install python3 python3-pip python3-flask python3-git -y

설치 후 Python과 pip 버전을 확인합니다.

python3 --version
pip3 --version

이후 pip를 최신 버전으로 업데이트합니다.

python3 -m pip install --upgrade pip

3. Flask 애플리케이션 코드 작성

아래는 app.py 파일을 생성하고, GitHub에서 소스를 가져와 빌드하는 Flask 애플리케이션 코드입니다.

import os
import subprocess
from flask import Flask, jsonify
import git

app = Flask(__name__)

# GitHub Repository 정보
REPO_URL = "https://github.com/********/my-project-001.git"
CLONE_DIR = "./my-project-001"
BRANCH = "develop"

# 빌드 명령어 (필요에 따라 변경)
BUILD_COMMAND = ["make"]  # 예시: make 사용, 프로젝트에 따라 변경 필요

def clone_or_pull_repo():
    """GitHub에서 소스를 가져오거나 업데이트"""
    if os.path.exists(CLONE_DIR):
        repo = git.Repo(CLONE_DIR)
        repo.git.checkout(BRANCH)  # 브랜치 변경
        repo.remotes.origin.pull()
        return f"Repository updated to {BRANCH} branch"
    else:
        repo = git.Repo.clone_from(REPO_URL, CLONE_DIR, branch=BRANCH)
        return f"Repository cloned with {BRANCH} branch"

@app.route('/update', methods=['GET'])
def update_repo():
    """소스 업데이트"""
    message = clone_or_pull_repo()
    return jsonify({"message": message})

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

4. 백그라운드 실행 방법

Flask 서버가 실행된 후 터미널이 종료되면 프로세스도 함께 종료됩니다. 이를 방지하고 백그라운드에서 실행하려면 아래 방법을 사용할 수 있습니다.

1) nohup 명령어 사용

nohup python3 app.py > flask.log 2>&1 &

이렇게 실행하면 app.py가 백그라운드에서 실행되며, 로그는 flask.log 파일에 기록됩니다.

5. API 사용 방법

>소스 업데이트:

curl http://127.0.0.1:5000/update