본문 바로가기

프로그래밍/기타

[Jenkins] 싱글벙글 Jenkins 핥아보기(Spring boot + Maven + Jar + Git)

서론

 

회사에서 스케줄러를 만들었으니 이를 자동 배포하는 프로그램을 만들라는 지시가 떨어졌다.

 

- 스케줄러 제작기

 

[Spring] @Scheduler를 동적으로 대체하자! (Feat. ThreadPoolTaskScheduler)

서론 현재 사내에서 사용하고 있는 스케줄러를 개선하는 작업을 하고 있다. 기존에는 C# 환경에서 RestSharp + Thread를 활용해 스케줄링 작업을 하고 있었으나 내가 부서이동을 하는 바람에 마지막

skydevilk.tistory.com

 

각설하고 Jenkins를 처음 다뤄보는 입장에서 git에 올린 spring boot 프로젝트를 받아 jar파일로 빌드 후 배포하는 것 까지 해보겠다.

물론 사내 캡처는 보안으로 막혀있으니😥 내 개인PC에서 재연하려고 한다.

 

모든 시행착오를 다시 재연한다는 점에서 재밌는 포스팅이 될 것 같다.

 

본론

 

1. 설치

 

https://www.jenkins.io 여기에 들어가서 최신 젠킨스를 다운로드 한다.

 

맥의 경우 Brew를 통해 설치할 수 있다고 한다. (개인 PC는 Mac이라 Windows 설치 및 실행 방법은 홈페이지 참고)

brew가 없는 나. brew부터 설치해야겠다.

Intel이 아닌 Apple Slicon Mac은 brew를 설치했는데도 위와 같이 not found가 나온다면

eval "$(/opt/homebrew/bin/brew shellenv)"

위의 명령어를 terminal에 입력하면 정상적으로 jenkins를 설치할 수 있다.

 

설치가 다 되었다면 하단의 명령어를 terminal에 입력하여 jenkins를 실행시킬 수 있다. 

brew services start jenkins-lts

 

실행하기 전, Jenkins의 포트를 변경하자.

 

Jenkins는 기본 포트가 8080으로 되어 있다. 이는 Spring boot의 기본 port가 동일하므로 Jenkins의 포트를 8082로 변경해주자.

 

우선 jenkins가 설치되어 있는 폴더로 이동한 뒤 homebrew.mxcl.jenkins-lts.plist를 열어준다.

 

 

그 뒤 아래의 --httpPort=8080을 --httpPort=8082로 수정해준다.

그 후 Jenkins를 실행한 뒤 http://localhost:8082 로 들어가면 Jenkins가 실행 된 모습을 볼 수 있다.

 

 

위와 같이 Administrator password를 입력하라고 하는데 당황하지 말고 시키는대로 위의 경로로 가서 password를 확인 후 입력하면 된다.

 

그 후 플러그인을 설치하라고 나오는데 추천을 선택 후 설치하면 된다. (필요한 플러그인은 나중에 설치할 수 있다.)

 

 

2. 설정

 

먼저 Git의 Token을 발급 받아야 한다. 

Github Settings -> Developer settings -> Personal access token -> Tokens(classic) -> Generate new token -> Generate new token (classic)을 눌러준 뒤 권한 설정을 한다. 최소한 repository, project는 선택해줘야 한다.

그 뒤 token key는 따로 메모장에 저장해둔다.

잃어버리면 신규 발급 밖에 답이 없다.

 

다시 Jenkins로 돌아와서 좌측의 Jenkins 관리 - Manage Credentials를 누른다.

우측의 Add Credentials를 누른다.

username은 github의 id, password는 위에서 발급 받은 token key를 입력한다. ID는 구분 값이므로 자유롭게 적은 뒤 Create를 눌러준다.

 

그 다음 Jenkins 메인으로 나와 좌측의 새로운 Item을 누르면 하단과 같이 나온다.

item 이름을 입력하고 "Freestyle Project"를 선택 후 OK 버튼을 누른다.

 

 

오래된 빌드 삭제를 통해 용량 관리를 할 수 있다. 실질적으로 빌드 이력이 10개 이상 넘어가면 필요 없다고 보여 삭제하도록 했다.

 

그 후 Git을 입력한다.

Credentials는 위에서 만든 것으로 입력한다. Branch는 배포할 Branch로 자유롭게 설정해준다.

 

그 후 밑으로 쭉 내려와 Build Steps 에서 Add build step을 누르고 Invoke top-level Maven targets 을 누른다.

 

Goals에는 clean install를 입력 한 뒤 저장한다.

빌드가 정상적으로 되는지 확인해보자.

 

아래와 같이 에러가 나왔다.

ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

 

과거에는 master branch가 기본이였는데 현재는 main branch로 변경 되었다.

해당 문제는 branch name으로 찾을 수 없다는 것이니 branch name을 제대로 확인해준다.

 

변경하는 방법은 구성을 누르면 변경 할 수 있다.

 

다시 빌드를 누르니 아래와 같은 에러가 나왔다.

Caused: java.io.IOException: Cannot run program "mvn" (in directory "/Users/skydevilk/.jenkins/workspace/MyProject"): error=2, No such file or directory
Build step 'Invoke top-level Maven targets' marked build as failure

해당 오류는 Maven이 설치되지 않았거나 버전이 맞지 않아 생기는 에러이다.

 

이를 해결하기 위해 Jenkins Dashboard로 돌아간 뒤 Jenkins 관리 -> Global Tool Configuration -> 하단의 Maven에서 Add Maven -> 설정 후 Apply를 눌러준다.

 

그 후 프로젝트 구성 -> Build Steps -> Maven Version에서 설정을 변경한다.

그 후 다시 빌드를 실행했더니 하단과 같이 에러가 발생했다.

[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/Users/skydevilk/.jenkins/workspace/MyProject). Please verify you invoked Maven from the correct directory. -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MissingProjectException

 

 

해당 오류는 Maven 빌드를 시도하려고는데 프로젝트를 찾을 수 없어 나오는 에러이다.

 

사내에서는 1개의 Git에 여러 개의 프로젝트 파일을 올려서 관리하고 있어서 생긴 문제였다.

 

따라서 pom.xml을 지정해서 빌드를 해주어야 한다.

 

구성(Configure) -> Build Steps -> 고급...(Advanced)을 누르면 POM 부분에 pom.xml을 입력할 수 있다.

 

여기다가 pom.xml의 경로를 입력해줘야 한다.

 

현재 필자의 개발 환경에서는 /Users/skydevilk/.jenkins/workspace/MyProject/BatchScheduler_Spring/pom.xml 이다.

 

pom.xml의 위치를 찾는 방법은 간단하다.

 

기존의 빌드 결과 Console output을 열어보면 하단과 같이 workspace 경로가 나온다. 이를 활용해 pom.xml의 경로를 찾을 수 있다.

 

pom.xml 경로를 입력하고 다시 빌드를 실행하면...

드디어 빌드 성공!!!

 

3. 배포

 

이제 자동 배포할 차례다.

 

이 부분은 Windows / Mac OS가 완전히 달라 다르게 설명하겠다.

 

Mac OS)

 

프로젝트 구성 -> Build Steps -> Add Build Step -> Excute shell 을 누른 뒤 하단의 내용을 입력 후 Apply 후 실행하면 끝!!😁

lsof -P -i :8080 |grep LISTEN |awk '{print $2}' |xargs kill -9 # 8080 포트가 열려있으면 강제 종료
sleep 10
nohup java -jar /Users/skydevilk/.m2/repository/com/example/BatchScheduler_Spring/0.0.1-SNAPSHOT/BatchScheduler_Spring-0.0.1-SNAPSHOT.jar & # jar파일을 백그라운드로 실행

 

Windows)

프로젝트 구성 -> Build Steps -> Add Build Step -> Execute Windows batch command 을 누른 뒤 하단의 내용을 입력 후 Apply하면 된다.

for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a

start /min java -jar /Users/skydevilk/.m2/repository/com/example/BatchScheduler_Spring/0.0.1-SNAPSHOT/BatchScheduler_Spring-0.0.1-SNAPSHOT.jar &

Windows의 경우 start를 앞에 붙여줘야 백그라운드 실행이 된다. 단순히 java -jar 를 할 경우 Jenkins는 Success를 주지 않을 것이다.

 

결론

 

부서 이동 전 다양하고 재밌는 것을 많이 경험했던 것 같다.

특히 Windows 기반에서 했던 작업을 Mac OS 기반에서 다시 재연하려니 약간 힘들었던 부분도 있었다. (배포하는 부분... 너무 헷갈렸어 🤯)

 

아무튼 Jenkins을 아무것도 모르던 사람이 각종 노가다를 하며 처음부터 끝까지 빌드 및 배포를 경험한 내용이였습니다! 😇