-
Notifications
You must be signed in to change notification settings - Fork 0
Sonarqube
- 소나큐브는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 소나소스(SonarSource)가 개발하였다. 소나큐브는 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공한다. by 위키백과-소나큐브
- Springboot project를 진행하는데 있어서 Github, Jenkins와 연동하여 PR을 등록할때마다 자동으로 코드를 분석하게 한다면, 리뷰어들의 컨벤션 및 오류 체크 등에 대한 리뷰 부담을 덜어주고 클린 코드를 유지하면서 개발하는데 도움이 된다고 생각했기 때문이다.
- 환경
- EC2(Amazon Linux 2 AMI)
- Nginx(1.18.0)
- Jenkins 2021.5.14 기준 https://pkg.jenkins.io/redhat-stable/ 최신 stable 버전
- JDK(openjdk version "11.0.11") java-11-amazon-corretto로 설치
-
sudo yum install git -y: git 설치 -
cd /opt: opt 디렉토리로 이동 -
sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.5.zip:sonarqube 7.9.5버전 알집 파일 다운로드- 7.9 LTS 이후 버전은 JDK 11, 7.8 이하는 JDK 8 요구
-
sudo unzip sonarqube-7.9.5.zip: 압축 해제 -
sudo mv sonarqube-7.9.5 sonarqube:sonarqube-7.9.5를sonarqube로 이름 변경 -
sudo groupadd sonar: sonar라는 그룹 추가 -
sudo useradd -c “Sonar System User” -d /opt/sonarqube -g sonar -s /bin/bash sonar: sonar라는 유저 추가 -
sudo passwd sonar: sonar 유저에 대한 비밀번호 설정 -
sudo usermod -a -G sonar ec2-user:ec2-user그룹에sonar유저 추가 -
sudo chown -R sonar:sonar /opt/sonarqube:sonar그룹,sonar유저로 설정 -
sudo chmod -R 775 /opt/sonarqube: 파일 권한 수정 -
sudo vim /opt/sonarqube/bin/linux-x86–64/sonar.sh: sonar.sh 파일 열기-
RUN_AS_USER항목을 찾아서RUN_AS_USER=sonar로 수정
-
- 최신 버전에 가까울수록 Mysql을 지원하지 않기 때문에 PostgresSQL 설치 권장(Sonarqube 7.9 버전에서는 최소 PostgresSql 9.3이상 필요!!)
-
PostgresSQL
-
sudo amazon-linux-extras install postgresql10 epel -y:postgresql10설치 -
sudo yum install postgresql-server postgresql-devel -y: Posrtgresql 관련 의존성 설치 -
sudo postgresql-setup initdb: Posrtgresql 클러스터 생성 -
sudo systemctl enable postgresql: 부팅 시, Posrtgresql 실행 -
sudo systemctl start postgresql: Posrtgresql 실행 -
sudo su - postgres: Posrtgresql 설치 시 추가된postgres사용자로 전환 -
psql: psql shell 실행 -
CREATE USER sonar WITH ENCRYPTED PASSWORD 'sonar_password';:sonar라는 사용자 생성 -
CREATE DATABASE sonarqube;:sonarqube라는 DB 생성 -
GRANT ALL PRIVILEGES ON DATABASE sonarqube to sonar;:sonar사용자에sonarqubeDB에 대한 모든 권한 설정 -
SHOW hba_file;:hba_file경로 확인 -
\q: psql shell 종료 -
exit: ec2-user로 전환 -
sudo vim $hba_file경로: 10에서 확인한 경로 붙여넣어 파일 열기 - 아래의 내용으로 수정
```java # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer local all sonar md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 ```-
sudo systemctl restart postgresql: Posrtgresql 재실행
-
-
Mysql(Sonarqube 7.2 버전에서는 동작 확인)
-
sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm: mysql 5.7 버전 설치 -
sudo yum install -y mysql-community-client: mysql commutiy client 설치 -
sudo yum install -y mysql-server: mysql server 설치 -
sudo service mysqld start: mysqld 실행-
service mysqld status를 통해 이미 실행이 된 상태라면 넘어가도 된다.
-
-
sudo grep 'temporary password' /var/log/mysqld.log:- mysql 초기 설정된 비밀번호 출력
-
mysql -u root -p: root 계정으로 mysql 접속- 5번에서 출력된 비밀번호 입력
-
ALTER USER 'root'@'localhost' identified by 'password’;: localhost root 계정 비밀번호 수정-
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements, 변경하려는 패스워드가 패스워드 설정 요구 조건에 맞지 않을 경우, 위와 같은 에러가 발생한다.-
해결 방법
-
SHOW VARIABLES LIKE 'validate_password%';: 패스워드 검증 관련 변수들을 출력
-
set global validate_password_policy=LOW;: LOW로 설정
-
LOW: 패스워드 길이 (default 8자 이상) -
MEDIUM: 패스워드 길이 (default 8자 이상) + 숫자, 대문자, 소문자, 특수문자 모두 포함 -
STRONG: 패스워드 길이 (default 8자 이상) + 숫자, 대문자, 소문자, 특수문자 모두 포함 + dictionary file 등록 (파일에 포함된 단어는 비밀번호로 사용할 수 없다.)
-
-
-
-
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_bin;: sonar라는 DB 생성 (문자 인코딩 utf8 로 하며 binary 값으로 정렬) -
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar password';: localhost sonar 계정 생성 + sonar 관련 DB에 모든 권한을 준다. -
FLUSH PRIVILEGES;: 설정한 권한 바로 적용
-
-
sudo vim /opt/sonarqube/conf/sonar.properties: sonarqube 환경 설정 파일 열기sonar.jdbc.username=sonar sonar.jdbc.password=sonarqube password Postgresql // sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube Mysql // sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance sonar.web.context=/sonarqube // for reverse proxy
- Nginx를 앞단에서 reverse proxy로 사용하고 있기 때문에 sonarqube로 우회할 수 있도록 추가해준다. reverse proxy 사용을 안하면 위의 3줄만 추가해주면 됨.
- 현재 Nginx에서
jenkins는/일 경우 우회하도록 설정해놓았기 때문에,sonarqube는/sonarqube로 해줌
- 현재 Nginx에서
- Nginx를 앞단에서 reverse proxy로 사용하고 있기 때문에 sonarqube로 우회할 수 있도록 추가해준다. reverse proxy 사용을 안하면 위의 3줄만 추가해주면 됨.
-
sudo vim /etc/nginx/nginx.conf: nginx 설정 파일 열기-
80번 포트(Nginx)로 들어올 시9000번 포트(Sonarqube)로 연결해주는 아래의 설정을 추가해줘야 한다.
location /sonarqube { proxy_pass http://localhost:9000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; } -
-
sudo /opt/sonarqube/bin/linux-x86-64/sonar.sh console: sonarcube 실행 및 콘솔로 출력-
# There is insufficient memory for the Java Runtime Environment to continue.메모리 에러 부족 발생 시- 해결 방안
- 프리티어로 사용할 수 있는 EC2 서버가 아닌 유료 버전으로 업그레이드한다.
- SWAP 메모리 사용
- AWS 서비스 비용을 부담하기 어려운 경우 2번, 아닐 경우 1번을 선택하면 된다.
- 2번의 경우, 스왑 파일을 사용하여 Amazon EC2 인스턴스에서 스왑 공간으로 사용할 메모리를 할당하는 방법은 무엇입니까? AWS 공식 홈페이지에서 제공하는 가이드를 그대로 따라해주면 된다.
- 해결 방안
-
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]가상 메모리 에러 발생 시- 해결 방안
-
sudo sysctl -w vm.max_map_count=262144: 임시로 vm.max_map_count=262144 설정- 영구적으로 설정하기 위해서는
sudo vim /etc/sysctl.conf에vm.max_map_count=262144추가
- 영구적으로 설정하기 위해서는
-
- 해결 방안
-
-
sudo vim /etc/systemd/system/sonarqube.service:sonarqube를 위한 service 파일 생성 및 열기[Unit] Description=SonarQube service After=syslog.target network.target [Service] Type=simple User=sonar Group=sonar PermissionsStartOnly=true ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop ExecReload=/opt/sonarqube/bin/linux-x86-64/sonar.sh restart PIDFile=/opt/sonarqube/bin/linux-x86-64/./SonarQube.pid TimeoutStartSec=5 Restart=always SuccessExitStatus=143 [Install] WantedBy=multi-user.target
- 위의 코드 추가
-
sudo systemctl enable sonarqube.service:sonarqube서비스 활성화(부팅 시 자동 구동) -
sudo systemctl start sonarqube.service:sonarqubeservice 시작 -
브라우저에서
http://EC2's public ip/sonarqube:sonarqube로 접속-
Log in버튼을 누르고 로그인 (default id : admin, password : admin)

-
-
프로젝트 생성 - token 생성
-
(선택) IntelliJ gradle 에서 sonarqube를 실행하고 싶다면 좌측 상단에 표시된 sonarqube 플러그인 추가 및 실행
-
비밀번호 변경
-
My Account - Security

-
-
Jenkins 관리 - 플러그인 관리
-
SonarQube Scanner설치
-
Jenkins 관리 - Global Tool Configuration - SonarQube Scanner
-
-
Jenkins에
Sonarqube servers추가-
Jenkins 관리 - 시스템 설정 - Sonarqube servers 에서 아래와 같이 입력 후
Add버튼 클릭
-
아래와 같이 내용 입력 (
Secret에는 8번에서 생성한 token 값 입력)
-
생성된 토큰 추가
-
-
GitHub Pull Request Builder설치
-
Jenkins 관리 - 시스템 설정 - GitHub Pull Request Builder
-
위의
ADD버튼 클릭 후Secret에 자신의Github personal token입력 (Github personal token 생성 방법settings -> Developer Settings -> Personal Access tokens -> Generate new token)
-
Connect to API클릭하여 연결 확인
-
-
-
프로젝트 생성
-
Github project탭에 project url 추가
-
소스 코드 관리탭에Git설정-
.git으로 끝나는 project url 추가 -
Add버튼 눌러Github username(아이디 X, 자신의 github 프로필 밑에 작게 볼드체 되어있는 글자),password추가
-
Refspec, 브랜치 설정
- Name 항목에
origin추가 - Refspec 항목에
+refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/* 추가 : PR 요청에 대해서만 빌드를 하겠다는 의미 -
+refs/heads/*:refs/remotes/origin/* +refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*추가 : PR, 브랜치 모두 빌드
-
-
Branch Specifier에
${sha1}추가 : PR하는 브랜치 모두를 의미
-
빌드 유발탭에GitHub Pull Request Builder체크-
Admin list추가 -
Use github hooks for build triggering체크 (자신의 Github repo에 대한 webhook이 자동 생성된다- Jenkins 포트가 8080이라서 webhook url 포트가 8080으로 설정이 되는데, 현재 설치 과정에서는 nginx 80번 포트를 통해 Jenkins를 접속하기 때문에 꼭 80으로 변경해줘야 한다.
-
-
Build탭에서Excute shell추가
-
Build탭에서Execute SonarQube Scanner추가- Analysis properties의 아래에 내용 추가 (Analysys parameters 참고)
sonar.host.url = SonarQube url sonar.login = SonarQube에서 생성한 project token sonar.projectKey = SonarQube에서 생성한 project key sonar.projectName = SonarQube에서 생성한 project name sonar.projectVersion = SonarQube에서 분석한 소스의 버전 sonar.language = 작성한 코드 언어 sonar.sources = 분석할 소스 파일의 경로 sonar.tests = 분석할 테스트 파일의 경로 sonar.java.binaries = 바이너리 파일을 분석 경로 sonar.sourceEncoding = 소스 인코딩
-
Build Now버튼 클릭하여 빌드 수행
-
console output클릭하여 빌드 결과 보기
-
위의 네모칸 클릭 후
Sonarqube결과 페이지로 이동하여 결과 확인
-
- PR 요청 결과
-
Github repo
-
Jenkins
-
One point stop for Installing SonarQube server in an AWS EC2 instance
A Complete Guide to Install SonarQube Server in Amazon Linux
SonarQube on AWS EC2 - Installation and integration with Jenkins
코드 분석 도구 적용기 - 3편, SonarQube 적용하기
GitHub Pull Request Builder Plugin
빌드/테스트는 내가 해줄게. 너는 코딩에 집중해 (by GitHub Pull Request Builder)