웹개발 및 최신 테크 소식을 전하는 블로그, 웹이즈프리

HOME > webdevetc

git과 scp를 사용하여 서버에 수정된 사항 배포하기

Last Modified : 2023-11-18 / Created : 2023-11-14
528
View Count
서버에 수정된 파일을 올리고 반영하기 위해서 배포(Deployment) 과정이 반드시 필요합니다. 배포 과정 및 프로세스는 서버 운영 방법에 따라 매우 다양할 수 있는데 만약 수정된 파일만 간단하게 서버에 올리고 싶은 경우 githubscp를 사용하는 방법을 사용할 수 있습니다. 아래는 이 두 가지를 사용하여 간단한 배포 방법에 대하여 알아봅니다.




github과 scp를 사용하여 서버에 배포하는 방법


먼저 해당 과정의 전체를 이해하기 위해서 github과 scp가 각각 어떤 일을 하는지 알아둬야하겠죠. 각각 다음의 역할을 하기 위해서 필요합니다.

github // 형상관리 툴로 변경된 파일을 알기 위한 용도
scp // scp(secure copy protocol)는 서버에 파일을 전송, 복사하는 방법

즉, 이 방법은 만약 수정된 파일이 존재하는 경우 github을 통해서 어떤 파일이 변경되었는지 확인이 가능합니다. 모든 파일을 서버에 다 전송할 필요가 없고 전송할 경우 불필요한 리소스가 사용되기 때문이죠. 그렇게 하기 위해서 변경된 파일이 무엇인지 알아야합니다.


github diff 명령어를 사용하여 변경된 값 알기


제일 먼저해야 할 일은 바로 github을 사용하여 변경된 파일이 무엇인지 알아내는 것입니다. github의 diff 명령어를 사용하여 마지막 커밋 기준으로 어떤 파일이 변경되었는지 내용과 이름을 알려줍니다. 이름을 알기 위해서는  --name-only 플래그를 추가해 아래와 같이 사용합니다
$ git diff --name-only HEAD~1 HEAD

위 명령어를 사용하기 위해서는 변경사항이 마지막 커밋으로 존재해야 하겠죠. 이를 비교하기 위해서 HEAD~1 HEAD를 뒤에 추가하였습니다. 출력된 내용을 보면 아래와 같이 간단하게 바뀐 파일명을 보여줍니다.
/bin/deploy.sh

저는 배포 파일을 sh 파일로 만들어 관리하기 위해서 마지막 커밋에 deploy.sh 파일을 추가하였습니다. 이제 위 파일을 서버에 업로드하기 위해서 scp를 사용하는 방법에 대하여 알아봅니다.


scp를 사용하여 서버에 전송, 복사하기


변경된 파일을 서버에 업로드 하면 필요한 과정은 거의 마무리가 되겠죠. 이제 어떤 파일을 올려야하는지는 위에서 알아봤습니다. 변경될 파일을 서버에 전송하기 위해서 아래와 같이 명령어를 입력해야 합니다. 참고로 파일은 하나가 아닌 여러 개인 경우도 존재하겠죠. 그래서 for 반복문을 추가해 사용하였습니다.
for file in $(git diff --name-only HEAD~1 HEAD); do
  scp "$file" "user@remotehost:/targetPath/$file"
done

위 코드를 실행하면 변경된 파일이 실제 서버에 복사되어 업로드됩니다. 실행 전 user@remotehosttargetPath인 복사할 위치를 알맞은 값으로 변경해 사용하도록 하세요. 여기까지 모든 과정은 끝이 났습니다.



만약 패스워드 입력이 필요하다면?


서버에 파일을 전송하려면 반드시 인증이 필요합니다. 이 경우 SSH Keys 값을 사용하여 전송하는 방법이 대부분이겠지만 때로는 패스워드를 입력해야하는 경우도 있겠습니다. 패스워드 입력을 위해서는 아래와 같이 코드를 작성할 수 있습니다. (참고로, 가급적이면 SSH 키를 사용하는 방법이 보다 안전하다고 할 수 있습니다. 아니면 패스워드는 별도의 환경변수로 설정하는 것도 고민이 필요할 수 있습니다.)
for file in $(git diff --name-only HEAD master); do
  sshpass -p 'your_password' scp "$file" user@remotehost:/targetPath/
done

위에서는 sshpass를 사용하였습니다. 패스워드 값과 sshpass를 함께 사용하여 scp를 동작하여 서버에 전송하는 방법입니다. 이제 your_password에 사용할 패스워드로 변경하여 실행하면 됩니다. 여기까지 핵심적인 부분들은 모두 끝이났습니다.


.env 파일과 sh 파일을 만들어 자동화 및 간소화하기


위 과정들까지의 방법들은 반드시 필요한 부분이라면 아래는 좀 더 쉽고 간편하게 배포하기 위한 방법으로 sh 파일인 쉘스크립트를 만들고 중요한 내용들은 .env 파일의 변수로 저장해 사용하는 방법을 알아봅니다.

쉘스크립트 파일 deploy.sh을 /bin이라는 폴더에 만들어 두면 배포할 때 마다 해당 파일만 실행하면 되므모 편리합니다. 이 때 서버와 관련된 인증이나 경로 등의 정보들은 .env 파일을 별도로 만들어 사용하되 git에는 반드시 ignore되도록 .gitignote에 추가되야 합니다. 보통은 기본으로 추가되어 있으나 한 번 더 확인하세요! 이제 .env 파일과 sh 파일을 각각 만들어봅니다.

@ .env
REMOTE_USER=your_username
REMOTE_HOST=remote_host
DESTINATION_PATH=/targetPath/
PASSWORD=your_password

실제 파일에서 위의 변수의 값들을 알맞게 바꾸어야 합니다. 이제 위 .env 파일을 적용해 실행할 deploy.sh 파일은 다음과 같습니다.


@ /bin/deploy.sh
#!/bin/bash

# Load .env file
if [ -f .env ]; then
  export $(cat .env | xargs)
else
  echo ".env file not found"
  exit 1
fi

# Get list of changed files
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD)

# Get list of deleted files
DELETED_FILES=$(git diff --name-only --diff-filter=D HEAD~1 HEAD)

# Copy each files
for file in $CHANGED_FILES; do
  echo "Copying $file..."
  sshpass -p "$PASSWORD" scp "$file" "$REMOTE_USER@$REMOTE_HOST:$DESTINATION_PATH$file"
done

# Delete each removed files
for file in $DELETED_FILES; do
  echo "Deleting $file..."
  sshpass -p "$PASSWORD" ssh "$REMOTE_USER@$REMOTE_HOST" "rm -f '$DESTINATION_PATH/$file'"
done

echo "Deployment completed."

위 코드를 살펴보면 파일을 추가하여 복사하는 부분과 파일을 삭제하는 부분으로 구분된 것을 확인할 수 있습니다. 실제로 파일은 추가 변경되기도 하지만 삭제도 되기 때문에 두 가지의 코드 모두 필요한다.

- scp를 사용하여 코드를 추가, 변경하는 부분
- ssh로 접속후 rm -f 명령어를 사용하여 리커시브하게 삭제하는 부분

만약 서버에 파일을 삭제할 일이 없는 경우라면 # Delete each removed files 부분은 제외하고 사용하시면 됩니다. rm -f 명령어를 사용할 경우 하위 모든 값들이 삭제되므로 반드시 백업 후 사용하시기 바랍니다.

실제 구동할 deploy.sh 파일도 완성이 되었습니다. 아래와 같이 실행하면 잘 동작하게 될 것입니다.
$ ./bin/deploy.sh


마치면서


여기까지 git과 scp를 사용하여 서버에 변경된 파일을 전송해 배포하는 간단한 방법을 알아보았습니다. 위와 같이 쉽게 자동으로 실행되도록 sh 파일인 쉘스크립트를 만들어 실행하면 보다 간편합니다. 다시 한 번 강조하지만 인증에 사용되는 패스워드 등의 값이 repository나 기타 외부 저장소에 전달되지 않도록 주의가 필요합니다. .env 파일등의  환경변수 등을 사용하거나 보다 안전한 방법들을 생각해서 사용하시기 바랍니다.

Previous

유튜브 YouTube 영상의 썸네일 가져오는 가장 쉬운 방법은?

Previous

nodejs 서버 환경에서 webp 이미지 만들기, sharp 패키지