git 저장소에 변화가 생기면, 서버에 자동으로 업데이트하는 스크립트.
소스가 변경될 때 마다, 라이브서버에 소스를 업데이트 하는 일은 참 귀찮은 일이다.
그래서 보통 cron을 이용해 서버에 소스 자동 업데이트를 하곤 한다.
이번에도 cron을 이용해 자동 업데이트를 구축하려다가 한가지 문제에 부딪혔다.
crontab에서 스크립트를 돌릴경우 상대경로를 쓰지 못한다는 거다.
그래서 비슷한 걸 찾아 헤매다가 shell-jobs를 발견했고,
이를 이용해 git 저장소가 갱신될 때마다 서버를 자동 업데이트하도록 구축했다.
작동 순서
- shell-jobs 데몬 실행.
- shell-jobs에서 일정 시간마다 ~/update.sh를 호출.
- ~/update.sh에서 원격 저장소를 업데이트하고 변경사항이 있다면 update_platform.sh를 호출.
- update_platform.sh에서 소스를 업데이트하고 서버를 재구동.
shell-jobs(https://github.com/azer/shell-jobs)
설치
npm install -g shell-jobs
설정파일 작성
update.jobs
~/update.sh > ~/cron.log # => 10 minutes
shell-jobs 데몬으로 구동
shell-jobs update.jobs -d
update.sh
원격 저장소를 업데이트하고 git diff를 통해 로컬과 다른점을 검사한다.
grep -v 뒤에는 로컬 변경을 무시할 파일명을 넣는다.
만약 원격 저장소와 다른 점이 있다면 update_platform.sh를 실행한다.
#!/bin/sh
cd /home/project
git remote update
diff=$(git diff remotes/origin/master master | grep -v <무시할 변경사항>)
if ["$diff" == ""]
then
echo "no diffs"
else
echo "have diffs"
~/update_platform.sh
fi
update_platform.sh
소스를 최신으로 업데이트하고, 서버를 재구동하는 스크립트.
sed를 이용해 debug플래그와 project.wsgi파일을 변경하기 때문에,
git reset --hard로 로컬 변경사항을 무시한다.
#!/bin/sh
cd /home/project
git checkout master
git reset --hard master
git pull
pip2 install -r requirements.txt
alembic revision --autogenerate -m "Alembic initilized boilerplate tables."
alembic upgrade head
sed -i "s/^DEBUG = .*/DEBUG = False/" ./application/config/debug_flag.py
sed -i "s/^sys.path.insert.*/sys.path.insert\(0, '\/home\/project'\)/" ./project.wsgi
chown me -R .
~/restart_server.sh
resteart_server.sh
간혹 서버를 직접 재구동하기도 하니, 서버 재구동용 스크립트는 따로 작성한다.
#!/bin/sh
service apache2 restart
by 月風