git hook을 통한 단순 배포

sangyong·2025년 2월 25일
0

웹개발

목록 보기
6/7

1. 배포 개요

기본 개념: 로컬에서 Git에 push하면 서버의 Bare Repository에 코드가 업데이트되고, Git Hook(주로 post-receive)이 실행되어 최신 코드가 지정한 배포 디렉토리(DEPLOY_DIR)로 복사됩니다.

GIT_DIR: Git의 버전 관리 데이터가 저장되는 Bare Repository의 경로
DEPLOY_DIR: 실제 웹 서버나 애플리케이션이 실행되는 디렉토리

2. 서버 설정

2.1 Bare Repository 생성

ssh youruser@server.example.com
cd /your/path/repo           # 실제 경로 대신 /your/path 사용 (보안상)
mkdir myapp.git && cd myapp.git
git init --bare

주의: 실제 서버의 경로, 사용자명, IP 등은 환경에 맞게 수정하세요.

2.2 post-receive Git Hook 설정

  1. 스크립트 작성 위치:/your/path/repo/myapp.git/hooks/post-receive
  2. 예시 스크립트:
#!/bin/bash

# 실제 배포될 디렉토리 (예: /var/www/myapp 대신 /your/path/deploy)
DEPLOY_DIR="/your/path/deploy"
# Bare Repository 경로
GIT_DIR="/your/path/repo/myapp.git"

echo "Deploying application..."

# 지정한 브랜치의 최신 코드 체크아웃 (브랜치명은 master 또는 main 사용)
git --work-tree=$DEPLOY_DIR --git-dir=$GIT_DIR checkout -f master

# 필요한 경우 권한 설정 (사용자와 그룹은 환경에 맞게 수정)
chown -R youruser:yourgroup $DEPLOY_DIR
chmod -R 755 $DEPLOY_DIR

# 서비스 재시작 (예: Node.js, Nginx 등; 필요 시 활성화)
# systemctl restart nginx

echo "Deployment completed!"
  1. 실행 권한 부여:
chmod +x /your/path/repo/myapp.git/hooks/post-receive

3. 로컬 설정 및 배포

3.1 원격 저장소 추가

SSH 설정 (예시):
vi .ssh/config

Host oneline
HostName [서버_IP]               # 예: myserver or 192.168.0.01 → 환경에 맞게 수정
User youruser                   # 실제 사용자명
IdentityFile /your/path/ssh-key.key   # SSH 키 파일 경로 (민감정보이므로 공개 시 수정)

원격 저장소 추가 명령어:

git remote add production oneline:/your/path/repo/myapp.git

또는 SSH 프로토콜을 명시할 경우:

git remote add production ssh://youruser@myserver/your/path/repo/myapp.git

3.2 코드 배포

배포 명령어: git push production master

참고: 로컬 브랜치명과 post-receive 스크립트의 checkout 대상 브랜치가 일치해야 합니다. 만약 로컬 브랜치가 master인데 스크립트는 main을 checkout하도록 되어 있다면 오류가 발생하므로 둘 중 하나를 일치시켜야 합니다.
기존대로 push 하셨을 때, 기존의 리모트 저장소로만 가게 하려면 여기까지만 하시면 되고 push 하셨을 때 자동 배포 + 기존 리모트 저장소에도 commit이 저장되었으면 한다면 아래 설정도 추가로 해주시면 됩니다.

4. 여러 Push URL 설정 (하나의 리모트에 여러 URL)

목적: 한 번의 push로 GitHub와 production 서버 등 여러 원격 저장소에 동시에 변경사항을 전달할 수 있습니다.

예시 – 원격 저장소 변경:
1. 잘못된 URL 삭제:

git remote set-url --delete origin ssh://oneline:/your/path/repo/myapp.git
  1. 올바른 URL 추가:
git remote set-url --add origin oneline:/your/path/repo/myapp.git

최종 출력 예시 (git remote -v):

origin      https://github.com/youraccount/yourrepo.git (fetch)
origin      https://github.com/youraccount/yourrepo.git (push)
origin      oneline:/your/path/repo/myapp.git (push)
production  oneline:/your/path/repo/myapp.git (fetch)
production  oneline:/your/path/repo/myapp.git (push)

5. 특정 이슈 발생 시 조치 방법

예기치 않은 문제나 오류가 발생할 때, 아래와 같은 점검 및 조치 방법을 참고하세요.

5.1 브랜치 불일치 오류

문제:

remote: error: pathspec 'main' did not match any file(s) known to git

원인: 로컬에서는 master 브랜치로 push했는데, post-receive 스크립트가 main 브랜치를 checkout하려고 할 때 발생.

조치 방법:
옵션 1:
post-receive 스크립트의 브랜치명을 master로 수정: git --work-tree=$DEPLOY_DIR --git-dir=$GIT_DIR checkout -f master

옵션 2:
로컬 브랜치명을 main으로 변경 후 push:

git branch -m master main
git push production main

5.2 권한 문제 (Permission Denied)

문제: 배포 후 웹 서버가 코드를 읽지 못하거나 실행에 문제가 발생할 경우.

조치 방법:
• 스크립트 내의 chown 및 chmod 명령어로 DEPLOY_DIR의 소유자와 권한을 올바르게 설정했는지 확인하세요.
• 필요 시, 서버의 사용자 권한과 그룹 정보를 다시 한 번 점검하고 수정합니다.

예시:

chown -R youruser:yourgroup $DEPLOY_DIR
chmod -R 755 $DEPLOY_DIR

5.3 post-receive 스크립트 미실행 또는 오류 발생

문제: Git push 후에도 코드 배포가 제대로 이루어지지 않음.

조치 방법:
• 스크립트에 로그를 남겨 어디서 오류가 발생하는지 확인합니다.

echo "Deploying application..." >> /your/path/deploy/deploy.log

• 스크립트가 실행 권한을 가지고 있는지 확인:

chmod +x /your/path/repo/myapp.git/hooks/post-receive

• 스크립트 내 명령어 실행 시 경로가 올바른지, 그리고 필요한 도구(git, chown 등)가 설치되어 있는지 점검합니다.

5.4 SSH 연결 및 원격 URL 문제

문제: push 시 SSH 연결 오류나 원격 저장소 URL 문제 발생.

조치 방법:
• 로컬의 ~/.ssh/config 파일 설정을 재확인하여 올바른 서버 주소와 키 파일이 사용되고 있는지 확인합니다.
• git remote -v 명령으로 등록된 URL이 정확한지, 불필요한 추가 URL이 없는지 점검하고 필요시 삭제 또는 수정합니다.
• 원격 URL을 수정하는 방법:

git remote set-url --delete origin 잘못된_URL
git remote set-url --add origin 올바른_URL

6. 결론
위와 같이 설정하면, 로컬에서 git push production master (또는 main) 명령어를 실행할 때 자동으로 서버에 배포되며, Git Hook(post-receive)을 통해 최신 코드가 지정된 배포 디렉토리로 복사되어 서비스가 재시작됩니다.
특정 이슈(브랜치 불일치, 권한 문제, 스크립트 오류, SSH 연결 문제 등) 발생 시 위 조치 방법을 참고하여 문제를 해결할 수 있습니다.

이로써 Git Push를 통한 자동 배포 설정 및 문제 발생 시의 대응 방법을 정리해 보았습니다.


  • 해당 글에는 오류가 있을 경우의 롤백에 대한 처리가 없습니다.
  • 간단한 배포에 대한 처리만 있는 내용으로 저의 경우 혼자 사용하는 디코봇 서버에 대해 처리해두었고, forever를 사용하여 변경사항에 대해 자동으로 감지하게 해두어서 pull 이후의 다른 처리는 주석되어있습니다.
profile
최적의 방법을 찾는 개발자

0개의 댓글