{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2021-01-21--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"1aaf2301-a5b3-55c2-bc54-78ffcc0cb55b","html":"<p><span class=\"title__sub1\">1. Jenkins Item 생성 (Pull Request)</span></p>\n<ul>\n<li>pipeline 선택\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/12a2bc787d353b4201c6980d1c078589/1e088/001-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 73.75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABJ0AAASdAHeZh94AAACQklEQVQ4y42Sy47TQBBF/ZH8AJ/Ali9gzYIlW3Ys2YDYREgjHpPJTFAmGScQ24ndtttuP9qvkFyq2nYYNIyEpZPqcjtV91a3pesGuumg65Zi26+HPC+r/yYjyqqGtRMRJhdfMFss8Xl6ja9XNxRnmM4XEGmOIMmIIcpsyB/iS4U4K2AFUYzlnY2t68Hb+3B3ewOvRSQRxhI+NQ1kipAaPIagoklewhJxgqW9xvqng4AKSJUjTjNDlCiDkAn8ODV/egxWL1lhQb5T3UEV+i9S6jaiioF8oHgIf5eXmgrmCtPLCdztBjZZX6/X8DwPVaUNdV2f11VVGbQuCX2P0tC2DayqJMl3nxCJPXY0O9u24TgOPNc1hXfeDtvttl/TvkPved+lmfN7d8ijKEJDt8Sq2xZp9QsxDT8IApRlaVQxTdMMCknZvZzjuB7puo4UUkH2fbPaIKQOXLChe8kbo72q+lNIny3rc6MxHo9HHA4HWFyZnzRNjXy25vs+JCmO4xhCCBOZIBDGGr+LwsiI4O/CMIRSqlfY0E+h6bbnOYqiMHBX7sacTiccT0ejgB/O/wXv95bpisxXP3C7sjGff8dsdo3FYoHl8hbT6RUEdWf1DCuRUiJNEqM4JJWsmOGchVg8bJxaoM1Rq5BsO1CZMtckyzLDqJzXoxOO476Bcp61pescLz9c4vnbC7x49w2Bkuja/hTZAjOe6pg/jimY4dmbCZ68eo+nrz9iE+zJUm+HbURm8DGSwWZvNewPh+Ngm0fBTX8DSXxuCo2ZUx0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/12a2bc787d353b4201c6980d1c078589/1e088/001-01.png\"\n        srcset=\"/devHistoryBlog/static/12a2bc787d353b4201c6980d1c078589/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/12a2bc787d353b4201c6980d1c078589/e85cb/001-01.png 480w,\n/devHistoryBlog/static/12a2bc787d353b4201c6980d1c078589/1e088/001-01.png 840w\"\n        sizes=\"(max-width: 840px) 100vw, 840px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<br>\n<ul>\n<li>Build Trigger에서 generic Webhook Trigger를 선택한다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/b7aaf19c6c7610288e3e81807ee675ca/f8915/001-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 748px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAABTklEQVQoz52S226DMBBE+f9PbMM1wfhuQC3iEmm6u8FR+lK1fVjZYPvszNhF3TRQfY+6bjDPM+73O7Ztw77vMq7r+qcqeoJxNQROKWEcR0zTJOOyLP8B3kQdA7uug7UWIQR472VDVvrbKq7XK6qqRtu2Us55GGMIbMBrvVICzvZfD79+PxU2vYPRSg7fxHqNEKMssuWfbL+C8rwIZE1r/bTqnBO7ipS1FEN1eUddVRJJeblILGVZSuO398faMGiJRoAxJiRSFM8KwQt4pAvqXcLNT+hsgkkzHdpwHAf2Y39kyxnnCE6VBd+sP3Pj0ZHSQRsoglkfMVhSaxwczccxyUvgmmjOez4+l295FpHUWOuetg3BmoFiIEDwZN9yIyfFTfOFdYoah0mUHvIS1mw5kioCDgOssQLVpMo7gvN/Bp/Z5nx51KQ6hChqDYGzwi8M6Pj5FTNbtgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/b7aaf19c6c7610288e3e81807ee675ca/f8915/001-02.png\"\n        srcset=\"/devHistoryBlog/static/b7aaf19c6c7610288e3e81807ee675ca/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/b7aaf19c6c7610288e3e81807ee675ca/e85cb/001-02.png 480w,\n/devHistoryBlog/static/b7aaf19c6c7610288e3e81807ee675ca/f8915/001-02.png 748w\"\n        sizes=\"(max-width: 748px) 100vw, 748px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><span class=\"title__sub1\">2. webhook token 설정</span></p>\n<ul>\n<li>BitBucket 에서 설정했던 token 값을 넣는다.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/22475/001-06.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 14.583333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABJ0AAASdAHeZh94AAAAZ0lEQVQI15WOSQrAIBRDvf8dFRGcikNF96mxA5SuunjkJ5BPRCkFrTX03n8xxni4fYwRwhgD5xxSSouc84szz5+cZe89QgjY5s1R1loIKRWUUtBar8cM7VQuJ7XWB/r9Uj68YY8LmR//TuJjPxbLEwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 06\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/d9199/001-06.png\"\n        srcset=\"/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/8ff5a/001-06.png 240w,\n/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/e85cb/001-06.png 480w,\n/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/d9199/001-06.png 960w,\n/devHistoryBlog/static/12d9fb97aec68c7607403df32b73ccf5/22475/001-06.png 1039w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<p><span class=\"title__sub1\">3. Parameters 정의</span></p>\n<ul>\n<li>request payload 에서 사용할 값들을 정의한다.</li>\n<li>bitbucket webhook 에 대한 각 이벤트 request payload는 <a href=\"https://support.atlassian.com/bitbucket-cloud/docs/event-payloads/\">여기</a> 에서 볼 수 있다. 근데.. 난 보기 불편하다.  </li>\n</ul>\n<p><span class=\"title__sub2\">3.1. parameter catch 방법 선택</span> </p>\n<ul>\n<li>아래와 같이 paramters를 캐치할 수 있는 폼이 있는데, 해당 hook은 POST method 형식이므로 맨 첫번째를 선택한다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/1ac29/001-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 36.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA3klEQVQY03WNYW+GIAyE/f9/cW+yBScoitAWkOqXnZhlS5Y9udRy3sGQzLiM42o+d2uV6GRWiCBqRM8C5/Exr5zV+4Z5ngNZt7FwziRMknOt+ajlOGprUGkHHKnl9mtFJpVctqBPORrj3l7z67W9f9BkxTpxLru5zEvXDAc+W/yyCO/G5GnSWu8yi2whEPGB10qB7gX0IzZIG5I313kBHLQzpJSWTowxhIDJzDAx6QZfxlVPunX0myERLd7vMeIJ1VP/4Xfnpywi+x5TB8u6bn7xlFIIuDA+ZkwRsb/lL8rMjh6lnhsuAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/d9199/001-03.png\"\n        srcset=\"/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/e85cb/001-03.png 480w,\n/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/d9199/001-03.png 960w,\n/devHistoryBlog/static/3c194c47a2980c25c706517b4754ab68/1ac29/001-03.png 1022w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br>\n<p><span class=\"title__sub2\">3.2. 사용할 변수들을 정의한다.</span> </p>\n<ul>\n<li>Variable : 변수로 사용할 이름  </li>\n<li>Expression : payload에서 사용 할 값  </li>\n<li>JSONPath : payload가 json으로 들어오므로 해당 값을 선택한다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/51ed8/001-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 67.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABJ0AAASdAHeZh94AAABPUlEQVQ4y6VSW3KDMAz0/e+WW0AJCQ+/wAbCbLUGZ2jayWTox45l2ZK1u1Z1XaNpGnRdjxjjKYQxQF8uCM5BWWuxriuWZcE0TacxFAXiOEI56WqMkZcmzPN8GgsgjWeoqrqCTc/SfSKEtKphGDDKqKT8rwl3yVTXdWnCnHhemLf4mNv0im+1VG3bpoY0x4qWjqvg3ltos8Wdoc4WQWix6B11VZalNLLw3oP0uRLGj3Be5JCc9VueBcep/5yQr4Zd0GMcw4gg6xCmBMbUOoMPHPcEa1VZlKiqCldB+VWhvrdC00DrHr02aIR6ozf6/F4Z1F5r/SPHpup2uz1NyW4d8XgIPvwBiXLWjOKzcTYlxbtZPP+4oRZaLPTepcLUaI/znma9uplN+OWysS4Jnk3JlxgfBY+7Kfks/4rXr/QN2gw/pS2DBKoAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/d9199/001-04.png\"\n        srcset=\"/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/e85cb/001-04.png 480w,\n/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/d9199/001-04.png 960w,\n/devHistoryBlog/static/30f7cd78d215eb1127cffec34d0e0a9e/51ed8/001-04.png 1021w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br>\n<p><span class=\"title__sub2\">3.3. 정의한 변수들</span> </p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">1. SOURCE_BRANCH  \n  -- PR 타켓 branch  \n  -- expression: $.pullrequest.source.branch.name\n\n2. COMMENT_URL\n  -- pipeline에서 정의한 stage 수행 시 comment 기록를 위한 url  \n  -- expression: $.pullrequest.links.comments.href\n\n3. DECLINE_URL\n  -- pipeline에서 정의한 stage 실패 시 PR decline을 위한 url  \n  -- expression: $.pullrequest.links.decline.href\n\n4. REPO_URL\n  -- git repository url \n  -- expression: $.pullrequest.destination.repository.links.html.href</code></pre></div>\n<p><span class=\"title__sub1\">4. Pipeline 작성</span></p>\n<ul>\n<li>맨 아래 pipeline을 작성하는 폼이 있다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/aa61c/001-07.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 27.916666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABJ0AAASdAHeZh94AAAAdElEQVQY062P0Q7DIAhF+f8/dYvWFVoVrbdi0oe9bd1ITggPXA7knINqQUoJOeevsb2LMmYKIaCU8hfqECPv/bykqreptaK1hmcUUIxxBu57etP/FGaGfWliD7+ALPmX6r1PO6MfB2h5rVhZ7iMClm30bfYTmLTUGzTvHgwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 07\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/d9199/001-07.png\"\n        srcset=\"/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/8ff5a/001-07.png 240w,\n/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/e85cb/001-07.png 480w,\n/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/d9199/001-07.png 960w,\n/devHistoryBlog/static/8c85c8f1306974665d393124dcc29696/aa61c/001-07.png 1065w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br>\n<ul>\n<li>아래와 같이 작성한다.</li>\n<li>예제는 Develop Branch PR 로 한다.</li>\n<li>그 외 3개 시나리오에 대해선 github에 정리하자.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">node {\n    withCredentials([usernameColonPassword(credentialsId: &#39;bitbucket-auth-id-pw&#39;, variable: &#39;USER&#39;)]) {\n        stage (&#39;Clone&#39;) { //clone 타켓 branch  \n            try {\n                git branch: &#39;$SOURCE_BRANCH&#39;, credentialsId: &#39;bitbucket-auth-id-pw&#39;, url: &#39;$REPO_URL&#39;\n            } catch(e) {\n                sh &#39;&#39;&#39;\n                    curl -X POST -u &quot;$USER&quot; $COMMENT_URL -d &#39;{&quot;content&quot;: {&quot;raw&quot;: &quot;[CLONE] FAIL&quot;}}&#39; -H &#39;Content-Type: application/json&#39;;\n                    curl -X POST -u &quot;$USER&quot; $DECLINE_URL -d &#39;{&quot;content&quot;: {&quot;raw&quot;: &quot;[CLONE] FAIL&quot;}}&#39; -H &#39;Content-Type: application/json&#39;;\n                    echo [CLONE] FAIL;\n                    exit 1;\n                &#39;&#39;&#39;\n            }\n        }\n        \n        stage (&#39;Build&#39;) { //테스트 없이 소스코드 빌드 ( 컴파일 오류 체크 ), 실패 시 해당 PR comment 등록 및 decline\n            sh &#39;&#39;&#39;\n            {\n                echo [BUILD - BACKEND]\n                chmod +x ./gradlew\n                ./gradlew clean build -x test \\\n                &amp;&amp; curl -X POST -u &quot;$USER&quot; $COMMENT_URL -d &#39;{&quot;content&quot;: {&quot;raw&quot;: &quot;[BUILD] SUCCESS&quot;}}&#39; -H &#39;Content-Type: application/json&#39; &gt; /dev/null 2&gt;&amp;1 \\\n                &amp;&amp; echo [BUILD] SUCCESS;\n            }||\\\n            {\n                curl -X POST -u &quot;$USER&quot; $COMMENT_URL -d &#39;{&quot;content&quot;: {&quot;raw&quot;: &quot;[BUILD] FAIL&quot;}}&#39; -H &#39;Content-Type: application/json&#39;;\n                curl -X POST -u &quot;$USER&quot; $DECLINE_URL -d &#39;{&quot;content&quot;: {&quot;raw&quot;: &quot;[BUILD] FAIL&quot;}}&#39; -H &#39;Content-Type: application/json&#39;;\n                echo [BUILD] FAIL;\n                exit 1;\n            }\n            &#39;&#39;&#39;\n        }\n    }\n}</code></pre></div>\n<hr>\n<p><a href=\"https://eunyoung-autocrypt.github.io/devHistoryBlog/works/posts/2021-01-18--001\">> [작업로그] CI/CD 구축 #1 - CI/CD 시나리오</a><br>\n<a href=\"https://eunyoung-autocrypt.github.io/devHistoryBlog/works/posts/2021-01-18--002\">> [작업로그] CI/CD 구축 #2 - Docker, Docker Compose 설치</a><br>\n<a href=\"https://eunyoung-autocrypt.github.io/devHistoryBlog/works/posts/2021-01-18--003\">> [작업로그] CI/CD 구축 #3 - BitBucket 설정 및 Jenkins 설치</a>  </p>\n<p><a href=\"https://eunyoung-autocrypt.github.io/devHistoryBlog/works/posts/2021-01-23--002\">> [작업로그] CI/CD 구축 #5 - sonarqube 설치 및 pipeline 작성</a>  </p>","fields":{"tagSlugs":["/tags/ci-cd/","/tags/jenkins/","/tags/pipeline/"],"slug":"/works/posts/2021-01-21--001"},"frontmatter":{"title":"[작업로그] CI/CD 구축 #4","tags":["ci/cd","jenkins","Pipeline"],"date":"2021-01-21","description":"Jenkins Item 등록 및 Pipeline 작성"}}},"pageContext":{"slug":"/works/posts/2021-01-21--001"}},"staticQueryHashes":[]}