AWS의 Code pipline 에서 SonarQube 사용하기
SonarQube는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼입니다. 또한 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공합니다. wiki
설치 준비
설치하는 방식은 쉽게 Docker Image를 이용하는 방식과 Ec2에 설치하는 방식이 있습니다. 이번 글에서는 간단하게 Ec2에 설치하는 방식으로 진행합니다.
필요 소프트웨어
- JDK 11 또는 JRE 11 이상
- DBMS(Options)
- PostgreSQL 11 이상
- Oracle 12C 이상
- Web browser(Client)
- Microsoft Edge
- Mozilla Firefox
- Google Chrome
- Safari
Hardware 권장 사양
- 1 core 이상의 CPU
- 최소 3G 이상의 메모리
설치 하기
AWS Ec2가 준비 되어 있다는 전제 하에, DBMS를 제외하고 설치를 진행합니다.
1. 업데이트 & 필요 패키지 설치
$ sudo yum update -y
$ sudo yum install wget unzip -y
# file & memory update current session
$ sudo sysctl -w vm.max_map_count=524288
$ sudo sysctl -w fs.file-max=131072
$ sudo ulimit -n 131072
$ sudo ulimit -u 8192
/etc/security/limits.conf
파일을 아래와 같이 수정해 두면 서버가 재부팅이 되어서 반영 됩니다.
"account-name" - nofile 131072
"account-name" - nproc 8192
2. JDK 11 설치
open jdk 11을 설치 합니다.
$ sudo amazon-linux-extras install java-openjdk11
$ sudo yum install java-11-openjdk-devel -y
또는 실행파일을 받아서 설치 할 수 있습니다.
$ curl -O https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
$ tar zxvf openjdk-11.0.1_linux-x64_bin.tar.gz
$ sudo chmod -R 755 /usr/local/jdk-11.0.1
# 이 부분은 .bashrc 에 추가 해도 됩니다.
$ export JAVA_HOME=/usr/local/jdk-11.0.1
$ export PATH=$JAVA_HOME/bin:$PATH
3. SonarQube 설치
# 작업 디렉터리로 이동
$ cd /applications
# 9.8 버젼으로 설치 진행
$ wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.8.0.63668.zip
$ unzip sonarqube-9.8.0.63668.zip
4. SonarQube 실행
# OS 에 알맞은 실행 위치로 이동
$ cd /applications/sonarqube-9.8.0.63668/bin/linux-x86-64
# 명령어 확인
$ ./sonar.sh
/usr/local/jdk-11.0.1/bin/java
Usage: ./sonar.sh { console | start | stop | force-stop | restart | status | dump }
# 실행
$ ./sonar.sh start
5. 9000 포트 열기
기본 포트는 9000
으로 해당 포트를 열고 web browser
로 접근하면 됩니다.
SonarQube 연동 하기
1. 로그인
로그인 초기 ID / PW는 admin
/admin
입니다.
로그인을 하면 초기 비밀번호를 변경하라고 가이드 합니다.
2. 프로젝트 생성
Manually
추가 선택
내용 입력 후 저장 하면, 프로젝트 생성이 완료 됩니다.
3. 프로젝트 설정
Locally
를 선택하고
토큰 생성 합니다.
분석하려는 언어 와 환경을 선택합니다.
아래와 같은 sonar-scanner를 이용한 분석 처리 준비가 완료 되었습니다.
$ sonar-scanner \
-Dsonar.projectKey=doc4sm \ # project 이름
-Dsonar.sources=. \ # 분석 소스 위치
-Dsonar.host.url=http://lahuman.github.io:9000 \ # host 주소
-Dsonar.login=sqp_fasdfee85ujliuod4d38fa02b2d65f964726aca5 # 생성한 토큰 정보
sonarscanner 는 여서 받을 수 있습니다.
4. 프로젝트 분석 결과
sonarscanner 를 이용해서 분석을 진행하면, 아래와 같은 결과를 확인 할 수 있습니다.
AWS CodePipeline 과 연동하기
AWS CodePipeline 이 이미 존재하고, 여기에 Code-review를 추가하는 방식으로 연동 합니다.
1. CodeCommit => Pipeline => 상세 이동 후 Edit add Stage 버튼을 클릭
2. Add Action 버튼 클릭 후 알맞은 값 설정
3. Create Build Project 버튼 클릭 후 build project 설정
import build commands
는 아래와 같습니다.
version: 0.2
env:
shell: bash
phases:
pre_build:
commands:
- mkdir /downloads/sonarqube -p
- cd /downloads/sonarqube
- wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip
- unzip sonar-scanner-cli-4.7.0.2747-linux.zip
- mv sonar-scanner-4.7.0.2747-linux /opt/sonar-scanner
- echo -e "sonar.host.url=http://lahuman.github.io:9000/ \n sonar.sourceEncoding=UTF-8 \n sonar.qualitygate.wait=true " >> /opt/sonar-scanner/conf/sonar-scanner.properties
- echo -e "#/bin/bash \n export PATH='$PATH:/opt/sonar-scanner/bin'" >> /etc/profile.d/sonar-scanner.sh
- source /etc/profile.d/sonar-scanner.sh
- sonar-scanner -v
build:
commands:
- cd ../..
- cd /codebuild/output/src*/src
- sonar-scanner -Dsonar.projectKey=Example -Dsonar.sources=. -Dsonar.host.url=http://lahuman.github.io:9000 -Dsonar.login=sqp_017f2d65fa3rr34wesfd22369d98155fd4d493
4. 설정 완료 & 저장
모든 설정이 완료 되었다면, 저장 버튼을 클릭합니다.
5. pipeline 실행
추가 TIP
코드 변경 후 다시 sonar-scanner
을 진행하면, Coverage
, Duplications
에서 실패가 발생합니다
기본적으로 해당 문제를 해결해서 처리하는게 좋지만, 임시로 처리 하기 위해서는 아래와 같이 sonar-scanner
에 예외 옵션을 주어야 합니다.
$ sonar-scanner \
-Dsonar.projectKey=doc4sm \ # project 이름
-Dsonar.cpd.exclusions=**/* \ # Duplications 제외 처리
-Dsonar.coverage.exclusions=**/* \ # Coverage 제외 처리
-Dsonar.sources=. \ # 분석 소스 위치
-Dsonar.host.url=http://lahuman.github.io:9000 \ # host 주소
-Dsonar.login=sqp_fasdfee85ujliuod4d38fa02b2d65f964726aca5 # 생성한 토큰 정보
전체 내용은 Installing SonarQube on AWS EC2 instance and Integrating it with AWS CodePipeline를 참조해서 작성했습니다.