2022. 9. 15. 08:24ใSystem ์์ ์ค/DevOps
์ด ๋ด์ฉ์ ์ธํ๋ฐ - Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ ์
๋๋ค.
ํด๋น ๋ด์ฉ์ Code ๋ด์ฉ์ ์ด ๊ณณ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ๋ชฉ์ฐจ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์๋ํ ๋๊ตฌ์ ์ฌ์ฉ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Infrastructure as Code ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Ansible + Kubernetes ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โ - Pipeline
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โก - SonarQube
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โข - Multi Nodes
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์์ฉ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ๋ถ๋ก
๐ SonarQube
๐ฝ SonarQube
๐ฆ ๊ฐ์
1. Continuous Integration + Analysis (์ง์์ ์ธ ํตํฉ๊ณผ ๋ถ์ Tool)
โ Code Quality Assurance tool : Issue + Defect + Code Complexity
โ Detect Bugs & Vulnerabilities
โ Track Code Smells
โ Code Quality Metrics & History
2. 17๊ฐ Programming Language ์ง์
โ JAVA, C#, JavaScript, TypeScript, CloudFormation, Terraform, Kotlin, Ruby, Go, Scala, Flex, Python,
PHP, HTML, CSS, XML, VB.NET ๋ฑ
3. CI / CD Integration
4. Extensible, with 50 + community plugins
๐ฆ ์ค์นํ๊ธฐ
์ฃผ๋ํ๋์ Synology NAS์ Docker๋ฅผ ์ด์ฉํ์ฌ SonarQube๋ฅผ Containerํ ํ์ฌ ์ฌ์ฉํด ๋ณผ๊ฒ์.
Intel Chip์ ์ด์ฉํ๋ PC ํน์ Server์์๋ ์์ ๊ฐ์ด Image๋ฅผ ๋ฐ์ ์ ์์ด์.
๋ง์ฝ Applie M1 Chip์ ์ด์ฉํ์๋ ๋ถ๋ค์ ์๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด ์ฃผ์ธ์.
sudo docker pull edowon0623/sonarqube:arm
์์ ๊ฐ์ด sonarqube Image๋ฅผ ํ์ธํ ์ ์์ด์ผ ํด์.
๊ธฐ์กด์ ๋ง๋ค์ด์ ธ ์์์ง ๋ชจ๋ฅผ Container๋ฅผ ์ง์ฐ๊ธฐ ์ํด --rm Option๊ณผ ํจ๊ป
Container ๊ธฐ๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
์น ๋ธ๋ผ์ฐ์ ์์ ์์ ๊ฐ์ด ์ ์์ ์ผ๋ก ๋ถ์ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ฐธ๊ณ ๋ก ๊ธฐ๋๋๋๋ฐ ๊ฝค ์ค๋ ๊ฑธ๋ ธ์ด์.
์์ ๊ฐ์ด Login์ฐฝ์ด ๋์ค๋ฉด ์ด๊ธฐ ๊ณ์ ์ ๋ณด๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
์ด๋ฒ์๋ SonarQube Token์ ์ด์ฉํด์ Git hub๊ณผ ์ฐ๊ฒฐ์ ํด ์ค๊ฒ์.
๋จผ์ ์ฐ์ธก ์๋จ์ A๋ผ๊ณ ํ์๋ ์ด๋ก์ ๋ค๋ชจ Icon์ ํด๋ฆญํด ์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ , My Account๋ฅผ ๋๋ฌ์ค๋๋ค.
Security Tab์ ๋๋ฌ ์ ์ํฉ๋๋ค.
์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ง์ด์ฃผ๊ณ , Type์ User Token์ ์ ํํ ๋ค Expires in (๋ง๋ฃ์ผ)์ ํฌ๋งํ์๋๋๋ก ์ ํด์ฃผ์ธ์.
์ฃผ๋ํ๋์ 30์ผ๋ก ํ๋ ค๊ณ ํด์.
๊ทธ๋ฐ ๋ค Generate Button์ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด Token์ด ์์ฑ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฝ SonarQube์ Maven
๐ฆ Maven Project๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ง๊ณ ๋๊ธฐ
์ต์ด Maven Project Pom.xml์ ์์ ๊ฐ์ด plugin์ ์ถ๊ฐํด ์ฃผ์์ด์.
ํด๋น ๋ด์ฉ์ ์๋ URL์ ๋ค์ด๊ฐ์๊ฒ ๋๋ฉด ์กด์ฌํฉ๋๋ค.
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven
์ Site์์ ํ์๋ ๊ณณ๋ง ๊ธ์ด์ ์ฃผ๋ํ๋์ฒ๋ผ ์์กด์ฑ์ ์ถ๊ฐํด ์ฃผ์๋ฉด ๋์.
์ต์ ๋ฒ์ ์ ์ถ๊ฐ ํ๊ณ ์ถ๋ค๋ฉด ์๋ URL์ ์ ์ํ์๋ฉด ๋ฐ์ ์ ์์ด์.
https://mvnrepository.com/artifact/org.sonarsource.scanner.maven/sonar-maven-plugin
Maven Project Directory์์ ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ค๊ฒ์.
Sonarqube Site์ ๋์์์ ์๋จ ์ข์ธก์ Projects๋ฅผ ๋๋ฌ์ฃผ๋ฉด ์์ ๊ฐ์ ํ๋ฉด์ ๋ง๋ ์ ์์ด์.
๐ฝ SonarQube ๊ฐ์ง๊ณ ๋๊ธฐ
๐ฆ Bad Code ์กฐ์ฌ
์ต์ด ๊ธฐ์กด์ ์์๋ Code์์ logger ๋ถ๋ถ์ ์ฃผ์์ฒ๋ฆฌํ๊ณ , Println์ ํตํด ์์์ ๋ฌธ์๋ฅผ ์ถ๋ ฅ๋๊ฒ ๋ง๋ค์์ด์.
Web ๊ฐ๋ฐ์ ํ ๋, Println์ ์ฑ๋ฅ Issue๋ฅผ ๋ถ๋ฌ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ๊ฐ๋ฐ์ ํ๊ฒ ๋๋ฉด Sonarqube๋ ๋ญ๋ผ๊ณ ํ ๊น์?
์ต์ด ์์ ๊ฐ์ด Maven Build์ ์งํํ ๊ฒ์.
-DskipTests=true Option์ Unit Test๋ฅผ ์งํํ์ง ์๊ฒ ๋ค๋ ์๋ฏธ์์.
์์ ๊ฐ์ด Maven์ ์ด์ฉํ์ฌ Sonar Build๋ฅผ ์งํํด ์ฃผ์์ด์.
Issue Tab์ ๋ณด๋ฉด ๊ฝค ๋ง์ ๊ฒฝ๊ณ ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ฃผ๋ํ๋์ ๊ทธ ์ค์ Remove this unused "logger"private field์ ์ฃผ๋ชฉํ์ด์.
๋ด์ฉ์ ๋ณด๋ "logger๋ผ๋ Member ๋ณ์ ์ ์ธํด๋๊ณ , ์ ์ ์จ์? ๊ทธ๋ด๊ฑฐ๋ฉด ์ง์ฐ์ธ์!" ๋ผ๊ณ ํ๊ณ ์๊ณ ,
์ฃผ์ ์ฒ๋ฆฌํ ๋ถ๋ถ์๋ "์ด๊ฑฐ ์ฃผ์ ์ฒ๋ฆฌ ํ ๊ฑฐ๋ฉด ์ง์ฐ์ธ์!" ๋ผ๊ณ ํ๊ณ ์๊ณ ,
Println์ด๋ผ๋ ๋ถ๋ถ์๋ "System.out ๋์ ์ logger๋ฅผ ์ฌ์ฉํ์ธ์!" ๋ผ๊ณ ์๋ ค์ฃผ๊ณ ์์ด์.
Code๋ฅผ ์์ ๊ฐ์ด ์์ ํด ์ฃผ์์ด์.
๋ค์ Build ์ด๊ธฐํ๋ฅผ ํ ๋ค Build๋ฅผ ํด์ฃผ์์ด์.
์์ ๊ฐ์ด ๊ฒฝ๊ณ ๋ฌธ์ด ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฝ Jenkins์ SonarQube ์ด์ผ๊ธฐ
๐ฆ ์ฐ๋
์ต์ด Jenkins์์ SonarQube Plugin์ ์ค์นํด์ฃผ์ด์ผ ํด์.
์์ ๊ฐ์ด SonaQube Scanner Plugin์ ์ค์นํ๋๋ก ํ ๊ฒ์.
์ด๋ฒ์๋ Jenkins ๊ด๋ฆฌ์์ Manage Credentials๋ฅผ ๋ค์ด๊ฐ ์ค์ ์ ํด์ค๊ฑฐ์์.
์์ ๊ฐ์ด ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ค์ด ์๋๋ฐ, Domains์ (golobal) ์๋ฌด๊ฑฐ๋ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ฐ ๋ค Add Credentials๋ฅผ ๋๋ฌ์ฃผ์ธ์.
Kind์ Secret text๋ฅผ ์ ํํด ์ฃผ์ธ์.
Secret ๋ถ๋ถ์ SonarQube์์ ๋ฐ๊ธํ Token ๊ฐ์ ์
๋ ฅํด ์ฃผ๋ฉด ๋์.
๊ทธ๋ฆฌ๊ณ , ID๋ ์ํ์๋ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , Create Button์ ๋๋ฌ์ฃผ์ธ์.
์ด๋ฒ์ Jenkins ๊ด๋ฆฌ์์ ์์คํ
์ค์ ์ผ๋ก ๋ค์ด๊ฐ ์ค๊ฒ์.
SonarQube server๋ผ๋ ํญ๋ชฉ์์ ์ค์ ์ ์ด์ด๊ฐ๋ณผ๊ฒ์.
Environment variables๋ฅผ ํ์ฑํํด์ฃผ๊ณ , Add SonarQube๋ฅผ ๋๋ฌ์ฃผ์ธ์.
์์ ๊ฐ์ด SonarQube Server ์ ๋ณด๋ฅผ ์
๋ ฅํด ์ฃผ์๋ฉด ๋์.
Name์ ์์ ๋กญ๊ฒ ์ ์ผ๋ฉด ๋๊ณ , Server URL์ SonarQube๋ฅผ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด
์ ์ํ ๋ ์ฌ์ฉํ๋ URL์ ์ ์ด์ฃผ๋ฉด ๋์.
Server authentication token์๋ ์์์ ๋ง๋ค์๋ Credential ID๋ฅผ ์ฐพ์ ์ ํํด ์ฃผ๋ฉด ๋์.
์ ์ฅ์ ๋๋ฅด๊ณ ํด๋น ์ฐฝ์ ๋น ์ ธ๋์ ์ค๊ฒ์.
๐ฆ Pipeline ์ฌ์ฉํ๊ธฐ
์ฃผ๋ํ๋์ ์ด ์ ์ ๋ง๋ค์๋ Pipeline Project์ ์ถ๊ฐ ์์
์ ํด ๋ณด๋ ค๊ณ ํด์.
ํด๋น Project๊ฐ ๊ถ๊ธํ์๋ค๋ฉด ์ด ๊ณณ์ ์ ์ฑ์ค๋ฝ๊ฒ ์ค๋นํด ๋์์ผ๋ ๋ง์ด ์ฌ๋ํด ์ฃผ์ธ์.
pipeline {
agent any
tools {
maven 'Maven3.8.5'
}
stages {
stage('Git Clone') {
steps {
git 'https://github.com/junyharang-coding-study/JunyHarang-Maven-Test-Project'
}
}
stage('Maven Build') {
steps {
sh '''
echo build start
mvn clean compile package -Dskiptests=true
'''
}
}
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube-Test') {
sh 'mvn sonar:sonar'
}
}
}
stage('deploy') {
steps {
deploy adapters: [tomcat9(credentialsId: 'deployer_user', path: '', url: 'http://172.17.0.6:8088')], contextPath: null, war: '**/*.war'
}
}
stage('ssh publisher') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'docker-container', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker build --tag junyharang/devops_study1 -f Dockerfile .', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '.', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
ํด๋น Project ๊ตฌ์ฑ์์ Pipeline์ ์์ ๊ฐ์ด Script ๋ฌธ์ ์ถ๊ฐํด ์ฃผ์์ด์.
withSOnarQUbeEnv์๋ ์ด ์ ์ SonarQube๋ฅผ Jenkins ์์คํ
๊ตฌ์ฑ์์ ๋ฑ๋กํ ๋,
Name ๋ถ๋ถ์ ๋ฑ๋กํ๋ ์ด๋ฆ์ ์ ์ด์ฃผ๋ฉด ๋์.
๊ทธ๋ฐ ๋ค Maven ๋ช
๋ น์ด๋ฅผ ํตํด Sonar Build๋ฅผ ํ๋ฏ์ด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ๋ฉด ๋๋๋ฐ,
์ ์ ์ ๋ณด๋ Token ๊ฐ์ Jenkins์ ๋ฑ๋ก์ ํด ์ฃผ์๊ณ ,
๊ทธ ๊ฐ์ withSOnarQUbeEnv์์ ๋ฑ๋กํ ์ด๋ฆ์ ์ฐพ์ ํด๋น ๋ด์ฉ์ ๊ฐ์ง๊ณ ์ค๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ์ด์ค ํ์๋ ์์ด์.
์ ์ฅํ๊ณ , ํด๋น ์ฐฝ์ ๋์จ ๋ค Build๋ฅผ ํด ๋ณผ๊ฒ์.
Build ์์
์ด ์ ์์ ์ผ๋ก ๋๋ฌ์ด์!
SonarQube Project Tab์์ Last analysis๊ฐ 2๋ถ ์ ์ธ๊ฑธ ํ์ธํ ์ ์์ด์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."