서론
회사에서 스케줄러를 만들었으니 이를 자동 배포하는 프로그램을 만들라는 지시가 떨어졌다.
- 스케줄러 제작기
[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 설치 및 실행 방법은 홈페이지 참고)
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을 아무것도 모르던 사람이 각종 노가다를 하며 처음부터 끝까지 빌드 및 배포를 경험한 내용이였습니다! 😇
'프로그래밍 > 기타' 카테고리의 다른 글
[Vus.JS] 하위 컴포넌트의 Key Event를 막아보자. (0) | 2023.03.20 |
---|---|
Test-Driven Development(TDD)란 무엇인가? (0) | 2020.12.28 |