<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Github on</title><link>https://taetaetae.github.io/tags/github/</link><description>Recent content in Github on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 07 Sep 2020 10:09:56 +0000</lastBuildDate><atom:link href="https://taetaetae.github.io/tags/github/index.xml" rel="self" type="application/rss+xml"/><item><title>빌드/테스트는 내가 해줄게. 너는 코딩에 집중해 (by GitHub Pull Request Builder)</title><link>https://taetaetae.github.io/2020/09/07/github-pullrequest-build/</link><pubDate>Mon, 07 Sep 2020 10:09:56 +0000</pubDate><guid>https://taetaetae.github.io/2020/09/07/github-pullrequest-build/</guid><description>&lt;p>　git 은 분산 버전 관리 시스템 중 가장 잘 알려져 있다고 해도 과언이 아닐 정도로 대부분의 시스템에서 사용되고 있는 것 같다. 이를 웹서비스에서 보다 편하게 사용할 수 있도록 한 시스템이 Github. &lt;!--more -->Github 을 사용하는 이유 중에 가장 큰 이유를 하나만 이야기해보자면 바로 온라인상에서 코드 리뷰를 할 수 있는 pullRequest라는 기능 때문이 아닐까 조심스럽게 생각을 해본다.&lt;/p>
&lt;p>　pullRequest는 work branch에서 작업한 내용을 base branch로 merge 전 꼭 코드 리뷰가 아니더라도 작업한 내용에 대해서 다양한 검사를 자동화할 수 있는 강력한 기능들이 많다. 이러한 자동화는 CI(지속적 통합) 관점에서 매우 중요한데 코드에 대해 체크해야 할 부분들(빌드, 테스트, 정적 분석 등)을 &amp;ldquo;알아서&amp;rdquo; 해준다면 작업자는 오롯이 비즈니스 로직 개발에 대해서만 신경 쓸 수 있으니 생산성 절약 측면에서 엄청난 효과를 볼 수 있다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-pullrequest-build/car.gif" title="/images/github-pullrequest-build/car.gif" data-thumbnail="/images/github-pullrequest-build/car.gif" data-sub-html="&lt;h2>내가 하는일에만 집중할 수 있게! 출처 : https://www.clien.net/service/board/park/10453442&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-pullrequest-build/car.gif"
 data-srcset="https://taetaetae.github.io/images/github-pullrequest-build/car.gif, https://taetaetae.github.io/images/github-pullrequest-build/car.gif 1.5x, https://taetaetae.github.io/images/github-pullrequest-build/car.gif 2x"
 data-sizes="auto"
 alt="/images/github-pullrequest-build/car.gif" width="50%" />
 &lt;/a>&lt;figcaption class="image-caption">내가 하는일에만 집중할 수 있게! &lt;br> 출처 : &lt;a href="https://www.clien.net/service/board/park/10453442" target="_blank" rel="noopener noreffer ">https://www.clien.net/service/board/park/10453442&lt;/a>&lt;/figcaption>
 &lt;/figure>
&lt;p>이번 포스팅에서는 그중에서도 아주 간단한 설정만으로 work branch의 빌드 상태를 검사해 볼 수 있는 Jenkins의 Github Pull Request Builder를 설치 및 활용해 보고자 한다.&lt;/p>
&lt;blockquote>
&lt;p>사실 최근 팀에서 CI 서버를 이전해야 했었다. 머릿속에서는 어떻게 하면 되겠지 싶었지만 막상 해보려니 Jenkins 버전업도 되었고 뭐부터 해야 할지 허둥대는 필자가 부끄러웠다. 이참에 정리를 해보며 다시 한번 리마인드 하는 시간을 가져보고자 한다. (이래서 기억보다 기록이 중요하다.)&lt;/p>&lt;/blockquote>
&lt;h2 id="준비물">준비물&lt;/h2>
&lt;p>　전체적인 흐름은 아래 그림처럼 흘러가기 때문에 당연히 서버에 Jenkins 가 설치되어 있어야 한다. Jenkins 설치는 필자의 포스팅(&lt;a href="https://taetaetae.github.io/2018/12/02/jenkins-install/" target="_blank" rel="noopener noreffer ">Jenkins 설치 치트키&lt;/a>)를 참고해 보는 것도 좋을 것 같다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-pullrequest-build/programmer-github-jenkins.jpg" title="/images/github-pullrequest-build/programmer-github-jenkins.jpg" data-thumbnail="/images/github-pullrequest-build/programmer-github-jenkins.jpg" 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/github-pullrequest-build/programmer-github-jenkins.jpg"
 data-srcset="https://taetaetae.github.io/images/github-pullrequest-build/programmer-github-jenkins.jpg, https://taetaetae.github.io/images/github-pullrequest-build/programmer-github-jenkins.jpg 1.5x, https://taetaetae.github.io/images/github-pullrequest-build/programmer-github-jenkins.jpg 2x"
 data-sizes="auto"
 alt="/images/github-pullrequest-build/programmer-github-jenkins.jpg" width="50%" />
 &lt;/a>&lt;figcaption class="image-caption">전체적인 흐름&lt;/figcaption>
 &lt;/figure>
&lt;p>　참고로 필자는 GitHub Enterprise 버전에서 사용했는데 일반 Github에서도 동일한 방법으로 사용 가능하다.&lt;/p>
&lt;h3 id="github과-jenkins의-연동을-위한-2가지-설정">Github과 Jenkins의 연동을 위한 2가지 설정&lt;/h3>
&lt;p>　Github 과 Jenkins 가 통신이 되도록 설정해 줘야 한다. 그래야 Github의 코드를 받아서 Jenkins 가 빌드를 하고 그 빌드 결과를 다시 Github에 리포트가 가능해지기 때문이다. 먼저 첫 번째로 ssh 설정으로 Github의 코드를 가져오도록 ssh 설정을 해두자. ssh 설정하는 방법은 필자의 포스팅(&lt;a href="https://taetaetae.github.io/2018/02/08/github-with-jenkins/" target="_blank" rel="noopener noreffer ">Github과 Jenkins 연동하기&lt;/a>)편을 확인해보면 될 것 같다.&lt;/p>
&lt;p>　그다음으로 아래에서 이야기할 &lt;code>GitHub Pull Request Builder&lt;/code>라는 Jenkins plugin 이 빌드가 끝난 뒤에 결과를 리포팅 해줄 수 있는 인증 토큰을 발급받아두자. Github &amp;gt; Settings &amp;gt; Developer settings &amp;gt; Personal access tokens 화면에서 키를 생성하고 만들어진 키를 저장해 둔다. (이 키는 보안에 유의해야 하고, 화면 경고(?)에서도 볼 수 있듯이 키는 생성 시 한 번밖에 볼 수 없기 때문에 미리 저장해 둬야 한다.)&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-pullrequest-build/github-access-token.jpg" title="/images/github-pullrequest-build/github-access-token.jpg" data-thumbnail="/images/github-pullrequest-build/github-access-token.jpg" 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/github-pullrequest-build/github-access-token.jpg"
 data-srcset="https://taetaetae.github.io/images/github-pullrequest-build/github-access-token.jpg, https://taetaetae.github.io/images/github-pullrequest-build/github-access-token.jpg 1.5x, https://taetaetae.github.io/images/github-pullrequest-build/github-access-token.jpg 2x"
 data-sizes="auto"
 alt="/images/github-pullrequest-build/github-access-token.jpg" width="50%" />
 &lt;/a>&lt;figcaption class="image-caption">인증토큰을 미리 받아두자.&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="jenkins-설정">Jenkins 설정&lt;/h2>
&lt;p>　Jenkins &amp;gt; 관리 &amp;gt; pluginManager에 들어가 &lt;code>GitHub Pull Request Builder&lt;/code>를 검색 후 설치해 준다. 그러고 나서 Jenkins &amp;gt; 관리 &amp;gt; 환경설정에 들어가 보면 아래와 같이 &lt;code>GitHub Pull Request Builder&lt;/code> 항목이 생긴 것을 확인할 수 있고 위에서 설정한 인증토큰을 아래처럼 등록 후 저장을 한다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-pullrequest-build/add-github-access-token.jpg" title="/images/github-pullrequest-build/add-github-access-token.jpg" data-thumbnail="/images/github-pullrequest-build/add-github-access-token.jpg" data-sub-html="&lt;h2>credentials 을 위에서 발급받은 인증토큰으로 등록해준다.&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-pullrequest-build/add-github-access-token.jpg"
 data-srcset="https://taetaetae.github.io/images/github-pullrequest-build/add-github-access-token.jpg, https://taetaetae.github.io/images/github-pullrequest-build/add-github-access-token.jpg 1.5x, https://taetaetae.github.io/images/github-pullrequest-build/add-github-access-token.jpg 2x"
 data-sizes="auto"
 alt="/images/github-pullrequest-build/add-github-access-token.jpg" width="50%" />
 &lt;/a>&lt;figcaption class="image-caption">credentials 을 위에서 발급받은 인증토큰으로 등록해준다.&lt;/figcaption>
 &lt;/figure>
&lt;p>　Jenkins job을 하나 만들고 pullRequest 가 발생했을 때 자동으로 실행될 수 있도록 설정을 해준다. 먼저 General 탭에 &lt;code>Github project&lt;/code>에 Github url 을 적어주고&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-pullrequest-build/jenkins-general.jpg" title="/images/github-pullrequest-build/jenkins-general.jpg" data-thumbnail="/images/github-pullrequest-build/jenkins-general.jpg">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-pullrequest-build/jenkins-general.jpg"
 data-srcset="https://taetaetae.github.io/images/github-pullrequest-build/jenkins-general.jpg, https://taetaetae.github.io/images/github-pullrequest-build/jenkins-general.jpg 1.5x, https://taetaetae.github.io/images/github-pullrequest-build/jenkins-general.jpg 2x"
 data-sizes="auto"
 alt="/images/github-pullrequest-build/jenkins-general.jpg" width="50%" />
 &lt;/a>
&lt;p>　소스 코드 관리 탭에서 ssh 주소를 적고 위에서 미리 설정한 ssh 키로 credentials 값을 넣어준다. 전에도 이야기했지만 이 부분에서 오류가 발생하면 빨간색 글씨로 오류 내용이 나오고 아래 화면처럼 오류가 없다면 아무것도 안 나온다. Refspec 에 &lt;code>+refs/pull/*:refs/remotes/origin/pr/*&lt;/code> 라고 적어주고 브랜치 설정은 파라미터로 받아와서 pullRequest를 발생시킨 브랜치를 빌드 할 수 있도록 &lt;code>${sha1}&lt;/code> 라고 적어주자.&lt;/p></description></item><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><item><title>Github의 WebHook을 이용하여 자동 Jenkins Job 실행</title><link>https://taetaetae.github.io/2018/02/08/github-web-hook-jenkins-job-excute/</link><pubDate>Thu, 08 Feb 2018 17:10:54 +0000</pubDate><guid>https://taetaetae.github.io/2018/02/08/github-web-hook-jenkins-job-excute/</guid><description>&lt;p>PullRequest가 발생하면 알림을 받고싶다거나, 내가 관리하는 레파지토리에 댓글이 달릴때마다 또는 이슈가 생성될때마다 정보를 저장하고 싶다거나. 종합해보면 &lt;code>Github에서 이벤트가 발생할때 어떤 동작을 해야 할 경우&lt;/code> Github에서 제공하는 Webhook 을 사용하여 목적을 달성할 수 있다.
아 당연한 이야기이지만 언급하고 넘어갈께 있다면, Github에서 Jenkins Job을 호출하기 위해서는 Jenkins가 외부에 공개되어 있어야 한다. (내부사설망이나 private 한 설정이 되어있다면 호출이 안되어 Webhook기능을 사용할 수 없다.)&lt;/p>
&lt;h2 id="jenkins-security-설정">Jenkins Security 설정&lt;/h2>
&lt;p>Jenkins Job을 외부에서 URL로 실행을 하기 위해서는 아래 설정이 꼭 필요하다. (이 설정을 몰라서 수많은 삽질을 했다.)
CSRF Protection 설정 체크를 풀어줘야 한다. 이렇게 되면 외부에서 Job에 대한 트리거링이 가능해 진다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_config.png" title="/images/github-web-hook-jenkins-job-excute/jenkins_config.png" data-thumbnail="/images/github-web-hook-jenkins-job-excute/jenkins_config.png" data-sub-html="&lt;h2>Jenkins &amp;gt; Configure Global Security&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_config.png"
 data-srcset="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_config.png, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_config.png 1.5x, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_config.png 2x"
 data-sizes="auto"
 alt="/images/github-web-hook-jenkins-job-excute/jenkins_config.png" />
 &lt;/a>&lt;figcaption class="image-caption">Jenkins &amp;gt; Configure Global Security&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="jenkins-job-설정">Jenkins Job 설정&lt;/h2>
&lt;p>Github 에서 Webhook에 의해 Jenkins Job을 실행하게 될텐데, 그때 정보들이 &lt;code>payload&lt;/code>라는 파라미터와 함께 &lt;code>POST&lt;/code> 형식으로 호출이 되기 때문에 미리 Job에서 받는 준비(?)를 해둬야 한다.
설정은 간단하게 다음과 같이 Job 파라미터 설정을 해주면 된다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png" title="/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png" data-thumbnail="/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png" data-sub-html="&lt;h2>Jenkins &amp;gt; 해당 Job &amp;gt; configure&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png"
 data-srcset="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png 1.5x, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png 2x"
 data-sizes="auto"
 alt="/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png" />
 &lt;/a>&lt;figcaption class="image-caption">Jenkins &amp;gt; 해당 Job &amp;gt; configure&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="github-webhook-설정">Github Webhook 설정&lt;/h2>
&lt;p>이제 Github Repository 의 Hook 설정만 하면 끝이난다. 해당 Repository &amp;gt; Settings &amp;gt; Hooks 설정에 들어가서 &lt;code>Add webhook&lt;/code>을 선택하여 Webhook을 등록해준다.
URL은 &lt;code>{jenkins URL}/jenkins/job/{job name}/buildWithParameters&lt;/code>식으로 설정해주고 Content Type 은 &lt;code>application/x-www-form-urlencoded&lt;/code>으로 선택한다. 언제 Webhook을 트리거링 시킬꺼냐는 옵션에서는 원하는 설정에 맞추면 되겠지만 나는 &lt;code>pullRequest&lt;/code>가 등록 될때만 미리 만들어 놓은 Jenkins Job을 실행시킬 계획이였으니 &lt;code>Let me select individual events.&lt;/code>을 설정하고 &lt;code>Pull Request&lt;/code>에 체크를 해준다. 아래 그림처럼 말이다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook.png" title="/images/github-web-hook-jenkins-job-excute/oss_webhook.png" data-thumbnail="/images/github-web-hook-jenkins-job-excute/oss_webhook.png" data-sub-html="&lt;h2>해당 Repositroy &amp;gt; Settings &amp;gt; Hooks&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook.png"
 data-srcset="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook.png, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook.png 1.5x, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook.png 2x"
 data-sizes="auto"
 alt="/images/github-web-hook-jenkins-job-excute/oss_webhook.png" />
 &lt;/a>&lt;figcaption class="image-caption">해당 Repositroy &amp;gt; Settings &amp;gt; Hooks&lt;/figcaption>
 &lt;/figure>
&lt;p>이렇게 등록하고 다시 들어가서 맨 아랫 부분&lt;code>Recent Deliveries&lt;/code>을 보면 ping test 가 이루어져 정상적으로 응답을 받은것을 확인할수가 있다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png" title="/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png" data-thumbnail="/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png" data-sub-html="&lt;h2>Webhook 등록 결과&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png"
 data-srcset="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png 1.5x, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png 2x"
 data-sizes="auto"
 alt="/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png" />
 &lt;/a>&lt;figcaption class="image-caption">Webhook 등록 결과&lt;/figcaption>
 &lt;/figure>
&lt;p>이렇게 설정을 다 한 뒤 PullRequest를 발생시키면 Jenkins 해당 Job에서는 파라미터를 받으며 실행이 된것을 확인할수가 있다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png" title="/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png" data-thumbnail="/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png" data-sub-html="&lt;h2>Jenkins Job 실행 결과&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png"
 data-srcset="https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png 1.5x, https://taetaetae.github.io/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png 2x"
 data-sizes="auto"
 alt="/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png" />
 &lt;/a>&lt;figcaption class="image-caption">Jenkins Job 실행 결과&lt;/figcaption>
 &lt;/figure>
&lt;p>끝~&lt;/p></description></item><item><title>Github과 Jenkins 연동하기</title><link>https://taetaetae.github.io/2018/02/08/github-with-jenkins/</link><pubDate>Thu, 08 Feb 2018 17:10:21 +0000</pubDate><guid>https://taetaetae.github.io/2018/02/08/github-with-jenkins/</guid><description>&lt;p>Jenkins에서 Github의 소스를 가져와서 빌드를 하는 등 Github과 Jenkins와 연동을 시켜줘야하는 상황에서, 별도의 선행 작업이 필요하다. 다른 여러 방법이 있을수 있는데 여기서는 SSH로 연동하는 방법을 알아보고자 한다.&lt;!-- more -->&lt;/p>
&lt;p>우선 Jenkins가 설치되어있는 서버에서 인증키를 생성하자.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ ssh-keygen -t rsa -f id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
SHA256:~~~~~ ~~~@~~~~~
The key&amp;#39;s randomart image is:
+---[RSA 2048]----+
| o*+**=*=**+ |
| o B=o+o++o |
| E+.o+ + oo .|
| oo. * o ...|
| .+ S = o |
| . + o . |
| . . . |
| . |
| |
+----[SHA256]-----+

$ ls
id_rsa id_rsa.pub
&lt;/code>&lt;/pre>&lt;p>개인키(id_rsa)는 젠킨스에 설정해준다. (처음부터 끝까지 복사, 첫줄 마지막줄 빼면 안된다&amp;hellip; )&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-with-jenkins/ssh_jenkins.png" title="/images/github-with-jenkins/ssh_jenkins.png" data-thumbnail="/images/github-with-jenkins/ssh_jenkins.png" data-sub-html="&lt;h2>젠킨스에 SSH 개인키 설정&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-with-jenkins/ssh_jenkins.png"
 data-srcset="https://taetaetae.github.io/images/github-with-jenkins/ssh_jenkins.png, https://taetaetae.github.io/images/github-with-jenkins/ssh_jenkins.png 1.5x, https://taetaetae.github.io/images/github-with-jenkins/ssh_jenkins.png 2x"
 data-sizes="auto"
 alt="/images/github-with-jenkins/ssh_jenkins.png" />
 &lt;/a>&lt;figcaption class="image-caption">젠킨스에 SSH 개인키 설정&lt;/figcaption>
 &lt;/figure>
&lt;p>그 다음 공개키(id_rsa.pub)는 Github에 설정을 해준다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-with-jenkins/ssh_github.png" title="/images/github-with-jenkins/ssh_github.png" data-thumbnail="/images/github-with-jenkins/ssh_github.png" data-sub-html="&lt;h2>Github에 SSH 공개키 설정&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-with-jenkins/ssh_github.png"
 data-srcset="https://taetaetae.github.io/images/github-with-jenkins/ssh_github.png, https://taetaetae.github.io/images/github-with-jenkins/ssh_github.png 1.5x, https://taetaetae.github.io/images/github-with-jenkins/ssh_github.png 2x"
 data-sizes="auto"
 alt="/images/github-with-jenkins/ssh_github.png" />
 &lt;/a>&lt;figcaption class="image-caption">Github에 SSH 공개키 설정&lt;/figcaption>
 &lt;/figure>
&lt;p>이렇게 한뒤 Jenkins 에서 임의로 job을 생성하고 job 설정 &amp;gt; 소스코드 관리 에서 git 부분에 아래처럼 테스트를 해서 정상적으로 연동이 된것을 확인한다. &lt;code>Credentials&lt;/code> 값을 위에서 설정한 개인키로 설정하고, repo 주소를 SSH용으로 적었을때 에러가 안나오면 성공한것이다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-with-jenkins/ssh_complete.png" title="/images/github-with-jenkins/ssh_complete.png" data-thumbnail="/images/github-with-jenkins/ssh_complete.png" data-sub-html="&lt;h2>정상 연결되면 Jenkins 오류도 없고, github SSH 키에 녹색불이 들어온다.&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-with-jenkins/ssh_complete.png"
 data-srcset="https://taetaetae.github.io/images/github-with-jenkins/ssh_complete.png, https://taetaetae.github.io/images/github-with-jenkins/ssh_complete.png 1.5x, https://taetaetae.github.io/images/github-with-jenkins/ssh_complete.png 2x"
 data-sizes="auto"
 alt="/images/github-with-jenkins/ssh_complete.png" />
 &lt;/a>&lt;figcaption class="image-caption">정상 연결되면 Jenkins 오류도 없고, github SSH 키에 녹색불이 들어온다.&lt;/figcaption>
 &lt;/figure>
&lt;p>끝~&lt;/p></description></item><item><title>github api 사용방법</title><link>https://taetaetae.github.io/2017/03/02/github-api/</link><pubDate>Thu, 02 Mar 2017 11:18:05 +0000</pubDate><guid>https://taetaetae.github.io/2017/03/02/github-api/</guid><description>&lt;p>github 에서는 레파지토리의 전반적인 상황에 대해 다양한 API를 제공해주고 있다. 이번에는 그 API를 사용하는 방법에 대해 알아보고자 한다.&lt;/p>
&lt;h2 id="personal-access-tokens-발급">Personal access tokens 발급&lt;/h2>
&lt;p>우선 정상적인 API를 사용하기 위해 &lt;code>Personal access tokens&lt;/code>를 발급받아야 한다. github 초기화면 &amp;gt; 우측상단 프로필사진 클릭 &amp;gt; setting &amp;gt; Personal access tokens 에 들어가 토큰을 생성을 한다.
해당 토큰의 허용범위를 설정한뒤 생성을 하면 만들어 지는데 여기서 발급되는 문자열은 따로 보관하는게 좋다. (나중에 다시 확인하려면 새로 재 생성하는 방법말고는 없기 때문에 한번 만들때 메모해 두는게 좋다.)
아래와 같이 생성완료.
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_access_tokens.png" title="/images/github-api/github_access_tokens.png" data-thumbnail="/images/github-api/github_access_tokens.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_access_tokens.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_access_tokens.png, https://taetaetae.github.io/images/github-api/github_access_tokens.png 1.5x, https://taetaetae.github.io/images/github-api/github_access_tokens.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_access_tokens.png" width="80%" />
 &lt;/a>&lt;/p>
&lt;h2 id="api-사용방법">API 사용방법&lt;/h2>
&lt;p>권한이 없는 Repository 의 내용을 확인할수 없듯이 github에서 제공하는 API또한 권한이 있는 Repository에 대해서만 API를 제공한다. 위에서 발급한 token 을 권한 체크할때 사용하는데 다양한 방법이 있을수 있겠으나 나는 간단하게 헤더에 포함시켜서 일반 GET 호출을 하는 방식으로 하였다. 윈도우 환경에서는 헤더 셋팅하고 호출하는게 조금 어려울수 있으니 이러한 부분을 설정할수 있는 &lt;code>Postman&lt;/code>이라는 프로그램으로 호출을 해본다.
아래처럼 url은 &lt;code>https://api.github.com/&lt;/code>으로 설정하고 &lt;code>Headers&lt;/code>파라미터에 &lt;code>Authorization&lt;/code>라는 key에 value를 위에서 발급받았던 token을 이용하여 &lt;code>token abcd~~&lt;/code>식으로 입력해준다음 &lt;code>send&lt;/code>버튼을 눌러주면 응답을 받을수가 있는데, 아래 그림은 제공하는 api의 모든 url을 확인하는 방법이다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_api_call_1.png" title="/images/github-api/github_api_call_1.png" data-thumbnail="/images/github-api/github_api_call_1.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_api_call_1.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_api_call_1.png, https://taetaetae.github.io/images/github-api/github_api_call_1.png 1.5x, https://taetaetae.github.io/images/github-api/github_api_call_1.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_api_call_1.png" />
 &lt;/a>
&lt;p>아래애서는 위에서 확인된 api url을 활용하여 내가 권한이 있는 레파지토리 내에서 확인할수있는 정보에 대한 API를 호출해보았다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_api_call_2.png" title="/images/github-api/github_api_call_2.png" data-thumbnail="/images/github-api/github_api_call_2.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_api_call_2.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_api_call_2.png, https://taetaetae.github.io/images/github-api/github_api_call_2.png 1.5x, https://taetaetae.github.io/images/github-api/github_api_call_2.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_api_call_2.png" />
 &lt;/a>
&lt;p>API 호출시 가장 보편화되어있는(?) 스팩인 &lt;code>JSON&lt;/code>으로 응답이 내려오기때문에 어떠한 환경에서도 충분히 활용할수 있을것이라 생각한다.
나는 개인적으로 팀 내에서 하나의 &lt;code>Organizations&lt;/code>내에 여러 &lt;code>Repository&lt;/code>가 있는데 각각의 &lt;code>PullRequest&lt;/code>에 대해 코드리뷰를 해야하는 상황에서 일일히 다 찾아보기 귀찮아 github-api를 활용해 open된 &lt;code>PullRequest&lt;/code>가 있으면 알림을 주는 걸 만들어 보았다.&lt;/p></description></item></channel></rss>