안녕하세요
아마도 다른 문제가 없다면 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 에서 추가 버튼을 누른 뒤 고급 버튼을 클릭하면 아래와 같은 화면이 보인다. ![]() 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로 접속할것)
공부하기 위한 기록으로 틀린 정보가 있을 시 알려주시면 감사하겠습니다 :)
'개발 유니버스 > _Jenkins' 카테고리의 다른 글
| [Jenkins] Build 오류 원인 분석 및 해결 방법 (0) | 2023.06.16 |
|---|---|
| [Jenkins] GitLab Hook Test 오류 원인 (0) | 2023.06.15 |
| [Jenkins] GitLab 푸시 이벤트 훅 테스트 방법 (push event hook test) (0) | 2023.06.14 |
| [Jenkins] GitLab Connection 등록 방법 (0) | 2023.06.13 |
| [Jenkins] Gitlab 연동 시 오류 발생 해결 방법 (128/401) (1) | 2023.06.12 |
