-
[AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 3) CD 구현하기 ② (Sonarqube 설치 및 연동)Spring 2022. 9. 17. 09:14
이번엔 프로젝트를 배포할 때, Jenkins와 Sonarqube를 연동하여 코드에 문제가 없는지 확인한 후 배포가 진행되도록 할 것이다.
Sonarqube 설치 배경 설정
먼저 sonarqube를 사용하기 위한 설정을 위해 다음과 같이 root사용자로 변환해준다. 기존 ubuntu 사용자로 진행시 permit denied가 된다. 자세한 내용은 다음에서 확인이 가능하다.
https://docs.sonarqube.org/7.9/requirements/requirements/
## 현재 사용자 확인 ubuntu@ubuntu:~$ whoami ubuntu ## root 사용자 패스워드 설정 ubuntu@ubuntu:~$ sudo passwd root [sudo] password for ubuntu: New password: Retype new password: passwd: password updated successfully ## root 사용자로 전환 ubuntu@ubuntu:~$ su root Password: ## 사용자 확인 root@ubuntu:~# whoami root
다음으로 sonarqube를 설치하기 위한 몇가지 설정을 진행해준다.
## 시스템 설정 (다음의 내용을 추가로 입력) ## sonarqube 설치를 위한 사용자 스레드 수는 4096 이상, max-file은 65536 이상이어야 한다. $ vim /etc/sysctl.conf vm.max_map_count=262144 fs.file-max=65536 ulimit -n 65536 ulimit -u 4096 ## sonar라는 사용자모드일때에도 다음과 같이 반영이 되도록 설정해준다. ## 여기서 nofile은 file, nproc은 max user proccess를 의미한다. $ vim /etc/security/limits.conf sonar soft nofile 65536 sonar hard nofile 65536 sonar soft nproc 4096 sonar hard nproc 4096 ## 시스템을 리부트 해준다. root@ip-172-31-0-62:/# reboot
자바 설정 파일을 확인한다.
$ sudo update-alternatives --config java There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java
Postgres DB 설치
Sonarqube 사용(내용 저장)을 위해서 Postgres DB를 설치해준다. 여기서 보면 postgres는 5432번 포트에서 작동하고 있기 때문에 ec2 보안 인바운드 규칙에 해당 포트를 추가해주어야 한다.
## postgres 설치 $ sudo apt-get update $ sudo apt-get install postgresql postgresql-contrib ## postgres 실행 $ sudo systemctl enable postgresql.service ## postgres 실행 (active) 확인 root@ip-172-31-0-62:/# sudo systemctl status -l postgresql.service ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2022-09-16 17:57:27 UTC; 2min 31s ago Main PID: 6390 (code=exited, status=0/SUCCESS) CPU: 1ms ## postgres 사용자 등록 $ sudo passwd postgres ## postgres 사용자로 전환 $ su postgres ## postgres의 sonar 사용자 등록 및 데이터 베이스, 권한 설정 $ createuser sonar $ psql $ ALTER USER sonar WITH ENCRYPTED PASSWORD 'sonar'; $ CREATE DATABASE sonarqube OWNER sonar; $ GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonar; ## postgres 에서 나오기 postgres=# \q postgres@ip-172-31-0-62:/$ exit ## postgres 재실행 $ systemctl restart postgresql ## postgres 상태 확인 (running) $ sudo systemctl status -l postgresql ## 포트확인을 위한 net-tools 설치 $ sudo apt install net-tools ## postgres 포트 및 상태 확인 $ netstat -tulpena | grep postgres tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 114 40906 6672/postgres udp 0 0 127.0.0.1:48858 127.0.0.1:48858 ESTABLISHED 114 40908 6672/postgres
Sonarqube 설치 및 실행하기
이제 Sonarqube를 설치하자.
https://www.sonarqube.org/downloads/
## sonarqube 폴더 생성 $ sudo mkdir /sonarqube/ ## 설치 파일 다운 $ sudo curl -O https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.0.34182.zip ## 압축 해제 $ sudo apt-get install zip ## opt 폴더에 압축파일 해제 및 설치 $ sudo unzip sonarqube-8.3.0.34182.zip -d /opt/ $ cd /opt/ ## sonarqube 폴더안으로 해제 파일 이동 $ mv sonarqube-8.3.0.34182/ sonarqube root@ip-172-31-0-62:/opt# ls sonarqube ## sonarqube를 위한 그룹, 사용자 등록 및 권한 설정 $ sudo groupadd sonar $ sudo useradd -c "SonarQube User" -d /opt/sonarqube/ -g sonar sonar $ sudo chown sonar:sonar /opt/sonarqube/ -R
이제 postgres와의 연동을 위한 설정을 진행한다.
## 설정파일에 다음의 내용 추가 $ vim /opt/sonarqube/conf/sonar.properties ## db 연동 설정 sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube ## elasticsearch 설정 sonar.search.javaOpts=-Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
Sonarqube 실행을 위한 사용자를 설정하고 실행한다.
## 사용자 설정 $ vi sonar.sh RUN_AS_USER=sonar ## 방화벽 설정 $ sudo apt update && sudo apt install firewalld -y $ sudo firewall-cmd --version $ sudo firewall-cmd --permanent --add-port=9000/tcp $ sudo systemctl restart firewalld $ sudo firewall-cmd --list-all ## 사용자 전환 및 sonarqube 실행 $ su sonar $ bash sonar@ip-172-31-0-53:/opt/sonarqube/bin/linux-x86-64$ ./sonar.sh console start
다음과 같이 Process[es] is up을 통해서 잘 실행되는 것을 확인할 수 있다.
Sonarqube 토큰 생성
이제 http://[sonarqube ec2의 퍼블릭 ip]:9000으로 소나큐브를 실행할 수 있다. 초기 아이디, 비밀번호는 admin, admin이다.
먼저 토큰을 생성해준다.
My Account -> Security -> Generate Tokens에서 토큰이름 설정 후 Generate -> 생성된 토큰 copy
Sonarqube 프로젝트 생성하기
그 다음 프로젝트를 등록해준다.
Projects -> create new project -> Project key 입력 -> 생성
Jenkins와 Sonarqube 연동하기
이제 Jenkins와 Sonarqube를 연동해 줄 것이다. 먼저 Jenkins에 Sonarqube Scanner 플러그인을 설치해준다.
그 다음 SonarQube Scanner 설정을 진행해준다.
Jenkins 관리 -> Global Tool Configuration -> SonarQube Scanner 추가 및 저장
Sonarqube 서버를 등록해준다.
Jenkins 관리 -> Configure System -> SonarQube servers -> Sonarqube URL (http://[sonarqube ec2 퍼블리 ip]:9000) 등록 -> save
이제 프로젝트 빌드시에 sonarqube로 코드를 검사할 수 있도록 추가해준다.
프로젝트 -> 구성 -> Build에 Execute SonarQube Scanner 추가 -> Analysis properties에 다음과 같이 작성 -> Invoke top-level Maven targets 과 Excute shell 사이에 Execute SonarQube Scanner 위치 -> save
sonar.login=0f3079e80a4c5f9ee81d4ceaf2f59b1ac287f914 # Sonarqube 토큰값 sonar.projectKey=jenkins # Sonarqube 프로젝트 생성 시 Key 값 sonar.projectName=jenkins # Sonarqube 프로젝트명 sonar.host.url=http://[sonarqube ec2 퍼블리 ip]:9000/ # Sonarqube 스케너가 구동되고 있는 ip:port sonar.report.export.path=sonar-report.json detekt.sonar.kotlin.config.path=default-detekt-config.yml sonar.sources=src/main/java,src/main/resources sonar.java.sourcesion=1.0 sonar.sourceEncoding=UTF-8 sonar.java.binaries=target/classes
프로젝트 빌드를 다시 실행하면 다음과 같이 빌드와 배포사이에 sonarqube를 이용한 코드검토가 이루어지는 것을 확인할 수 있다.
sonarqube 사이트로 다이 이동해서 프로젝트를 확인하면 잘 코드 검토가 이루어지는 것을 확인할 수 있다.
완성 ! ✨
(참고한 사이트 ✨)
https://yuhe-dogspaw.tistory.com/112
https://jungwoong.tistory.com/98
https://zunoxi.tistory.com/105
https://scshim.tistory.com/539
https://oingdaddy.tistory.com/381
https://jungwoong.tistory.com/98
https://kys9261.github.io/2019/05/02/programming/devops/how-to-install-sonarqube-on-ubuntu/
https://zunoxi.tistory.com/103
https://aws-diary.tistory.com/153
https://bantree.tistory.com/201
https://dololgun.github.io/sonarqube/sonarqube/
https://ko.linux-console.net/?p=246#gsc.tab=0
'Spring' 카테고리의 다른 글
Spring에서 HttpServletRequest의 반복적 읽기 (feat. Filter에서는 request 교체가 가능한 이유) (0) 2023.08.22 Transaction Propagation과 예외 전파 (0) 2023.02.12 [AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 2) CD 구현하기 ① (Jenkins 배포) (0) 2022.09.17 [AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 1) CI 구현하기 (Jenkins 설치 및 실행, Github연동(ssh, webhook)) (0) 2022.09.17 에러 페이지 반환하기 (Feat.ErrorController) (0) 2022.08.29