본문 바로가기
우당탕탕 개발생활/_Jenkins

[Jenkins] 자동 빌드, 배포 shell 파일 작성 하기 (+그동안 발생한 오류 해결)

by J-2n 2023. 8. 22.
반응형

안녕하세요

아마도 다른 문제가 없다면 Jenkins 자동 빌드, 배포에 관련 된 포스팅은 오늘이 마지막이지 않을까 합니다.

참 우여곡절이 많았는데요. 많은 도움이 되었으면 합니다.


반응형

# 자동 배포

기존에 자동 빌드는 GitLab에 푸시 이벤트 즉 훅을 걸어서 빌드까지는 성공적으로 되고 있었고, 자동 배포를 어떻게 진행 할 것인지가 남아있었다.

결론적으로 나는 Jenkins 의 Send build artifacts over SSH 플러그인을 이용하여 구현하였다. 


반응형

# Send build artifacts over SSH 플러그인

해당 플러그인은 빌드 아티팩트(파일 또는 폴더)를 빌드된 후 원격 서버로 전송할 수 있다. 이 플러그인은 빌드 작업이 성공적으로 완료된 후 파일을 전송하는 데 사용된다. 아래에서 설정 방법에 대해 다루겠습니다.

1. Jenkins에는 플러그인 관리 페이지에서 해당 플러그인을 설치해야 한다. Jenkins 관리자로 로그인해서 플러그인 관리 섹션에서 "Send build artifacts over SSH" 플러그인을 찾아 설치합니다.
2. 해당 item에 진입 후 빌드 설정이나 필요한 설정을 모두 마친 뒤 페이지를 아래로 내리면 빌드 후 조치를 설정하는곳이 보인다. '빌드 후 조치 추가' 버튼을 클릭하고 'Send build artifacts over SSH'을 클릭하면 설정을 입력할 수 있는 곳이 활성화 된다.
3. 아래 용어 설명을 참고하여 필요 정보를 작성한다.
4. 가장 중요한 Exec command 작성은 아래에서 자세히 다루겠습니다.

반응형

아래는 SSH Server 설정하는 순서이다.

1. Jenkins 메인 > Jenkins 관리 > 시스템 설정
2. Publish over SSH 탭이 있다.
3. 그 안의 SSH Servers 에서  추가 버튼을 누른 뒤 고급 버튼을 클릭하면 아래와 같은 화면이 보인다.
4. Name에는 내가 구분 가능한 별칭을 입력한다.
5. Hostname에는 배포하는 서버 접속할 IP를 입력한다.
6. Username에는 해당 서버에 접속하는 ID를 입력한다.
7. Remote Directory는 선택 사항이다. 필자 같은 경우에는 그냥 배포할 경로를 바로 입력해놓았다.

반응형

아래는 용어 설명이다.

1. Source files: 전송하려는 파일의 경로를 나타낸다. 이곳에는 절대 경로나 Jenkins의 환경 변수를 사용할 수 있다. (ex.빌드 된 파일이 있는 경로/파일이름.jar)
2. Remove prefix: 이 옵션을 사용하면 전송할 파일에서 제거할 접두사를 지정할 수 있다. 이렇게 하면 원하는 디렉토리 구조를 유지하면서 파일을 원격 서버로 보낼 수 있다. 예를 들어, folder/로 설정된 경우, 파일이 원격 디렉토리에 복사될 때 folder/ 디렉토리가 제거되게 된다. (파일만 보낼것이기에 경로는 제외)
3. Remote directory: 전송된 파일이 원격 서버에서 저장될 디렉토리의 경로를 지정한다. 이는 원격 서버에서 파일이 저장될 위치를 나타낸다. SSH 접속을 위한 절대 경로를 입력한다. (저는 애초에 SSH Server를 등록 할 때 절대 경로로 등록했기에 공백으로 남겼습니다.)
4. Exec command: shell 명령어를 입력하는 곳입니다. 예를 들어, cd /path/to/remote/directory && rm -rf *와 같은 명령을 설정하면 서버에 파일이 전송되기 전에 원격 디렉토리 내의 모든 내용이 삭제될 수 있다. 또한 "Exec command after transfer"는 파일이 전송된 후에 실행될 명령을 설정할 수 있는 옵션이다. 이 명령은 보통 전송된 파일을 배치하거나 처리하는 데 사용된다. 파일 전송 전에 실행될 명령을 지정할 수 있다. 이 명령은 원격 서버에서 실행된다. 파일이 전송되기 전에 예를 들어 원격 서버 내의 작업을 수행하는 데 사용될 수 있다.

반응형

# 자동배포 shell 작성하기 

우선 자동 배포 shell을 작성하기 위해서는 항상 돌고있는 서버라고 생각하며 우선 서버가 현재 돌고 있는지 확인하고 만약 돌고 있다면 그 서버를 죽인 후 새롭게 빌드 된 jar파일로 새로 배포를 해야한다.

결론적으로 현재 사용하는 shell 내용이다. 해당 쉘 파일은 배포하는 서버에 생성 .sh 파일을 생성해서 내용 입력했다. 각자의 OS에 맞게 활용하면 될것 같다.

CURRENT_PID=$(ps -ef | grep java | grep 검색할 고유한 단어 | awk '{print $2}')
echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
    echo "> 서버 없음"
else
    echo "> kill $CURRENT_PID"
    kill $CURRENT_PID
    sleep 12
fi

echo ">Start DEV Server"

nohup java -jar -Dspring.profiles.active=dev 파일 경로.jar > 로그 경로.log &

# 삽질한 것 - 무한 로딩 현상

처음에는 Jenkins 내에서 'Exec command'에 Shell 파일 경로가 아닌 이 칸에 직접 실행하는 shell을 입력했었다. 문제 없이 서버도 열리길래 가능한 것인 줄 알았다. 하지만 무한 로딩 현상이 나타났고 그 결과 위와 같이 .sh 파일 생성 후 sh경로를 넣어준 뒤 문제는 없어졌다. ( + 테스트할때 IP로 접속 안되면 url로 접속할것)


반응형

공부하기 위한 기록으로 틀린 정보가 있을 시 알려주시면 감사하겠습니다 :)

반응형