DevSecOps/etc

rsync를 활용한 웹 서버 배포 자동화 (CI/CD 연계)

봉의일상 2025. 3. 2. 22:32

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