개발서버에서 파일저장 시 git으로 자동 커밋하기😻
로컬에서 git을 사용하고 있는데 굉장히 귀찮은 일이 많아서
개발서버에서 파일저장 시 github으로 자동 커밋하는 기능을 만들었고, 이 기능을 공유한다.
컴포넌트화된 라이브러리들을 중간중간 Public git으로 커밋해주고,
CDN을 통해 메인프레임웤에 연동하는 개발위주로 진행하고 있다.
AS-IS
단위기능수정 -> 컴포넌트 수정사항발생 -> 로컬에서 개발 및 테스트 -> git커밋 -> CDN으로 실서버에 배포
컴포넌트 수정사항은 사실 잦은 일은 아니였지만, 매번 로컬에서 개발하고 테스트하고 git에 배포하고 CDN으로 실서버에 배포하는 과정자체가 굉장히 수고스러웠다. 무엇보다 로컬환경에서 개발과 테스트했을때와 실서버에서 배포되었을때와의 환경차이(?)로 인해 어려움이 많았고, 이러한 환경차이를 최소화하고 git커밋하는 행위를 최소화하기 위해 다음과 같은 환경으로 변경했다.
TO-BE
단위기능수정 -> 컴포넌트 수정사항발생 -> 개발서버에서 개발/테스트/git커밋 -> CDN으로 실서버에 배포
참고로 이러한 우리회사의 경우 실서비스환경에서 신규기능을 지속적으로 개발하는 환경이기 때문에 git 커밋을 자동화해도 큰 무리가 없었다. 하지만, 정말 미션크리티컬한 서비스에서는 git을 자동으로 커밋하는 행위는 좀 생각할 필요가 있지 않을까 싶음. ㅎㅎㅎ
먼저 실서버와 유사한 환경을 조성할 수 있는 개발서버가 필요로 함.
개발서버를 구축해두니 좋은점은 개인적으로 호작질할 코드들도 서비스할 수 있고,
무엇보다 항상 맥북을 들고 다녀도 항시 코드가 저장되어 있으니, 어디서든 / 아이패드와 같은 기기에서도 즉시 개발이 가능했음.
[개발서버 사양]
OCPU : 1개
RAM : 1GB
Volume : 100GB
OS : CentOS 7
개발서버는 돈주고 써도 되는데,
마침 오라클 클라우드 프리티어라는것을 발견하여 평생 무료 서버를 구축할 수 있었다.
무료로 제공되는 서버가 총 2대까지 가능하기 때문에 한대는 nginx, php, python, go등을 설치했고, 나머지 한대는 mariaDB를 설치했다.
https://www.oracle.com/kr/cloud/free/
먼저 git을 설치하고 설정한다.
yum install git
git config --global user.name "아이디"
git config --global user.email "이메일"
git config --global color.ui auto
git config --global alias.st status
git config -l
매번 git personal access token을 묻는게 귀찮기도하고,
crontab으로 쉘을 주기적으로 돌릴예정이기 때문에 이 옵션을 넣어준다.
(첫번째 git push에서만 token로그인을 해주면 된다.)
git config --global credential.helper store
적절한 위치에 저장소공간을 만들어주고 처음 clone 해준다.
(디렉토리와 깃저장소 URL은 적절히 변경해야함)
(디렉토리 경로를 보면 유추할수 있지만, 깃 저장소에 nginx 가상호스트를 연결해두었다. 바로 개발하면서 코드저장 시 자동으로 커밋을 올릴수 있음)
mkdir /www/git.coco.sqs.kr
cd /www/git.coco.sqs.kr
git remote add origin https://github.com/burndogfather/cocoAjaxMultiSelect.git
git clone https://github.com/burndogfather/cocoAjaxMultiSelect.git
아래 스크립트를 작성하여 저장한다.
(경로는 mkdir 했던 경로로 변경해야 한다.)
vi git_update.sh
#!/bin/bash
cd /www/git.coco.sqs.kr/cocoAjaxMultiSelect
sleep 1
git add *
git add -u .
sleep 2
git commit -m "$(date "+%Y-%m-%d %H:%M:%S") 업데이트"\!\!\!
git push
sleep 5
:wq
여러개의 프로젝트가 있다면 이런식으로 작성한다.
순서대로 나열해야 제대로 push가 가능하다.
vi git_update.sh
#!/bin/bash
cd /www/git.coco.sqs.kr/cocoAjaxMultiSelect
sleep 1
git add *
git add -u .
sleep 2
git commit -m "$(date "+%Y-%m-%d %H:%M:%S") 업데이트"\!\!\!
git push
sleep 5
cd /www/git.coco.sqs.kr/test
sleep 1
git add *
git add -u .
sleep 2
git commit -m "$(date "+%Y-%m-%d %H:%M:%S") 업데이트"\!\!\!
git push
sleep 5
:wq
생성한 git_update.sh의 권한을 수정하고 한번은 실행한다.
(username과 personal access token을 한번 입력해줘야함.)
chmod 755 /www/git.coco.sqs.kr/git_updater.sh
./git_updater.sh
Username for : 아이디입력
Password for : personal access token을 입력한다.
(personal access token 발급받기 : https://github.com/settings/tokens )
credential.helper store 옵션을 주었음으로 처음 한번만 묻는다.
크론탭에 매 1분마다 실행되게끔 지정한 뒤,
크론탭을 실행시켜준다.
crontab -e
* * * * * /www/git.coco.sqs.kr/git_updater.sh
:wq
service crond restart
이제 sftp등을 이용하여 개발서버에 코드를 변경하면, 이렇게 자동으로 커밋된다!
git push할때 커밋의 내용이 중요하다면, 별도 커밋을 시켜줘야하는 단점이 있지만, 개발환경에서 개발내용을 즉시에 커밋됨으로
저장소에 항상최신화된 데이터만 서빙이 가능한 장점이 있다.
최종적인 개발 ~ 배포과정
자동 커밋을 썼을때 장단점
- 라이브러리나 컴포넌트단위의 개발업무를 진행할 경우 최적으로 사용이 가능함.
- 개발서버에서 원격코드를 작성함으로 개발환경이 변경되어도 어디든 작업가능함.
- Git저장소와 개발서버의 도메인이 연결되어 즉시 테스트가 가능하고 테스트와 동시에 자동으로 커밋됨.
- Github에 일시적으로 잘못된 코드가 올라가도 git을 통해 무료로 사용할 수 있는 jsdelivr CDN은 캐싱시간이 존재하기 때문에 잘못된 코드로 인한 실서비스에서의 오류발생가능성은 실제로 거의 존재하지 않음. (빠르게 고친다면....)
- git 명령어를 점점 까먹게 됨.