-
[AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 1) CI 구현하기 (Jenkins 설치 및 실행, Github연동(ssh, webhook))Spring 2022. 9. 17. 09:14
CI/CD는 예전에 미션을 진행하면서 jenkins를 이용한 CI/CD 구현에 대해서 한번 찾아본 적이 있긴 하지만,
구체적으로 정리하면 좋을 것 같아 진행하게 되었다.
( 마침 면접용 spring 프로젝트가 생겼기 때문이기도 하다!😅 )
EC2에 자바 설치
가장 먼저 프로젝트를 배포할 ec2를 만들어 준다. 나의 경우 ubuntu 22.04 버전을 사용하고 퍼블릭 ip를 이용하여 접속이 가능하도록 설정해주었다. (ec2생성 파트는 지난 배포 블로그 글에서 자세히 다루었다)
먼저 ubuntu ec2에 접속하여 자바를 설치해준다.
$ sudo apt update $ sudo apt install default-jre $ sudo apt install default-jdk ## 설치된 자바 버전 확인 $ java --version
Jenkins 설치 및 실행하기
다음으로 jenkins를 설치하자. 자세한 내용은 공홈을 참고하면 된다.
https://pkg.jenkins.io/debian-stable/
## 설치파일 다운로드 $ curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \ /usr/share/keyrings/jenkins-keyring.asc > /dev/null $ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list > /dev/null ## 설치 진행 $ sudo apt-get update $ sudo apt-get install fontconfig openjdk-11-jre $ sudo apt-get install jenkins ## jenkins 실행 $ sudo systemctl daemon-reload $ sudo systemctl start jenkins $ sudo systemctl status jenkins ## 다음과 같이 active (running) 및 grep jenkins로 확인 가능 ubuntu@ip-172-31-0-48:~$ sudo systemctl status jenkins ● jenkins.service - Jenkins Continuous Integration Server Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: Active: active (running) since Thu 2022-09-15 12:48:41 UTC; 4min 10s ago Main PID: 9052 (java) Tasks: 36 (limit: 1134) CGroup: /system.slice/jenkins.service └─9052 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/je ubuntu@ip-172-31-0-48:~$ ps -elf | grep jenkins 4 S jenkins 9052 1 9 80 0 - 608473 - 12:47 ? 00:00:41 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080 0 S ubuntu 9318 1759 0 80 0 - 3714 pipe_w 12:54 pts/0 00:00:00 grep --color=auto jenkins ## 방화벽 설정 $ sudo apt update && sudo apt install firewalld -y $ sudo firewall-cmd --version $ sudo firewall-cmd --permanent --add-port=8080/tcp $ sudo systemctl restart firewalld $ sudo firewall-cmd --list-all
Jenkins 접속하기
jenkins 설치 및 실행이 완료되었다면 웹사이트에 들어가서 확인할 것이다. 먼저 ec2 보안규칙에 8080(젠킨스의 기본 포트)포트를 열어준다. 이후 http://[ec2의 ip]:8080 사이트로 접속한다.
페이지에 접속할 때 사용할 초기비밀번호는 다음과 같이 확인할 수 있다.
ubuntu@ip-172-31-0-48:~$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword f8d8c69fd98f487cba805538648e626a
Install suggested plugins를 선택하고 초기 설정이 완료되면, 이름 및 부가 정보를 입력하고 start를 눌러준다.
Github 연동하기
이제 CI를 위해 ssh를 이용하여 github과 jenkins를 연동시켜보자. 먼저 터미널에서 ssh키를 생성해준다.
## ssh 키 생성하기 $ cd /var/lib/jenkins $ sudo mkdir .ssh $ sudo ssh-keygen -C jenkins@apple Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): ./.ssh/id_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ./.ssh/id_rsa. Your public key has been saved in ./.ssh/id_rsa.pub. The key fingerprint is: SHA256:3/jMjSj6tTAlKXsufCV1t6gu69PuLiB/uDNxVPagTIc jenkins@apple The key's randomart image is: +---[RSA 2048]----+ | . | | E = | | o = o | | +.. o . | | ..S... o . | | . ooo+.o. . | | +.=+++.. | | BoB+o* o | | o@=@B = . | +----[SHA256]-----+ ## 키 읽기 권한 부여하기 $ sudo chown -R jenkins: .ssh $ sudo chmod 700 .ssh $ sudo chmod 600 .ssh/id_rsa .ssh/id_rsa.pub $ sudo cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDgCZQcHZffJMwF28ywvUBoc1HFi14InW5a5Z4IcDW8vLHrOZQIE5bU3juPJAuez8wAX/7983XQQpf4MRmqu1O/E0t14q9FgZKjGsvfaitc43hquegvBbhpX1K6H702onMatp3rUTOo2sHDG3GMUljTK2BCy2cc/1sSvkKtyNFMnfA8VU97XXXXGe+zk+11KyfRDTLzvLHWnHcPURMK1TWeLEaWgfMo42cMtjiHyrjeWDQrHB1aIs4JaBGmiQ7I3M6ja7KBH71r6KZj1fukYIyMTbFEgfxq8JiAwqHCCQfqDXDDJZ6NF2zqYwrO9SypY+JnjFM3j5ogO7Et8wjYzbZhtfJiOqdTLQYjVttpLnRWeuEPPJKPIcsWTyCJBdtTHqw99QoWRWu64FxU2Rz7DI0lm9zqr+NKQV9pXwZJay2/lpwtklm9xxSTi3Msb0DYfuaZutT3YwQ4jlvfRRM60U3xQdO0R58bGTk9vqgMn7+jzTA7RZmrV4pFjgoUhgAb4w0= jenkins@apple
복사된 id_rsa.pub 키를 github 저장소에 등록해준다.
저장소의 settings. -> deploy keys -> add deploy key
이번엔 젠킨스에 생성된 공개키를 넣어준다.
$ sudo cat .ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAp4wsYSzfSqVWR4VvwG6+/YluNTl80LKr6FQ3QKnUPD9gmuDs 7FRIJKlDrpdfi19eD7AaXcUVCcaYoPrVB6GOE/o9lcXeg2OgUtisoV/7ZVG5DzXF xKR4QU82XaFfO1DN+BuMIx7/zLigmvBXD/1ll49GaZYPpSKJzWrjtSy2AcL/Y1rF WGY9hMUyWeqMvuJZ5LK1ri42jHNRIBpJ7c3bVGTD49Ez08lpiwrgGi9LREM0VxfY kdBihHDZKU0acFdpvWVeClu/tLurzpsBkAie+1Pmm9pyZKyuP/OjNfTnHQK9eoQB E/L3FweQVKkZWnMjPfTyVVaKGpPhq2YgvkB8MwIDAQABAoIBAGYhhwfxP2eUI2TT jQxjNZ79ACYHlfLthubHNyr+mvXiuDOQujtRIOzgFPa/JSmjB4ZOlbPlJ+7elTlD zUmqjB3XY2UByaKTvy3hEFIKXQck6sa/w38btoYxD/XBIXjZx8Penuzlv43+WUA5 EwkXMK9TUduY8o554EBMUOOmjofBZivMbyoIwBHmXGRwRAfU8YJUGeR1gN/FgBx4 xqz0jUoYUnpDSUdxIWaKkkoSukxJzT1SvouByEi4L+3bYJ2tUXBpJ0rDJSCtHLOe 4pWRdjD5/suJrnwCS9zjKiShFznWdZA2tSwah4KR0AOBWiu+njzovceE1CZtUBo0 eLb7E1kCgYEA1V/cHpQ9IffgLp/FhwhH15acPzIXLQGjtOPs+R5jZ7c5vPTpfq9d HEN/xSI9gSmeIyLN/YCEqyfWA41BM4UzKisQgG6pyF/RX0N3AOFh7aUHJOdOuPj8 q2AKeWP3cFjzJ4/uQj1f9f2YXDEOGQrQqORnDvGnb7x8PNutuGvXmwcCgYEAyQSw biqR8dKWS3LbHSdcpHCKYp2lpH8WiWOJZm7gEm+xGFwVJp6x2cskSY7m0p0w/8EG W/xLScqn3U40WO0J8Sm4ghmc6NtWf5/wE3FEWRtKzbrfv4KpiIxDx/Zhbqw8wRV5 HH0HQ4g/sjfBv0E0b9s0WU+VhhFqZuRw0OGRznUCgYAfBJNkIpqMcJM3U+SMD6kZ 7vwBt89krINWzXdqc39x2VHcZSH4V5fKfwl459RXDWy+oNWfD2q50s2qsIMU8T0R 2TbJ5Mxro3o1RgJrr1fkCwRx2eo4u4FHjGuZX+3deCDI1ISHPpLPmLDoXf01qLvS gXl1061KcfUBh9HGKG8sSwKBgDvOI1eDXsxdZM2prDruPQfHW8SfNmrMTL4vWO+a yRtzE3M14i0NRciQQYmI9G9wyOUuXl/7ncKkgnC7FaPnUe/oA7bhO+ejagaqZNjD +BuynPy8PllR3HJ9mKTjTnWI1MJ1SwUIxaJ35Mt2/zORiLJGuzpfDRNIFynpiQ78 LU8JAoGAEJ8zEtkOkEwu8Ke3Gz/LPN1krtsaKjQ5geGTzJyaF5xxrcXUPLU3NCuT YZA8emDusfaC+HidzCykqL2Jsofzi9GJSGebMj6vs26vESud7LvtPyoB4VsTvAC6 mhwd39pDvsriBu1zdPmKgmxNHgfEdoJEkwMCU1VBdQI1sWPocIE= -----END RSA PRIVATE KEY-----
Jenkins 관리 -> Credentials -> add credentials -> SSH Username with private key 추가
Jenkins 플러그인 설치
이번엔 Github과 연동시 필요한 플러그인을 설치해준다.
Jenkins 관리 -> 플러그인 관리 -> 설치가능 탭 선택 -> Github Integration, Public over ssh 플러그인 설치 (Install without restart)
Jenkins 프로젝트 등록
이번엔 젠킨스에 프로젝트를 등록해준다.
+ 새로운 아이템 -> Freestyle project -> Git -> git repository URL 입력 및 아까 만들어둔 credential 선택 -> save
지금 빌드를 선택하면 다음과 같이 콘솔에서 빌드에 SUCCESS하는 것을 확인할 수 있다.
Webhook 적용하기
이제는 Github Webhook을 이용하여 프로젝트에 PUSH가 발생할 경우(코드 반영이 필요한 경우) 자동으로 Polling되어 빌드되도록 설정하자.
프로젝트 선택 -> 구성 -> 빌드유발 -> Github hook trigger for GITScm polling 선택 -> save
Github 프로젝트 저장소에도 webhook을 설정해준다.
프로젝트 setting -> Webhooks -> add webhook -> http://[젠킨스 서버 public ip]:8080/github-webhook 입력 -> Content type application/json 으로 webhook 생성 -> 초록색 체크 확인
이제 잘 반영되는지 확인하기 위해 프로젝트에 push를 보내보자.
저장소에 push가 되면 저절로 빌드를 시작하고 성공하는 모습을 확인할 수 있다!
( 참고한 사이트 ✨ )
https://choiiii-dev.tistory.com/13
https://hyunmin1906.tistory.com/272
https://gksdudrb922.tistory.com/195
https://hyunie-y.tistory.com/37
https://velog.io/@junho5336/jenkins%EB%A1%9C-%EB%B9%8C%EB%93%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
'Spring' 카테고리의 다른 글
[AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 3) CD 구현하기 ② (Sonarqube 설치 및 연동) (0) 2022.09.17 [AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 2) CD 구현하기 ① (Jenkins 배포) (0) 2022.09.17 에러 페이지 반환하기 (Feat.ErrorController) (0) 2022.08.29 @Aspect (AOP) 적용하기 (0) 2022.06.09 Springboot와 React(Axios)에서 컨트롤러 prefix 수정하기 (0) 2022.05.30