Mini

24. 9. 11. 개발일지 / 자동배포, git, 구조분해할당 , \r 명령어를 찾을수 없음 해결 본문

CS/Linux

24. 9. 11. 개발일지 / 자동배포, git, 구조분해할당 , \r 명령어를 찾을수 없음 해결

Mini_96 2024. 9. 11. 23:20

* 자동배포

  • private 저장소 가져오기
    • 방법1 : ssh 이용
    • 방법2 : 토큰이용 (보안 issued) 
    • 보안이슈가 있지만 1번이 잘 안되기도 하고 연습용으로 방법2로 진행함
      • (애초에 서버에 접근가능해서 파일을 마음대로 읽을수있을 상황이면 이미 서버가 털린상황이라고 생각)

home/user/script에 git-pass.sh 생성후 토큰값 넣기 / 실행권한 주기

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번을 가르킴

파일은 다운받아 놓음(?)
이후 diff로 뭐가 변경됬는지 확인가능
확인후 이상이없다면 merge

 

  • 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 에 추가

user-name 을 root로 써야 error 가 안나는듯
이건 안해도 될듯?

  • 궁금한점 : 크론탭은 기본값이 자동실행 되는가?

true
이제 잘되는것 같다.

 

* detedted dubious ownership error 해결

log.txt에 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] // 모두 받는 코드

공식문서 goat