DevSecOps

sonarqube 설치

주술쟁이 2024. 4. 3. 14:24

ubuntu 22.04에 sonarqube 9.9 LTS 버전 설치

1. DB 설치

 - DB는 PostgreSQL 또는 MS-SQL을 사용할 수 있다.

 - 같은 머신에 설치 가능하며 필요시 별도의 DB에 설치할 수도 있다.

 - 관리를 위해 우선은 동일 머신에 MS-SQL 2022 설치를 전재로 설명한다.

 - 환경에 따른 차이점은 별도로 검색에 보정

> curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
> sudo apt install mssql-server
> curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | sudo tee /etc/apt/sources.list.d/mssql-server-2022.list
> curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
> sudo apt install mssql-server
> sudo /opt/mssql/bin/mssql-conf setup
> systemctl status mssql-server --no-pager

 

2. DB 생성 후 sonar용 데이터베이스 생성 및 계정 생성

 - 데이터베이스 생성시 반드시 COLLATE SQL_Latin1_General_CP1_CS_AS 으로 지정해야 한다.

CREATE DATABASE [sonar]
 CONTAINMENT = NONE
 ON PRIMARY
 ( NAME = N'sonar', FILENAME = N'/var/opt/mssql/data/sonar.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON
 ( NAME = N'sonar_log', FILENAME = N'/var/opt/mssql/data/sonar_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 COLLATE SQL_Latin1_General_CP1_CS_AS WITH LEDGER = OFF
GO
ALTER DATABASE [sonar] SET COMPATIBILITY_LEVEL = 160
GO
ALTER DATABASE [sonar] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [sonar] SET ANSI_NULLS OFF
GO
ALTER DATABASE [sonar] SET ANSI_PADDING OFF
GO
ALTER DATABASE [sonar] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [sonar] SET ARITHABORT OFF
GO
ALTER DATABASE [sonar] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [sonar] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [sonar] SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
GO
ALTER DATABASE [sonar] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [sonar] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [sonar] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [sonar] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [sonar] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [sonar] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [sonar] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [sonar] SET DISABLE_BROKER
GO
ALTER DATABASE [sonar] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [sonar] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [sonar] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [sonar] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [sonar] SET READ_WRITE
GO
ALTER DATABASE [sonar] SET RECOVERY FULL
GO
ALTER DATABASE [sonar] SET MULTI_USER
GO
ALTER DATABASE [sonar] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [sonar] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [sonar] SET DELAYED_DURABILITY = DISABLED
GO
USE [sonar]
GO
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = Off;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = Primary;
GO
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = On;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = Primary;
GO
ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = Off;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = Primary;
GO
USE [sonar]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [sonar] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

 

- 사용자 생성시 sonar 데이터베이스의 owner 권한을 추가한다. 또한 DB 성능을 위해 롤백시 읽기 잠금을 해제합니다.

USE [master]
GO
CREATE LOGIN [sonar] WITH PASSWORD=N'비밀번호', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [sonar]
GO
CREATE USER [sonar] FOR LOGIN [sonar]
GO
USE [sonar]
GO
ALTER ROLE [db_owner] ADD MEMBER [sonar]
GO
USE [master]
GO
ALTER DATABASE sonar SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
GO

 

3. JAVA 설치

 - sonarqube 9.9LTS 버전은 JAVA 17이 필요하다.

sudo apt install openjdk-17-jdk

 

4. 설치 전 계정 생성 및 OS 매개변수 설정.

 - sonarqube는 Elasticsearch 를 같이 사용하기 때문에 root 사용자를 사용할 수 없다. 별도의 계정을 생성합니다.

sudo useradd -b /opt/sonarqube -s /bin/bash sonarqube

 

5. sonarqube는 최소 131072개의 파일을 열 수 있어야 하고, 8192개의 스레드를 열기 때문에 커널 매개 변수 변경이 필요하다.

# 오픈 파일 갯수를 131072로 변경 셋팅하기
sudo vi /etc/sysctl.conf
# sysctl.conf에 내용을 추가한다.
vm.max_map_count=524288
fs.file-max=131072
# 변경한 오픈 파일 갯수를 적용
sudo sysctl --system

# 쓰레드 갯수 변경 셋팅하기
sudo vi /etc/security/limits.conf
# limits.conf에 내용을 추가한다. 
sonarqube - nofile 131072
sonarqube - nproc 8192

 

6. sonarqube 다운로드 및 설치

 - LTS 버전을 다운받고 설치하기 위해 unzip등을 설치해 준다.

sudo apt install unzip software-properties-common wget

- 파일을 다운로드하고 압축을 풀어 설치한 폴더를 생성한다.

wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-10.6.0.92116.zip
unzip sonarqube-*.zip
rm -f sonarqube-*.zip
sudo mv sonarqube-* /opt/sonarqube

 

7. 권한 변경

- sonarqube는 Elasticsearch 를 내부에서 같이 실행하기 때문에 위에서 생성한 권한으로 sonarqube 계정으로 권한 부여한다.

sudo chown -R sonarqube:sonarqube /opt/sonarqube

 

8. sonarqube 설정 변경

- 위에 설치한 DB와 연결하기 위한 설정 정보를 입력한다. 우리는 SQL 인증을 사용하기 때문에 아래와 같이 등록한다.

- 암호화를 하지만, 인증서 검증을 하지 않게 하기 위해서는 jdbc URL에  trustServerCertificate=true 옵션을 추가해 주어야 한다.

- 만약 MS-SQL이 암호화를 지원하지 않는다면 encrypt=false 문자열도 추가해 주어야 한다.

- Elasticsearch의 메모리를 설정한다.

sudo vi /opt/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=비밀번호
sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar;trustServerCertificate=true;
#JVM options of Elasticsearch process
sonar.search.javaOpts=-Xmx512m -Xms512m -XX:MaxDirectMemorySize=256m -XX:+HeapDumpOnOutOfMemoryError

9. systemd를 사용하여 Linux에서 SonarQube를 서비스로 실행

- 위에서 생성한 sonarqube 계정을 이용하여 service로 실생할 수 있도록 생성한다.

sudo vi /etc/systemd/system/sonarqube.service

 

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking
User=sonarqube
Group=sonarqube
#PermissionsStartOnly=true
#ExecStart=/bin/nohup /opt/java/bin/java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -jar /opt/sonarqube/lib/sonar-application-8.5.jar
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
#StandardOutput=journal
LimitNOFILE=131072
LimitNPROC=8192
#TimeoutStartSec=5
#Restart=always
#SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

 

- 파일이 정상적으로 생성이 되었다면 활성화를 시킨다.

sudo systemctl enable sonarqube.service
sudo systemctl start sonarqube.service

 

10. sonarqube의 실행

sudo service sonarqube start
sudo service sonarqube stop

 

11. sonarqube는 기본 9000 포트를 사용하기 때문에 nginx를 사용하여 443 포트 도메인으로 교체 사용하는 것이 편하다.