개발을 하다 보면 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

1. 개요

웹 애플리케이션 배포를 자동화하는 과정에서 rsync를 활용하면 빠르고 효율적인 동기화가 가능합니다. 특히 GitLab CI/CD, Jenkins 등의 자동화 도구와 연계하면, 코드 변경이 발생했을 때 자동으로 웹 서버에 배포할 수 있습니다. 본 글에서는 GitLab에서 Webhook을 트리거로 사용하여 rsync를 통한 자동 동기화 배포 환경을 구축하는 방법을 다룹니다.

2. rsync를 활용한 배포 자동화 개념

rsync는 증분 전송 방식을 사용하여 변경된 파일만 업데이트할 수 있는 강력한 동기화 도구입니다. 이를 CI/CD 파이프라인에 연계하면 코드가 푸시될 때마다 자동으로 웹 서버에 반영되도록 설정할 수 있습니다.

3. GitLab Webhook + rsync 연계

3.1 GitLab Webhook 설정

GitLab의 Webhook을 활용하여 새로운 코드가 푸시될 때 서버에서 자동으로 배포 스크립트를 실행하도록 설정합니다.

  1. GitLab 프로젝트 설정 → Settings → Webhooks
  2. URL 입력: Webhook을 실행할 서버의 URL (예: http://[your-server-ip]:5000/webhook)
  3. Trigger 선택: Push events 선택
  4. Secret Token 설정 (선택 사항)
  5. Save Webhook 클릭

3.2 Webhook 처리 서버 구성

GitLab Webhook 요청을 받아 rsync를 실행하는 간단한 웹 서버를 Python으로 작성합니다.

from flask import Flask, request
import subprocess

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    if data.get('event_name') == 'push':
        subprocess.run(['bash', '/data/devops/deploy.sh'])
        return 'Deployment started', 200
    return 'Ignored', 400

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

3.3 배포 스크립트 (deploy.sh)

GitLab Webhook이 실행되면 rsync를 이용해 최신 코드를 배포합니다.

#!/bin/bash
GIT_REPO_PATH="/home/user/myproject"
WEB_SERVER_PATH="/var/www/html"

cd $GIT_REPO_PATH
git pull origin main
rsync -avz --delete $GIT_REPO_PATH/ user@webserver:$WEB_SERVER_PATH/

4. GitLab CI/CD와 rsync 연계

GitLab CI/CD를 활용하여 코드가 푸시될 때 rsync를 실행하는 방법도 가능합니다.

4.1 .gitlab-ci.yml 설정

GitLab CI/CD에서 rsync를 실행하는 파이프라인을 설정합니다.

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - rsync -avz --delete ./ user@webserver:/var/www/html/
  only:
    - main

 

1. 개요

파일 전송을 위해 자주 사용되는 rsync, scp, sftp의 성능을 비교하고, 어떤 상황에서 어떤 도구를 선택해야 하는지 살펴봅니다. 이를 위해 실험 및 벤치마크를 수행하여 속도를 비교합니다.

2. 각 도구의 특징

2.1 rsync

  • 특징
    • 증분 전송 방식 (변경된 부분만 전송)
    • SSH를 이용한 보안 전송 가능
    • 압축 옵션 제공으로 네트워크 트래픽 감소 가능
    • 파일 동기화 및 백업에 적합
  • 사용 예시
  • rsync -avz /local/path/ user@remote:/remote/path/

2.2 SCP (Secure Copy Protocol)

  • 특징
    • SSH를 기반으로 한 단순한 파일 복사
    • 전체 파일을 전송 (증분 전송 없음)
    • 다중 파일 전송 시 속도가 느려질 수 있음
    • 설정이 간편하며 보안성이 높음
  • 사용 예시
  • scp -r /local/path/ user@remote:/remote/path/

2.3 SFTP (SSH File Transfer Protocol)

  • 특징
    • SSH를 이용한 파일 전송
    • 상호작용 가능한 인터페이스 제공
    • 다중 파일 전송 시 성능이 우수할 수도 있음
    • FTP보다 보안성이 뛰어나며 원격 파일 관리 가능
  • 사용 예시
  • sftp user@remote sftp> put localfile.txt /remote/path/

3. 성능 비교 실험

3.1 실험 환경

  • 서버 환경: Ubuntu 22.04 LTS, 4 vCPU, 8GB RAM, 1Gbps 네트워크 대역폭
  • 테스트 파일: 1GB 단일 파일, 100MB x 10개 파일, 10KB x 10,000개 파일
  • 네트워크 환경: 로컬 네트워크 및 원격 서버 환경

3.2 벤치마크 결과

파일 유형 RSync SCP SFTP
1GB 단일 파일 빠름 (압축 가능) 중간 느림
100MB x 10개 빠름 (병렬 처리 가능) 중간 느림
10KB x 10,000개 매우 빠름 (변경된 파일만 전송) 느림 빠름 (대량 처리 최적화)

4. 선택 기준

4.1 rsync를 선택해야 할 경우

  • 대량의 파일을 동기화해야 할 때
  • 네트워크 트래픽을 최소화하고 싶을 때
  • 변경된 파일만 업데이트하고 싶을 때

4.2 SCP를 선택해야 할 경우

  • 단순한 파일 복사가 필요할 때
  • 추가적인 설정 없이 빠르게 파일을 전송해야 할 때
  • 보안이 중요한 경우 (SSH 기반)

4.3 SFTP를 선택해야 할 경우

  • GUI 기반의 파일 전송이 필요할 때
  • 원격 서버에서 파일을 관리해야 할 때
  • 대량의 작은 파일을 한 번에 전송해야 할 때

5. 결론

  • 빠른 동기화가 필요하다면 rsync
  • 단순한 파일 전송이 필요하다면 scp
  • 원격 파일 관리 및 대량의 작은 파일 전송이 필요하다면 sftp

각 도구의 특성과 사용 환경을 고려하여 적절한 방식을 선택하는 것이 중요합니다.

1. rsync란?

rsync는 파일 및 디렉터리를 로컬 및 원격 서버 간에 동기화하는 강력한 유틸리티입니다. SSH를 활용한 보안 연결이 가능하며, 증분 전송 방식으로 속도가 빠르고 효율적입니다.

2. rsync 기본 사용법

rsync 명령어의 기본적인 사용법은 다음과 같습니다.

rsync [옵션] 원본 경로 대상 경로

예제:

rsync -avz /local/path/ user@remote:/remote/path/
  • -a : 아카이브 모드(파일 속성 유지 및 하위 디렉터리 포함)
  • -v : 상세 출력
  • -z : 전송 데이터 압축

3. 로컬 디렉터리 간 동기화

같은 서버 내에서 파일을 동기화할 때 사용할 수 있습니다.

rsync -av /source/directory/ /destination/directory/

4. 원격 서버와의 동기화

4.1 로컬 → 원격 서버 동기화

rsync -avz /local/path/ user@remote:/remote/path/

4.2 원격 서버 → 로컬 동기화

rsync -avz user@remote:/remote/path/ /local/path/

4.3 SSH를 통한 보안 전송

기본적으로 rsync는 SSH를 사용하여 원격 서버에 연결합니다.

rsync -avz -e ssh /local/path/ user@remote:/remote/path/

5. 특정 파일 또는 디렉터리 제외하기

--exclude 옵션을 사용하여 특정 파일 또는 디렉터리를 제외할 수 있습니다.

rsync -avz --exclude 'node_modules' /local/path/ user@remote:/remote/path/

여러 개를 제외하려면:

rsync -avz --exclude={'node_modules','*.log'} /local/path/ user@remote:/remote/path/

6. 주기적인 동기화 자동화 (crontab 활용)

6.1 crontab 설정

주기적인 동기화를 위해 crontab을 활용할 수 있습니다.

crontab -e

아래와 같이 입력하면 매일 새벽 2시에 자동으로 동기화가 실행됩니다.

0 2 * * * rsync -avz /local/path/ user@remote:/remote/path/ >> /var/log/rsync.log 2>&1

7. SSH 키 기반 인증을 통한 비밀번호 없는 동기화

비밀번호 입력 없이 rsync를 실행하려면 SSH 키를 설정해야 합니다.

ssh-keygen -t rsa
ssh-copy-id user@remote

이후 rsync 명령어 실행 시 비밀번호 입력 없이 동작합니다.

8. 결론

rsync는 파일 동기화 및 백업을 자동화하는 데 매우 유용한 도구입니다. SSH 키 인증과 crontab을 함께 활용하면 원격 서버와의 파일 동기화를 간편하게 자동화할 수 있습니다.

1. rsync란?

rsync는 파일 및 디렉터리를 효율적으로 동기화하는 강력한 도구입니다.

파일의 변경된 부분만 전송하는 차등 전송(differential transfer) 방식을 사용하여 네트워크 대역폭을 절약하고 빠르게 동기화할 수 있습니다.


2. rsync 기본 사용법

rsync의 기본적인 실행 형식은 다음과 같습니다.

rsync [옵션] 원본 경로 대상 경로

예를 들어, 로컬 디렉터리를 다른 위치로 복사할 때:

rsync -av /home/user/data /backup/

또는 원격 서버에 전송할 때:

rsync -av /home/user/data user@remote:/backup/

3. rsync 주요 옵션 정리

1) 파일 속성을 유지하는 -a (아카이브 모드)

rsync -a source/ destination/
  • 디렉터리 구조, 심볼릭 링크, 권한, 타임스탬프 등을 유지하며 동기화
  • cp -r보다 강력한 파일 복사 기능 제공

2) 전송 진행 상황을 출력하는 -v (verbose)

rsync -av source/ destination/
  • 전송 중인 파일 목록과 진행 사항을 출력
  • 로그 기록용으로 유용

3) 파일 크기를 줄이기 위한 -z (압축)

rsync -az source/ destination/
  • 전송 시 파일을 압축하여 속도를 향상
  • 네트워크 속도를 절약하는 데 효과적

4) 삭제 동기화: --delete

rsync -av --delete source/ destination/
  • 원본에서 삭제된 파일을 대상에서도 삭제하여 정확한 복제 유지
  • 주의: 잘못 사용하면 데이터 손실 가능성이 있음

5) 파일 비교 기준 변경: -u (업데이트된 파일만 복사)

rsync -avu source/ destination/
  • 대상 파일이 이미 최신 버전이라면 덮어쓰지 않음
  • 불필요한 덮어쓰기 방지로 성능 최적화 가능

6) 부분적으로 전송된 파일 유지: --partial

rsync -av --partial source/ destination/
  • 전송 중 중단된 파일을 다시 이어서 복사할 수 있도록 보존
  • 대용량 파일 전송 시 유용

7) 전송 속도 제한: --bwlimit=KBPS

rsync -av --bwlimit=5000 source/ destination/
  • 초당 전송 속도를 제한하여 네트워크 부담 완화
  • 원격 서버가 트래픽 제한이 있는 경우 유용

8) SSH를 통한 원격 전송: -e ssh

rsync -av -e ssh source/ user@remote:/destination/
  • SSH 프로토콜을 사용하여 보안이 강화된 파일 전송
  • SSH 기본 포트가 아닌 경우:
  • rsync -av -e "ssh -p 2222" source/ user@remote:/destination/

9) 특정 파일 제외: --exclude

rsync -av --exclude="*.log" source/ destination/
  • 특정 패턴의 파일을 동기화에서 제외
  • 여러 개 제외 가능:
  • rsync -av --exclude={"*.log","temp/"} source/ destination/

10) 동기화 중 변경된 파일 제외: --ignore-existing

rsync -av --ignore-existing source/ destination/
  • 대상 폴더에 이미 존재하는 파일은 건너뜀

4. rsync 실전 예제

✅ 로컬 폴더를 원격 서버로 백업

rsync -azv --delete /home/user/data user@remote:/backup/
  • 압축(-z), 아카이브(-a), 자세한 로그(-v) 활성화
  • 원본에서 삭제된 파일을 대상에서도 삭제(--delete)

✅ 여러 개의 폴더를 동기화하면서 특정 파일 제외

rsync -av --exclude={"*.log","node_modules/"} /project/ /backup/
  • .log 파일과 node_modules/ 디렉터리는 제외하고 복사

✅ 대역폭 제한을 걸고, 중단된 파일 이어서 복사

rsync -av --bwlimit=2000 --partial source/ destination/
  • 초당 2MB로 속도를 제한하고(--bwlimit=2000), 부분 전송 지원(--partial)

+ Recent posts