* 자동배포
- private 저장소 가져오기
- 방법1 : ssh 이용
- 방법2 : 토큰이용 (보안 issued)
- 보안이슈가 있지만 1번이 잘 안되기도 하고 연습용으로 방법2로 진행함
- (애초에 서버에 접근가능해서 파일을 마음대로 읽을수있을 상황이면 이미 서버가 털린상황이라고 생각)
chmod 700 /home/bisu/scripts/git-pass.sh
- deploy.sh 작성
- 변경사항이 있는지 확인하는법 honux version
#!/usr/bin/bash
# by honux
cd dir
git reset --hard
git fetch
LOCAL='git rev-parse HEAD'
REMOTE='git rev-parse origin/J160'
if [[ $LOCAL == $REMOTE ]]; then #가리키는게 같으면 변경사항이 없는거임
echo "변경사항 없음"
exit 0
fi
# git switch J160
git pull
PID='lsof -t -i :3000'
kill -9 $PID #강제종료
npm install
nohup npm start &
- git fetch ?
- origin/master = push한 최신을 가르킴
- local/master = 6번을 가르킴
- git pull ?
- 원격저장소 origin/master와 local/master를 같게만듬.
- fetch의 간소화 버전
- gpt version
#!/bin/bash
# 로그 파일 설정
LOG_FILE="/home/bisu/deploy.log"
# 함수: 로그 메시지 출력
log_message() {
echo "$(date): $1" >> $LOG_FILE
}
echo "start auto deploy"
# GitHub 토큰 설정
export GIT_ASKPASS="/home/bisu/scripts/git-pass.sh"
# 프로젝트 디렉토리로 이동
cd /home/bisu/boost/web-p1-taskify ||
{ echo "프로젝트 디렉토리로 이동 실패"; log_message "프로젝트 디렉토리로 이동 실패"; exit 1; }
# 원격 저장소에서 변경사항 가져오기
log_message "Git fetch 시작"
git fetch || { log_message "Git fetch 실패"; exit 1; }
# 원격 브랜치와 로컬 브랜치 비교
if git diff --quiet HEAD origin/J160; then
echo "변경사항 없음. 배포 스킵"
log_message "변경사항 없음. 배포 스킵"
exit 0
fi
# 변경사항이 있으면 pull 실행
log_message "변경사항 감지. Git pull 시작"
git pull origin J160 ||
{ echo "Git pull 실패"; log_message "Git pull 실패"; exit 1; }
# npm 패키지 설치
log_message "npm 패키지 설치 시작"
npm install || { echo "npm 패키지 설치 실패"; log_message "npm 패키지 설치 실패"; exit 1; }
# PM2로 애플리케이션 재시작
log_message "PM2 재시작 시작"
pm2 restart main.js || { echo "PM2 재시작 실패"; log_message "PM2 재시작 실패"; exit 1; }
# Nginx 재시작
#log_message "Nginx 재시작 시작"
#sudo systemctl restart nginx || { log_message "Nginx 재시작 실패"; exit 1; }
echo "배포 완료"
log_message "배포 완료"
- 삽질후, 두개를 적절히 조합한
일단 돌아는 가는쉘 스크리트
#!/bin/bash
# 로그 파일 설정
LOG_FILE="/home/bisu/deploy.log"
# 함수: 로그 메시지 출력
log_message() {
echo "$(date): $1" >> $LOG_FILE
}
echo "start auto deploy"
# GitHub 토큰 설정
export GIT_ASKPASS="/home/bisu/script/git-pass.sh"
# 프로젝트 디렉토리로 이동
cd /home/bisu/boost/web-p1-taskify ||
{ echo "프로젝트 디렉토리로 이동 실패"; log_message "프로젝트 디렉토리로 이동 실패"; exit 1; }
# 원격 저장소에서 변경사항 가져오기
log_message "Git fetch 시작"
git fetch || { log_message "Git fetch 실패"; exit 1; }
## 원격 브랜치와 로컬 브랜치 비교
LOCAL='git rev-parse HEAD'
REMOTE='git rev-parse origin/J160'
if [[ $LOCAL == $REMOTE ]]; then #가리키는게 같으면 변경사항이 없는거임
echo "변경사항 없음"
exit 0
fi
# 원격 브랜치와 로컬 브랜치 비교
if git diff --quiet HEAD origin/J160; then
echo "변경사항 없음. 배포 스킵"
log_message "변경사항 없음. 배포 스킵"
exit 0
fi
# 변경사항이 있으면 pull 실행
log_message "변경사항 감지. Git pull 시작"
git pull origin J160 ||
{ echo "Git pull 실패"; log_message "Git pull 실패"; exit 1; }
# 3000번 포트 프로그램 죽이기
PID=`lsof -t -i :3000`
kill -9 $PID
# npm 패키지 설치
log_message "npm 패키지 설치 시작"
npm install || { echo "npm 패키지 설치 실패"; log_message "npm 패키지 설치 실패"; exit 1; }
# PM2로 애플리케이션 재시작
log_message "PM2 재시작 시작"
pm2 restart main.js || { echo "PM2 재시작 실패"; log_message "PM2 재시작 실패"; exit 1; }
# Nginx 재시작
#log_message "Nginx 재시작 시작"
#sudo systemctl restart nginx || { log_message "Nginx 재시작 실패"; exit 1; }
echo "배포 완료"
log_message "배포 완료"
* \r 명령어를 찾을수 없음 에러 해결
* 5분마다 자동실행 구현 && 로그 구현
- 0번 : 표준입력
- 1번 : 표준출력
- 2번 : error
#crontab.config
/home/user/deploy.sh >> home/user/log.txt 2>&1
# 5분마다 해당파일 실행해주세요
# 에러(2번)도 표준출력(1)으로 합쳐주세요. => 에러도 로그찍도록
* crontab 작동안함 해결
- etc/crontab 에 추가
- 궁금한점 : 크론탭은 기본값이 자동실행 되는가?
* detedted dubious ownership error 해결
아래써있는 명령어를 그대로 실행 => 안전한 폴더로 추가되어 error가 해결된듯하다.
* 의문
- 쉘 스크립트에서 pull = fetch && merge 니까
- 앞의 fetch를 할 필요가 없지 않은지?
- 쉘스크립트에서 export GIT_ASKPASS 하면 어떤 과정으로 인증이 되는지?
# GitHub 토큰 설정
export GIT_ASKPASS="/home/bisu/script/git-pass.sh"
* 구조분해할당(배열)
db.query : [ a, b, c ]
[ rows ] = [ a , b, c ]
rows = a //뒤의 b, c는 받는게 없기때문에 무시됨!!
[rows , sdf, dfsf ] = [a, b, c] // 모두 받는 코드
'CS > Linux' 카테고리의 다른 글
24. 11. 4. 개발일지 // 자동배포, nginx 설정 (0) | 2024.11.05 |
---|---|
[Linux] OS 비교 (0) | 2024.11.04 |
24.9.5. 개발일지 // virtual box에 배포하기 , nat, bridge, ufw방화벽, nginx (0) | 2024.09.05 |
[Linux] pw 없이 접속하기, ssh-keygen, 배포하기 (0) | 2024.09.05 |
[Linux] 배포관련 아키텍쳐 best practice? (0) | 2024.09.04 |