[DevOps] Jenkins๋ฅผ ์ด์šฉํ•œ CI/CD Pipeline ๊ตฌ์ถ• - Advenced Jenkins ์‚ฌ์šฉ โ‘ก - SonarQube

2022. 9. 15. 08:24ใ†System ์ž‘์—…์‹ค/DevOps

728x90
๋ฐ˜์‘ํ˜•

 

 

์ด ๋‚ด์šฉ์€ ์ธํ”„๋Ÿฐ - Jenkins๋ฅผ ์ด์šฉํ•œ CI/CD Pipeline ๊ตฌ์ถ• ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.


ํ•ด๋‹น ๋‚ด์šฉ์˜ Code ๋‚ด์šฉ์€ ์ด ๊ณณ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



 

 

 

์ดˆ๋ณด๋ฅผ ์œ„ํ•œ ์  ํ‚จ์Šค 2 ํ™œ์šฉ ๊ฐ€์ด๋“œ 2/e / ์—์ด์ฝ˜์ถœํŒ์‚ฌ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 




๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [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ํ™” ํ•˜์—ฌ ์‚ฌ์šฉํ•ด ๋ณผ๊ฒŒ์š”.

 

sudo docker pull sonarqube


Intel Chip์„ ์ด์šฉํ•˜๋Š” PC ํ˜น์€ Server์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด Image๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.

๋งŒ์•ฝ Applie M1 Chip์„ ์ด์šฉํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์ฃผ์„ธ์š”.

sudo docker pull edowon0623/sonarqube:arm

 

sudo docker images


์œ„์™€ ๊ฐ™์ด sonarqube Image๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด์š”.


sudo docker run --rm -p 9000:9000 --name {Container ์ด๋ฆ„ ์ง€์ •} {Image ์ด๋ฆ„}

728x90


๊ธฐ์กด์— ๋งŒ๋“ค์–ด์ ธ ์žˆ์„์ง€ ๋ชจ๋ฅผ Container๋ฅผ ์ง€์šฐ๊ธฐ ์œ„ํ•ด --rm Option๊ณผ ํ•จ๊ป˜
Container ๊ธฐ๋™ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์—ˆ์–ด์š”.





์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„์™€ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ๋ถ™์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ฐธ๊ณ ๋กœ ๊ธฐ๋™๋˜๋Š”๋ฐ ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ์–ด์š”.


admin // admin


์œ„์™€ ๊ฐ™์ด Login์ฐฝ์ด ๋‚˜์˜ค๋ฉด ์ดˆ๊ธฐ ๊ณ„์ • ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.




์ด๋ฒˆ์—๋Š” SonarQube Token์„ ์ด์šฉํ•ด์„œ Git hub๊ณผ ์—ฐ๊ฒฐ์„ ํ•ด ์ค„๊ฒŒ์š”.

๋จผ์ € ์šฐ์ธก ์ƒ๋‹จ์— A๋ผ๊ณ  ํ‘œ์‹œ๋œ ์ดˆ๋ก์ƒ‰ ๋„ค๋ชจ Icon์„ ํด๋ฆญํ•ด ์ฃผ์„ธ์š”.


๊ทธ๋ฆฌ๊ณ , My Account๋ฅผ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.



Security Tab์„ ๋ˆŒ๋Ÿฌ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.



์ด๋ฆ„์€ ์ž์œ ๋กญ๊ฒŒ ์ง€์–ด์ฃผ๊ณ , Type์€ User Token์„ ์„ ํƒํ•œ ๋’ค Expires in (๋งŒ๋ฃŒ์ผ)์„ ํฌ๋งํ•˜์‹œ๋Š”๋Œ€๋กœ ์ •ํ•ด์ฃผ์„ธ์š”.

์ฃผ๋‹ˆํ•˜๋ž‘์€ 30์ผ๋กœ ํ•˜๋ ค๊ณ  ํ•ด์š”.

๊ทธ๋Ÿฐ ๋’ค Generate Button์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.


Token Value :squ_31daff1a938ccf0b80cf08720fc8a87882353b57


๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด Token์ด ์ƒ์„ฑ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


 

 

    ๐Ÿ”ฝ SonarQube์™€ Maven

        ๐Ÿ“ฆ Maven Project๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ

pom.xml

์ตœ์ดˆ Maven Project Pom.xml์— ์œ„์™€ ๊ฐ™์ด plugin์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์–ด์š”.

ํ•ด๋‹น ๋‚ด์šฉ์€ ์•„๋ž˜ URL์— ๋“ค์–ด๊ฐ€์‹œ๊ฒŒ ๋˜๋ฉด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven

๋ฐ˜์‘ํ˜•


์œ„ Site์—์„œ ํ‘œ์‹œ๋œ ๊ณณ๋งŒ ๊ธ์–ด์„œ ์ฃผ๋‹ˆํ•˜๋ž‘์ฒ˜๋Ÿผ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๋ฉด ๋˜์š”.


์ตœ์‹  ๋ฒ„์ „์„ ์ถ”๊ฐ€ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ URL์— ์ ‘์†ํ•˜์‹œ๋ฉด ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.

https://mvnrepository.com/artifact/org.sonarsource.scanner.maven/sonar-maven-plugin

 

mvn sonar:sonar -Dsonar:host.utl=http://192.168.0.2:9000 -Dsonar.login={Sonar Token Value}


Maven Project Directory์—์„œ ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ค„๊ฒŒ์š”.


mvn sonar:sonar -Dsonar.host.utl=http://192.168.0.2:9000 -Dsonar.login={Sonar Token Value}




Sonarqube Site์— ๋Œ์•„์™€์„œ ์ƒ๋‹จ ์ขŒ์ธก์— Projects๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ์–ด์š”.

 

 

 

    ๐Ÿ”ฝ SonarQube ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ

        ๐Ÿ“ฆ Bad Code ์กฐ์‚ฌ


์ตœ์ดˆ ๊ธฐ์กด์— ์žˆ์—ˆ๋˜ Code์—์„œ logger ๋ถ€๋ถ„์„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ , Println์„ ํ†ตํ•ด ์ž„์˜์˜ ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅ๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ์–ด์š”.
Web ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ, Println์€ ์„ฑ๋Šฅ Issue๋ฅผ ๋ถˆ๋Ÿฌ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด Sonarqube๋Š” ๋ญ๋ผ๊ณ  ํ• ๊นŒ์š”?




mvn clean compile package -DskipTests=ture


์ตœ์ดˆ ์œ„์™€ ๊ฐ™์ด Maven Build์„ ์ง„ํ–‰ํ• ๊ฒŒ์š”.

-DskipTests=true Option์€ Unit Test๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์—์š”.


mvn sonar:sonar -Dsonar.host.utl=http://192.168.0.2:9000 -Dsonar.login={Sonar Token Value}


์œ„์™€ ๊ฐ™์ด 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์„ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•ด์š”.

Jenkins ๊ด€๋ฆฌ -> Plugin Manager -> ์„ค์น˜๊ฐ€๋Šฅ






์œ„์™€ ๊ฐ™์ด 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๋ถ„ ์ „์ธ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.





 

 

 

 

 

 

์ดˆ๋ณด๋ฅผ ์œ„ํ•œ ์  ํ‚จ์Šค 2 ํ™œ์šฉ ๊ฐ€์ด๋“œ 2/e / ์—์ด์ฝ˜์ถœํŒ์‚ฌ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

728x90
๋ฐ˜์‘ํ˜•