<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Integration on</title><link>https://taetaetae.github.io/tags/integration/</link><description>Recent content in Integration on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 08 Feb 2018 20:10:54 +0000</lastBuildDate><atom:link href="https://taetaetae.github.io/tags/integration/index.xml" rel="self" type="application/rss+xml"/><item><title>소나큐브 이용 코드 정적분석 자동화</title><link>https://taetaetae.github.io/2018/02/08/jenkins-sonar-github-integration/</link><pubDate>Thu, 08 Feb 2018 20:10:54 +0000</pubDate><guid>https://taetaetae.github.io/2018/02/08/jenkins-sonar-github-integration/</guid><description>&lt;p>&lt;code>코드 정적분석&lt;/code>이라 함은 실제 프로그램을 실행하지 않고 코드만의 형태에 대한 분석을 말한다. 이를테면 냄새나는 코드(?)라던지, 위험성이 있는 코드, 미리 정의된 규칙이나 코딩 표준을 준수하는지에 대한 분석을 말하는데 java 기준으로는 아래 다양한 (잘 알려진) 정적분석 도구들이 있다.&lt;!-- more -->&lt;/p>
&lt;ul>
&lt;li>PMD
&lt;ul>
&lt;li>미사용 변수, 비어있는 코드 블락, 불필요한 오브젝트 생성과 같은 Defect을 유발할 수 있는 코드를 검사&lt;/li>
&lt;li>&lt;a href="https://pmd.github.io" target="_blank" rel="noopener noreffer ">https://pmd.github.io&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>FindBugs
&lt;ul>
&lt;li>정해진 규칙에 의해 잠재적인 에러 타입을 찾아줌&lt;/li>
&lt;li>&lt;a href="http://findbugs.sourceforge.net" target="_blank" rel="noopener noreffer ">http://findbugs.sourceforge.net&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>CheckStyle
&lt;ul>
&lt;li>정해진 코딩 룰을 잘 따르고 있는지에 대한 분석&lt;/li>
&lt;li>&lt;a href="http://checkstyle.sourceforge.net" target="_blank" rel="noopener noreffer ">http://checkstyle.sourceforge.net&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>이외에 &lt;code>SonarQube&lt;/code> 라는 툴이 있는데 개인적으로 위 알려진 다른 툴들의 종합판(?)이라고 생각이 들었고, 그중 가장 인상깊었던 기능이 github과 연동이 되고 적절한 구성을 하게 되면 코드를 수정하는과 동시에 자동으로 분석을 하고 리포팅까지 해준다는 부분이였다. ( &lt;del>더 좋은 방법이 있는지는 모르겠으나&lt;/del> 다른 도구들은 수동으로 돌려줘야 하고 리포팅 또한 Active하지 못한(?) 아쉬운 점이 있었다. )&lt;/p>
&lt;p>지금부터 Jenkins + github web-hook + SonarQube 를 구성하여 코드를 수정하고 PullRequest를 올리게 되면 수정한 파일에 대해 자동으로 정적분석이 이뤄지고, 그에대한 리포팅이 해당 PullRequest에 댓글로 달리도록 설정을 해보겠다. (코드리뷰를 봇(?)이 자동으로 해주는게 얼마나 편한 일인가&amp;hellip;)&lt;/p>
&lt;h2 id="기본-컨셉">기본 컨셉&lt;/h2>
&lt;p>전체적인 컨셉은 다음 그림과 같다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/jenkins-sonar-github-integration/concept.png" title="/images/jenkins-sonar-github-integration/concept.png" data-thumbnail="/images/jenkins-sonar-github-integration/concept.png" data-sub-html="&lt;h2>전체 컨셉&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/jenkins-sonar-github-integration/concept.png"
 data-srcset="https://taetaetae.github.io/images/jenkins-sonar-github-integration/concept.png, https://taetaetae.github.io/images/jenkins-sonar-github-integration/concept.png 1.5x, https://taetaetae.github.io/images/jenkins-sonar-github-integration/concept.png 2x"
 data-sizes="auto"
 alt="/images/jenkins-sonar-github-integration/concept.png" />
 &lt;/a>&lt;figcaption class="image-caption">전체 컨셉&lt;/figcaption>
 &lt;/figure>
&lt;ol>
&lt;li>IDE에서 코드수정을 하고 remote 저장소에 commit &amp;amp; push를 한다.
그 다음 github에서 master(혹은 stable한 branch)에 대해 작업 branch를 PullRequest 올린다.&lt;/li>
&lt;li>미리 등록한 github의 web-hook에 의해 PullRequest 정보들을 jenkins에 전송한다.&lt;/li>
&lt;li>전달받은 정보를 재 가공하여 SonarQube로 정적분석을 요청한다.&lt;/li>
&lt;li>SonarQube에서 분석한 정보를 다시 jenkins로 return 해준다.&lt;/li>
&lt;li>SonarQube으로부터 return 받은 정보를 해당 PullRequest의 댓글에 리포팅을 해준다.&lt;/li>
&lt;/ol>
&lt;p>간단히 보면 (뭐 간단하니 쉽네~) 라고 볼수도 있겠지만 나는 이런 전체 흐름을 설정하는데 있어 어려웠다.&lt;/p>
&lt;blockquote>
&lt;p>사실 셋팅하는 과정에서 적지않은 삽질을 했었기에, 이 포스팅을 적는 이유일수도 있겠다.
더불어 검색을 해봐도 이렇게 전체흐름이 정리된 글이 잘 안보여서 + 내가 한 삽질을 다른 누군가도 할것같아서(?)&lt;/p>&lt;/blockquote>
&lt;h2 id="maven-설치">Maven 설치&lt;/h2>
&lt;p>기본적으로 Maven의 H2DB를 사용하므로 SonarQube를 설치하기전에 Maven부터 설치해줘야 한다.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ wget http://apache.mirror.cdnetworks.com/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
$ tar -zxvf apache-maven-3.5.2-bin.tar.gz
(환경변수 셋팅후 )
$ mvn -version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00)
...
&lt;/code>&lt;/pre>&lt;h2 id="sonarqube-설치">SonarQube 설치&lt;/h2>
&lt;p>정적분석을 도와주는 SonarQube를 설치해보자.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.1.zip
$ unzip sonarqube-6.7.1.zip
$ cd sonarqube-6.7.1/bin/linux-x86-64
$ ./sonar.sh start
Starting SonarQube...
Started SonarQube.
&lt;/code>&lt;/pre>&lt;p>기본적으로 9000포트를 사용하고 있으니 다른포트를 사용하고자 한다면 /sonarqube-6.7.1/conf/sonar.properties 내 &lt;code>sonar.web.port=9000&lt;/code> 을 수정해주면 된다. (SonarQube도 Elasticsearch를 사용하구나&amp;hellip;)
설치후 실행을 한뒤 &lt;code>서버IP:9000&lt;/code>을 접속해보면 아래 화면처럼 나온다. (혹시 접속이 안된다거나 서버가 실행이 안된다면 &lt;code>./sonar.sh console&lt;/code>로 로그를 보면 문제해결에 도움이 될수도 있다. )&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/jenkins-sonar-github-integration/sonar_main.png" title="/images/jenkins-sonar-github-integration/sonar_main.png" data-thumbnail="/images/jenkins-sonar-github-integration/sonar_main.png" data-sub-html="&lt;h2>SonarQube 메인화면&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/jenkins-sonar-github-integration/sonar_main.png"
 data-srcset="https://taetaetae.github.io/images/jenkins-sonar-github-integration/sonar_main.png, https://taetaetae.github.io/images/jenkins-sonar-github-integration/sonar_main.png 1.5x, https://taetaetae.github.io/images/jenkins-sonar-github-integration/sonar_main.png 2x"
 data-sizes="auto"
 alt="/images/jenkins-sonar-github-integration/sonar_main.png" />
 &lt;/a>&lt;figcaption class="image-caption">SonarQube 메인화면&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="sonarqube-scanner-설치">SonarQube Scanner 설치&lt;/h2>
&lt;p>소스를 연동시켜 정적분석을 하기 위해서는 SonarQube Scanner 라는게 필요하다고 한다. 아래 url에서 다운받아 적절한 곳에 압축을 풀어두자.
&lt;a href="https://docs.sonarqube.org/display/SCAN/Analyzing&amp;#43;with&amp;#43;SonarQube&amp;#43;Scanner" target="_blank" rel="noopener noreffer ">https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner&lt;/a>&lt;/p>
&lt;pre tabindex="0">&lt;code>$ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip
$ unzip sonar-scanner-cli-3.0.3.778-linux.zip
&lt;/code>&lt;/pre>&lt;h3 id="-jenkins-설치-및-sonarqube-연동"># jenkins 설치 및 SonarQube 연동&lt;/h3>
&lt;p>jenkins 설치는 간단하니 별도 언급은 안하고 넘어가&amp;hellip;려고 했으나, 하나부터 열까지 정리한다는 마음으로~
&lt;a href="https://jenkins.io/download/" target="_blank" rel="noopener noreffer ">https://jenkins.io/download/&lt;/a> 에서 최신버전을 tomcat/webapps/ 아래에 다운받고 server.xml 을 적절하게 수정해준다.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
$ vi tomcat/conf/server.xml
&amp;lt;Connector port=&amp;#34;19001&amp;#34; protocol=&amp;#34;HTTP/1.1&amp;#34; # 포트 변경
&amp;lt;Context path=&amp;#34;/jenkins&amp;#34; debug=&amp;#34;0&amp;#34; privileged=&amp;#34;true&amp;#34; docBase=&amp;#34;jenkins.war&amp;#34; /&amp;gt; #추가
# tomcat/bin/startup.sh
&lt;/code>&lt;/pre>&lt;p>jenkins 설치를 완료 한 후 필요한 플러그인을 추가로 설치해준다.&lt;/p>
&lt;ul>
&lt;li>Python Plugin&lt;/li>
&lt;li>GitHub Pull Request Builder&lt;/li>
&lt;li>GitHub plugin&lt;/li>
&lt;/ul>
&lt;p>접속 : &lt;code>서버IP:19001&lt;/code> (참고로 한 서버에서 다 설치하다보니 port 충돌을 신경쓰게되었다. )
처음 jenkins를 실행하면 이런저런 설정을 하는데 특별한 설정 변경없이 next버튼을 연신 눌러면 설치가 완료 되고, SonarQube를 사용하기 위해 &lt;code>SonarQube Scanner for Jenkins&lt;/code>라는 플러그인을 설치해주자. (이건 각 버전마다 궁합(?)이 안맞을수도 있으니 확인이 필요할수도 있다. 내가 설치한 버전은 jenkins 2.89, SonarQube Plugin 2.6.1이다.)
설치를 하면 jenkins &amp;gt; configure 에서 &lt;code>SonarQube servers&lt;/code>정보를 등록해준다.&lt;/p></description></item></channel></rss>