[portfolio] Jenkins를 활용한 CI/CD 구축(windows)

박이레·2023년 11월 1일
0

portfolio

목록 보기
19/20

 windows 환경에서 Jenkins, Github를 활용해 CI/CD 환경을 구축합니다. gradle project(SpringBoot Project)를 배포하고, Github webhook으로 변화를 감지하는 환경을 구축합니다.


Jenkins 다운로드

Jenkins download 페이지로 이동합니다. LTS에서 windows를 선택합니다. 다운로드

Jenkins 설치

다운로드 된 .msi를 실행합니다.

Logon Type은 Run service as LocalSystem(not recommended)를 선택합니다.

Jenkins를 사용할 port를 지정합니다. 기본 port는 8080인데, 저는 18080으로 정했습니다. Test Port를 눌러 사용가능한 Port인지 확인합니다.

JDK를 지정합니다. Jenkins는 Java Application으로 JDK가 설치되어 있어야 합니다. 제가 사용하는 Jenkins 2.414.3은 Java 11, 17, 21부터 사용 가능합니다.

젠킨스 설치가 완료되었습니다.

Jenkins 실행

Browser를 열고 http://localhost:18080/로 접속합니다. 저는 Port를 18080으로 지정했기 때문에, 18080으로 접속했고, 주소는 각자 지정한 환경에 따라 다릅니다.

Jenkins의 로그인 화면입니다. Jenkins를 Unlock하기 위해서는 initialAdminPassword가 필요합니다. initialAdminPassword의 위치는 다음과 같습니다.

C:\ProgramData\Jenkins\.jenkins\secrets\initialAdminPassword

메모장으로 initialAdminPassword를 실행합니다.

initialAdminPassword를 입력하고 Continue 버튼을 선택합니다.

Jenkins에 필요한 plugins 설치를 묻는 화면입니다. Install suggested plugins를 선택합니다.

시간이 다소 걸립니다. 사용하지 않을 Ant plugin도 다운되는 것을 확인할 수 있습니다.

Jenkins에서 사용할 User 정보를 입력한 뒤, Save and Continue를 선택합니다. 입력한 정보는 Jenkins Login 시 사용됩니다.

Save and Finish를 선택합니다.

Jenkins 초기 설정이 끝났습니다. Start using Jenkins를 선택합니다.

드디어 Jenkins 홈 화면에 도착했습니다.

Jenkins 한글화

Windows를 영어로 설정해뒀다면, Jenkins 또한 영어로 표시됩니다. 완벽하게 한글로 바뀌지는 않지만, 최대한 한글로 바꿔보겠습니다.

Manage Jenkins를 선택합니다.

Plugins를 선택합니다.

Available plugins를 선택합니다.

검색 창에 'Locale'를 검색한 뒤, 체크박스를 선택하고 Install를 선택합니다.

Download progress창을 맨 아래로 내려보면 Download 되는 것을 확인할 수 있습니다.

Download가 완료되었다면, 왼쪽 상단 Jenkins 로고를 선택해 홈 화면으로 이동합니다. 다시 Manage Jenkins를 선택합니다.

System를 선택합니다.

중간 쯤 Locale이 보입니다.

'ko'를 입력한 뒤 체크박스를 선택합니다. Save를 선택합니다.

완벽한 한글화는 아니지만 어느정도 한글화가 진행됐습니다.

gradle, JDK, git 설정

gradle project(SpringBoot Project)를 띄우고 github을 통해 CD 환경을 구축하기 위해 gradle, JDK, git을 설정해줘야 합니다.

Jenkins 관리를 선택합니다.

Tools를 선택합니다.

JDK 추가

먼저 JDK를 추가합니다. JDK installations에서 Add JDK를 선택합니다. 저는 zulu17을 사용하고 있어서 Name에 zulu17을 적었습니다. Name은 아무렇게나 적어도 상관없습니다.(Install automatically를 사용해도 되기는 합니다만 이 방법을 추천합니다.)

JAVA_HOME 주소를 검색하기 위해 시스템 환경 변수 편집 화면으로 이동합니다.

환경 변수를 선택합니다.

시스템 변수에서 JAVA_HOME을 확인합니다.

값을 복사합니다.

값을 입력합니다.

git 추가

JDK instasllations 바로 아래 Git installations로 이동합니다. git은 환경 변수가 없습니다. Path to Git executable에 git.exe가 있는 경로를 입력해야 합니다.

저는 git을 아래 경로에 설치해뒀습니다. 각자 개인이 git을 설치한 경로를 찾습니다. 이때 git.exe를 바로 실행할 수 있는 경로까지 가야합니다.

C:\Program Files\Git\bin

경로를 복사합니다.

경로를 붙여넣기합니다. git.exe까지 넣어야 하는 것을 주의합니다.

C:\Program Files\Git\bin\git.exe

Gradle 추가

Git installations 아래 Gradle installations로 이동합니다. Add Gradle를 선택합니다. Install automatically의 체크박스를 해제합니다.

Name을 입력합니다. 저는 gradle7.5를 사용하고 있어서 gradle7.5라고 입력했는데, 아무렇게나 입력해도 괜찮습니다.

GRADLE_HOME 경로를 입력하기 위해 다시 시스템 환경 변수 편집 창을 엽니다.(GRADLE_HOME이 없는 분은 GRADLE을 설치해야 합니다.) 다운로드

환경 변수를 선택합니다.

시스템 변수에서 GRADLE_HOME을 선택한 뒤 편집을 선택합니다.

값을 복사합니다.

값을 붙여넣기합니다.

JDK, git, Gradle 추가가 끝났습니다. Save 버튼을 눌러줍니다. 이제 끝난 것 같겠지만, 아직 갈 길이 멉니다.

Jenkins Project 추가

Jenkins 홈 화면에서 새로운 Item을 선택합니다.

Jenkins Project Name을 입력합니다. 아무렇게나 입력해도 됩니다. FreeStyle Project를 선택한 뒤 OK 버튼을 선택합니다.

Project Configure > General 화면으로 이동했습니다. 우리는 github webhook을 이용할 것이기 때문에 General에 Github Project를 선택합니다.

자신의 github repository 주소를 입력합니다. Display Name은 입력하지 않아도 상관없습니다.

이때 주의할 점이 있습니다. repository 시작에 build.gradle이 위치해야 합니다. 만약 상위 폴더가 있고, 그 아래로 접근해야 build.gradle이 위치해 있다면 나중에 오류가 발생하게 됩니다.

바로 아래 소스 코드 관리로 이동합니다. Git을 선택합니다.

자신의 git repository를 입력한 뒤, Credential 아래에 Add를 선택하고 Jenkins를 선택합니다. Credential은 신원 증명을 위한 것입니다. 즉, repository URL에 적힌 repository가 본인의 repository인지 확인하는 것입니다.

Kind의 Username with password를 선택합니다.(default로 선택되어 있습니다.)

Username에는 본인의 github ID, password에는 본인의 github PW를 입력합니다. ID, Description은 비워둬도 상관없습니다. Add를 선택합니다.

Credentials에서 방금 추가한 credential을 선택합니다.

build할 branch를 설정합니다. default는 master로 되어 있는데, 저는 최상위 branch가 main이기 때문에 main으로 바꿔줍니다.

아래 Build Steps로 이동합니다. Invoke Gradle에서 우리가 설정한 gradle을 입력하고, Tasks에 clean build를 입력합니다.

저장 버튼을 선택한 뒤, 홈 화면으로 이동합니다.

Build test

우리는 방금 github와 Jenkins를 연동했습니다. Jenkins에서 정말 github repository에 있는 gradle Project(SpringBoot Project)를 가져오는지 확인합니다.

홈 화면으로 이동합니다. Project를 선택합니다. 저는 iraefolio로 이름을 설정해뒀습니다.

왼쪽 메뉴바에서 지금 빌드를 선택합니다.

지금 빌드를 선택하면 왼쪽 메뉴바 Filter build.. 검색창 아래에 build되는 것을 확인할 수 있습니다. #숫자 옆에 아래 화살표를 눌러봅니다.

Console Output를 선택합니다.

Console을 자세히 보면 Commit message가 보입니다. 저는 마지막으로 main에 커밋한 내용이 "Conf: 스프링부트 포트 변경(8080 -> 80)"이기 때문에 이 문구가 나타납니다.

실제로도 마지막 commit을 가져오는지 마지막 commit을 github에서 확인합니다. 진짜로 마지막 commit을 가져왔습니다.

빌드된 파일 확인

빌드된 파일은 아래 경로에 위치합니다. 어디에 위치하는지 반드시 기억해둬야 합니다.

C:\ProgramData\Jenkins\.jenkins\workspace\iraefolio\build\libs

Jenkins Project 배포

방금 build가 된 것을 확인했습니다. 그런데 배포되지는 않습니다. 이제 배포를 해보겠습니다.

Jenkins 홈 화면으로 이동합니다.

Jenkins 관리로 이동합니다. Plugins로 이동합니다.

Available plugins를 선택한 뒤 Post build task를 검색하고 체크박스를 체크한 뒤 Install을 누릅니다.

Download progress를 아래로 스크롤하면 Post build task가 다운로드 되는 것을 확인할 수 있습니다.

다시 홈 화면으로 이동한 뒤 프로젝트를 선택합니다.

구성을 선택합니다.

아래로 내려 빌드 후 조치로 이동합니다.

빌드 후 조치 추가를 선택하면 Post build task가 나옵니다.(위에서 plugin을 설치하지 않았으면 해당 메뉴는 나타나지 않습니다.)

Script에 아래 내용을 추가합니다. 당연히 제 값을 복사하는 것이 아니라, 자신의 project가 build된 경로를 입력해야 합니다.

java -jar C:\ProgramData\Jenkins\.jenkins\workspace\iraefolio\build\libs\iraefolio-0.0.1-SNAPSHOT.war

저장을 누릅니다. 다시 지금 빌드를 선택합니다. Console을 확인해보면 project가 실행된 것을 확인할 수 있습니다.(저는 SpringBoot Project를 실행했습니다.)

project가 실행됐기 때문에 애플리케이션에 접근할 수 있습니다.(저는 SpringBoot의 포트를 80으로 설정했기 때문에 localhost로 접근했습니다.)

github webhook 설정

이제 빌드도 되고, 배포도 됩니다. 그럼 이제 github에서 해당 repository에 push 됐을 때, Jenkins가 이를 감지해서 다시 빌드하는 과정을 진행하겠습니다.

홈 화면으로 이동한 뒤 프로젝트를 선택합니다.

구성을 선택합니다.

빌드 유발에서 GitHub hook trigger for GITScm polling의 체크박스를 체크한 뒤, 저장을 선택합니다.

자신의 github repository로 이동합니다.

repository setting > webhooks을 선택합니다. Add webhook를 선택합니다.

payload URL과 Content type을 입력해야 합니다. Content Type은 application/json을 선택합니다.

Payload URL 설정

Payload URL에서 자신의 ip와 jenkins의 port, /github-webhook/를 입력해야 합니다. 이때, http://localhost는 사용할 수 없습니다. 자신의 ip는 google에 'what is my ip'를 검색하면 됩니다.

http://{자신의 IP}:{Jenkins Port}/github-webhook/

Payload URL, Content Type 설정을 마쳤다면 Add webHook을 선택합니다.

webhook은 마무리 됐습니다. 그럼 이제 github에 push를 보낸 뒤 Jenkins가 이를 감지하는지 확인하겠습니다.

젠킨스 홈 화면으로 이동합니다. 빌드 대기 목록에 방금 push한 project가 build 되는 것을 확인할 수 있습니다.

Console을 확인하기 위해 이동합니다.

배포가 잘 이뤄지고 있습니다.

애플리케이션에도 잘 접속됩니다.



여기까지 따라오셨다면, 거의 대부분 다 한 것입니다. 그런데 하나 아쉬운 것이 있습니다. 눈치가 빠른 분은 아시겠지만, 배포가 이뤄진 뒤, github에서 push를 보낸 다음 배포되고 있는 project가 종료되고 새롭게 빌드 된 project가 배포되어야 하는데 아직 그 방법을 모르겠습니다.

현재는 배포되고 있는 project를 종료해야 하는 번거로움이 있습니다. 방법을 찾게 된다면 다시 적어두도록 하겠습니다.

profile
혜화동 사는 Architect

0개의 댓글