{"id":2546,"date":"2021-08-04T14:14:51","date_gmt":"2021-08-04T05:14:51","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2546"},"modified":"2021-09-18T15:20:32","modified_gmt":"2021-09-18T06:20:32","slug":"jenkins-github-nomad-%eb%a5%bc-%ec%9d%b4%ec%9a%a9%ed%95%9c-ci-cd-%ec%8b%9c%ec%8a%a4%ed%85%9c-%ea%b5%ac%ec%b6%95","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2546","title":{"rendered":"Jenkins Github Nomad \ub97c \uc774\uc6a9\ud55c CI\/CD \uc2dc\uc2a4\ud15c \uad6c\ucd95"},"content":{"rendered":"<h1>Jenkins Github Nomad \ub97c \uc774\uc6a9\ud55c CI\/CD \uc2dc\uc2a4\ud15c \uad6c\ucd95<\/h1>\n<h2>nomad \ub780?<\/h2>\n<p><a href=\"https:\/\/www.itdaily.kr\/news\/articleView.html?idxno=203060\">\ucc38\uc870<\/a><\/p>\n<h2>\ubaa9\ud45c<\/h2>\n<p>\uac1c\ubc1c\uc790\uac00 <code>Github<\/code> \uc5d0 \uc18c\uc2a4\ub97c Push \ud558\uba74,<br \/>\nWebhook \uc744 \uc774\uc6a9\ud574 <code>Jenkins<\/code> \uc5d0 \ub178\ud2f0\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Jenkins<\/code> \uac00 \uc18c\uc2a4\ub97c \uac00\uc838\uc640 \ucef4\ud30c\uc77c\/\ud328\ud0a4\uc9d5\/Dockerize \ud574\uc11c,<br \/>\n<code>AWS ECR<\/code> \uc5d0 \ubc30\ud3ec\ud569\ub2c8\ub2e4.<br \/>\n\uadf8\ub9ac\uace0, <code>Nomad Server(Host)<\/code> \uc5d0 \uc18c\uc2a4\uac00 \ubc14\ub00c\uc5c8\uc74c\uc744 \ub178\ud2f0\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Client(Worker)<\/code> \ub294 \uc8fc\uae30\uc801\uc73c\ub85c Nomad Server(Host) \uc5d0 \uc811\uc18d\ud574\uc11c,<br \/>\n\uc0c8\ub85c\uc6b4 \uc774\ubbf8\uc9c0\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0,<br \/>\n\uc0c8\ub85c\uc6b4 \uc774\ubbf8\uc9c0\uac00 \uc788\uc73c\uba74 \uc774\ubbf8\uc9c0\ub97c \uac00\uc838\uc640 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc124\uce58<\/h2>\n<h3>Jenkins \uc124\uce58<\/h3>\n<h4>\uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131<\/h4>\n<p><code>Amazon Linux 2 AMI<\/code> \ub85c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uba54\ubaa8\ub9ac\ub97c 2G \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h4>Jenkins\/Docker\/Git \uc124\uce58<\/h4>\n<p>Jenkins \ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum update -y\n\nsudo wget -O \/etc\/yum.repos.d\/jenkins.repo \\\n    https:\/\/pkg.jenkins.io\/redhat-stable\/jenkins.repo\n\nsudo rpm --import https:\/\/pkg.jenkins.io\/redhat-stable\/jenkins.io.key\n\nsudo yum upgrade\n\nsudo yum install jenkins java-1.8.0-openjdk-devel -y\n\nsudo systemctl daemon-reload\n\nsudo systemctl start jenkins\n\nsudo systemctl status jenkins<\/code><\/pre>\n<p>Docker \ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \ub3c4\ucee4 \uadf8\ub8f9\uc5d0 jenkins \ub97c \ucd94\uac00\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum install docker -y\ndocker -v\nsudo service docker start\nsudo systemctl enable docker.service\n\nsudo usermod -aG docker jenkins\n\n# \uc820\ud0a8\uc2a4\ub97c \uc7ac\uc2e4\ud589\ud569\ub2c8\ub2e4.\nsudo systemctl restart jenkins<\/code><\/pre>\n<p>Git \uc744 \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum install git -y\ngit version<\/code><\/pre>\n<p>\uc790\ubc14 \ubc84\uc804\uc744 11 \ub85c \uc62c\ub9bd\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum install java-11-amazon-corretto-headless -y\nsudo alternatives --config java\njava -version<\/code><\/pre>\n<p>nomad \ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">wget https:\/\/releases.hashicorp.com\/nomad\/1.1.3\/nomad_1.1.3_linux_amd64.zip\nunzip nomad_1.1.3_linux_amd64.zip\nsudo chown root:root nomad\nsudo chmod 777 nomad\nsudo mv nomad \/usr\/local\/bin\/\n\nnomad -version\nNomad v1.1.3 (8c0c8140997329136971e66e4c2337dfcf932692)<\/code><\/pre>\n<h4>\ubc29\ud654\ubcbd \uc124\uc815<\/h4>\n<p>\ub0b4 \uc544\uc774\ud53c\ubd80\ud130\uc758 \ubaa8\ub4e0 \uc778\ubc14\uc6b4\ub4dc \uc561\uc138\uc2a4\ub97c \ud5c8\uc6a9\ud558\ub294 \ubcf4\uc548\uadf8\ub8f9\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc778\uc2a4\ud134\uc2a4\uc5d0 \uc0dd\uc131\ud55c \ubcf4\uc548\uadf8\ub8f9\uc744 \ucd94\uac00\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<h4>\ube44\ubc00\ubc88\ud638 \uc785\ub825<\/h4>\n<p><code>http:\/\/&lt;\uc778\uc2a4\ud134\uc2a4 \ud37c\ube14\ub9ad \uc544\uc774\ud53c&gt;:8080<\/code> \uc5d0 \uc811\uc18d\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798 \uba85\ub839\uc73c\ub85c \ud655\uc778\ub418\ub294 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo cat \/var\/lib\/jenkins\/secrets\/initialAdminPassword<\/code><\/pre>\n<h4>\ub85c\uadf8\uc778 \ud6c4<\/h4>\n<p><code>Install suggested plugins<\/code> \uc744 \ub20c\ub7ec\uc90d\ub2c8\ub2e4.<\/p>\n<p>\uc0c8 \uad00\ub9ac\uc790 \uacc4\uc815\uc744 \uc0dd\uc131\ud558\uace0, \ub514\ud3f4\ud2b8 \uad00\ub9ac\uc790 \uacc4\uc815\uc744 \uc0ad\uc81c\ud574 \uc8fc\ub294\uac8c \uad8c\uc7a5\ub429\ub2c8\ub2e4.<\/p>\n<p><code>Jenkins URL<\/code><\/p>\n<h4>\uc820\ud0a8\uc2a4 \ud50c\ub7ec\uadf8\uc778 \uc124\uce58<\/h4>\n<p><code>\uc820\ud0a8\uc2a4 \uba54\uc778\ud654\uba74<\/code> &gt; <code>Jenkins \uad00\ub9ac<\/code> &gt; <code>\ud50c\ub7ec\uadf8\uc778 \uad00\ub9ac<\/code> \ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Docker Pipeline<\/code>, <code>Amazon ECR<\/code>, <code>GitHub Integration<\/code> \ud50c\ub7ec\uadf8\uc778\uc744 \uc820\ud0a8\uc2a4\uc5d0 \uc124\uce58\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<h3>Nomad Server(Host) \uc124\uce58<\/h3>\n<p><a href=\"https:\/\/tech.kakao.com\/2017\/01\/25\/nomad\/\">\ucc38\uc870<\/a><br \/>\n<a href=\"https:\/\/great-stone.github.io\/hashicorp\/nomad\/Nomad-on-Windows\/\">\ucc38\uc870<\/a><br \/>\n<a href=\"https:\/\/learn.hashicorp.com\/tutorials\/nomad\/get-started-install\">\ucc38\uc870<\/a><\/p>\n<h4>\uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131<\/h4>\n<p><code>Amazon Linux 2 AMI<\/code> \ub85c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uba54\ubaa8\ub9ac\ub97c 1G \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h4>\ubc14\uc774\ub108\ub9ac \uc124\uce58<\/h4>\n<pre><code class=\"language-bash\">wget https:\/\/releases.hashicorp.com\/nomad\/1.1.3\/nomad_1.1.3_linux_amd64.zip\nunzip nomad_1.1.3_linux_amd64.zip\nsudo chown root:root nomad\nsudo chmod 777 nomad\nsudo mv nomad \/usr\/local\/bin\/\n\nnomad -version\nNomad v1.1.3 (8c0c8140997329136971e66e4c2337dfcf932692)<\/code><\/pre>\n<h4>\uc124\uc815\ud30c\uc77c \uc0dd\uc131<\/h4>\n<pre><code class=\"language-bash\">sudo mkdir \/etc\/nomad.d<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo vi \/etc\/nomad.d\/server.hcl\n---------------------------\ndatacenter = &quot;dc1&quot;\ndata_dir   = &quot;\/var\/lib\/nomad\/&quot;\nbind_addr  = &quot;0.0.0.0&quot;\n\nserver {\n  enabled          = true\n  bootstrap_expect = 1\n}\n---------------------------<\/code><\/pre>\n<h4>\uc11c\ube44\uc2a4\uc5d0 \ub4f1\ub85d<\/h4>\n<pre><code class=\"language-bash\">sudo vi \/lib\/systemd\/system\/nomad.service\n---------------------------\n[Unit]\nDescription=Nomad\nDocumentation=https:\/\/nomadproject.io\/docs\/\nWants=network-online.target\nAfter=network-online.target\n\n# When using Nomad with Consul it is not necessary to start Consul first. These\n# lines start Consul before Nomad as an optimization to avoid Nomad logging\n# that Consul is unavailable at startup.\n#Wants=consul.service\n#After=consul.service\n\n[Service]\nExecReload=\/bin\/kill -HUP $MAINPID\nExecStart=\/usr\/local\/bin\/nomad agent -config \/etc\/nomad.d\nKillMode=process\nKillSignal=SIGINT\nLimitNOFILE=65536\nLimitNPROC=infinity\nRestart=on-failure\nRestartSec=2\nStartLimitBurst=3\nStartLimitIntervalSec=10\nTasksMax=infinity\nOOMScoreAdjust=-1000\n\n[Install]\nWantedBy=multi-user.target\n---------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable nomad\nsudo systemctl start nomad\nsudo systemctl status nomad<\/code><\/pre>\n<h3>Nomad Client(Worker) \uc124\uce58<\/h3>\n<h4>\uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131<\/h4>\n<p><code>Amazon Linux 2 AMI<\/code> \ub85c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uba54\ubaa8\ub9ac\ub97c 2G \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h4>\ubc14\uc774\ub108\ub9ac \uc124\uce58<\/h4>\n<pre><code class=\"language-bash\">wget https:\/\/releases.hashicorp.com\/nomad\/1.1.3\/nomad_1.1.3_linux_amd64.zip\nunzip nomad_1.1.3_linux_amd64.zip\nsudo chown root:root nomad\nsudo chmod 777 nomad\nsudo mv nomad \/usr\/local\/bin\/\n\nnomad -version\nNomad v1.1.3 (8c0c8140997329136971e66e4c2337dfcf932692)<\/code><\/pre>\n<p>Docker \ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum install docker -y\ndocker -v\nsudo service docker start\nsudo systemctl enable docker.service<\/code><\/pre>\n<h4>\uc124\uc815\ud30c\uc77c \uc0dd\uc131<\/h4>\n<pre><code class=\"language-bash\">sudo mkdir \/etc\/nomad.d<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo vi \/etc\/nomad.d\/client.hcl\n---------------------------\n# bind_addr = &quot;127.0.0.1&quot;\n\ndatacenter = &quot;dc1&quot;           # \ud074\ub7ec\uc2a4\ud130\uba85\ndata_dir = &quot;\/var\/lib\/nomad\/&quot;\n\nclient {\n    enabled = true\n    servers = [&quot;XXX.XXX.XXX.XXX&quot;]   # \ub178\ub9c8\ub4dc \uc11c\ubc84 \ud504\ub77c\uc774\ube57 \uc544\uc774\ud53c\n}\n---------------------------<\/code><\/pre>\n<h4>\uc11c\ube44\uc2a4\uc5d0 \ub4f1\ub85d<\/h4>\n<p><code>$HOME<\/code> \ubcc0\uc218\ub97c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo vi \/lib\/systemd\/system\/nomad.service\n---------------------------\n[Unit]\nDescription=Nomad\nDocumentation=https:\/\/nomadproject.io\/docs\/\nWants=network-online.target\nAfter=network-online.target\n\n# When using Nomad with Consul it is not necessary to start Consul first. These\n# lines start Consul before Nomad as an optimization to avoid Nomad logging\n# that Consul is unavailable at startup.\n#Wants=consul.service\n#After=consul.service\n\n[Service]\nExecReload=\/bin\/kill -HUP $MAINPID\nExecStart=\/usr\/local\/bin\/nomad agent -config \/etc\/nomad.d\nKillMode=process\nKillSignal=SIGINT\nLimitNOFILE=65536\nLimitNPROC=infinity\nRestart=on-failure\nRestartSec=2\nStartLimitBurst=3\nStartLimitIntervalSec=10\nTasksMax=infinity\nOOMScoreAdjust=-1000\nEnvironment=&quot;HOME=\/root&quot;\n\n[Install]\nWantedBy=multi-user.target\n---------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable nomad\nsudo systemctl start nomad\nsudo systemctl status nomad<\/code><\/pre>\n<h4>\ubcf4\uc548\uadf8\ub8f9 \uc124\uc815<\/h4>\n<pre><code class=\"language-bash\">systemctl status nomad<\/code><\/pre>\n<pre><code class=\"language-text\">Aug 05 05:16:21 ip-172-31-6-247.ap-northeast-2.compute.internal nomad[3351]: 2021-08-05T05:16:21.007Z [ERROR] client: error registering: error=&quot;rpc error: failed to get conn: dial tcp 172.31.14.210:4647: i\/o timeout&quot;<\/code><\/pre>\n<p>\ubc29\ud654\ubcbd\uc774 \uc5f4\ub824\uc788\uc9c0 \uc54a\uc544 \uc811\uc18d\uc5d0 \uc2e4\ud328\ud569\ub2c8\ub2e4.<\/p>\n<p>AWS \ubcf4\uc548\uadf8\ub8f9 <code>allow-nomad<\/code> \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uaddc\uce59\uc740 \ucd94\uac00\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.<\/p>\n<p>AWS \ubcf4\uc548\uadf8\ub8f9 <code>protect-nomad<\/code> \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uc778\ubc14\uc778\ub4dc \uaddc\uce59\uc5d0 <code>allow-nomad<\/code> \ubcf4\uc548\uadf8\ub8f9\uc5d0\uc11c\uc758 \ubaa8\ub4e0 \ud2b8\ub798\ud53d\uc744 \ud5c8\uc6a9\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-01.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-01.png\" alt=\"\" \/><\/a><\/p>\n<p>\uc11c\ubc84\uc5d0\ub294 <code>protect-nomad<\/code> \ub97c, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\ub294 <code>allow-nomad<\/code> \ub97c \ucd94\uac00\ud574\uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart nomad\nsystemctl status nomad<\/code><\/pre>\n<p>\ud074\ub7ec\uc2a4\ud130 \uc811\uc18d\uc5d0 \uc131\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-text\">Aug 05 05:21:41 ip-172-31-6-247.ap-northeast-2.compute.internal nomad[3405]: 2021-08-05T05:21:41.366Z [INFO]  client: node registration complete<\/code><\/pre>\n<h2>Github Public Repo \uc0dd\uc131<\/h2>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2195\">\uc5ec\uae30<\/a> \ub97c \ucc38\uace0\ud558\uc5ec Spring Boot App \uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0dd\uc131\ud55c App \uc744 Github \uc5d0 Public \uc73c\ub85c \ubc30\ud3ec\ud569\ub2c8\ub2e4.<\/p>\n<p>Repo \uba85\uc740 TestPublic \uc73c\ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h2>Github Public Repo \uc5f0\ub3d9<\/h2>\n<h3>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uc0dd\uc131<\/h3>\n<p>\uc820\ud0a8\uc2a4 \uba54\uc778\ud654\uba74\uc5d0\uc11c, New Item \uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.<br \/>\nFreestyle project \ub97c \uc120\ud0dd\ud558\uace0 \uc544\uc774\ud15c\uba85\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc18c\uc2a4 \ucf54\ub4dc \uad00\ub9ac \uc5d0\uc11c Git \uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.<\/p>\n<p>GitHub Repository \uc758 Clone URL \ud56d\ubaa9\uc744 \ubcf5\uc0ac\ud574\uc11c Repositoy URL \uc5d0 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-02.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-02.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-03.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-06-03.png\" alt=\"\" \/><\/a><\/p>\n<p>\ube4c\ub4dc\ub97c \ud574\ubcf4\uba74 \uc18c\uc2a4 \uac00\uc838\uc624\uae30\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \uc791\ub3d9\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>GitHub Webhook \uc124\uc815<\/h3>\n<p>GitHub \uc758 \uc9c0\uc815\ud55c \ube0c\ub79c\uce58\uc5d0 \uc18c\uc2a4\uac00 push \ub418\uba74 webhook \uc73c\ub85c \uc820\ud0a8\uc2a4\uc5d0\uac8c \uc54c\ub824\uc8fc\uc5b4 \ube4c\ub4dc\ub97c \uc720\ubc1c\ud558\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p>Payload URL \uc740 http:\/\/&lt;\uc820\ud0a8\uc2a4 \uc11c\ubc84 \uc544\uc774\ud53c&gt;:8080\/github-webhook\/ \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-05-02.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-05-02.png\" alt=\"\" \/><\/a><\/p>\n<h3>ec2 \ubcf4\uc548\uadf8\ub8f9 \uc124\uc815<\/h3>\n<p>AWS EC2 \ubcf4\uc548\uadf8\ub8f9\uc5d0 \uc778\ubc14\uc6b4\ub4dc \ud5c8\uc6a9\uc5d0 \uc544\ub798 \uc544\uc774\ud53c\ub4e4\uc744 \ucd94\uac00\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-text\">&quot;192.30.252.0\/22&quot;,\n&quot;185.199.108.0\/22&quot;,\n&quot;140.82.112.0\/20&quot;<\/code><\/pre>\n<p>\uc0dd\uc131\ud55c \ubcf4\uc548\uadf8\ub8f9\uc744 \uc820\ud0a8\uc2a4 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ucd94\uac00\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<p>\uc820\ud0a8\uc2a4\uac00 8080 \ud3ec\ud2b8\uc5d0\uc11c \uc2e4\ud589\uc911\uc774\ubbc0\ub85c, 8080 \ud3ec\ud2b8\ub97c \uac1c\ubc29\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-01.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-01.png\" alt=\"\" \/><\/a><\/p>\n<h3>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uc218\uc815<\/h3>\n<p>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uad6c\uc131\uc5d0\uc11c <code>\ube4c\ub4dc\uc720\ubc1c<\/code> \uc5d0 <code>GitHub hook trigger for GITScm polling<\/code> \uc744 \uccb4\ud06c\ud574\uc90d\ub2c8\ub2e4.<\/p>\n<h3>\ud14c\uc2a4\ud2b8\ud558\uae30<\/h3>\n<p>PC \uc5d0\uc11c \uc2a4\ud504\ub9c1 \uc571\uc744 \uc218\uc815\ud558\uace0, github \uc5d0 \ubc30\ud3ec\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc18c\uc2a4 \uac00\uc838\uc624\uae30\uac00 \uc790\ub3d9\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9c0\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Jar \ube4c\ub4dc<\/h2>\n<p>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uad6c\uc131\uc5d0\uc11c <code>Build<\/code> \uc5d0 <code>Invoke Gradle script<\/code> \uc120\ud0dd \ud6c4,<br \/>\n<code>Use Gradle Wrapper<\/code> \ub97c \uc120\ud0dd\ud558\uace0 <code>Make gradlew executable<\/code> \ub97c \uccb4\ud06c\ud569\ub2c8\ub2e4.<\/p>\n<p>PC \uc5d0\uc11c \uc18c\uc2a4 \uc218\uc815 \ud6c4 Push \ub97c \ud558\uba74, \uc820\ud0a8\uc2a4\uc5d0\uc11c \uc18c\uc2a4\uac00 \ube4c\ub4dc\ub418\ub294\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ud30c\uc774\ud504\ub77c\uc778 \ubc29\uc2dd\uc73c\ub85c \uc218\uc815<\/h2>\n<p>\uae30\uc874 \uc820\ud0a8\uc2a4 \uc544\uc774\ud15c\uc744 \uc0ad\uc81c\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0c8 \uc820\ud0a8\uc2a4 \uc544\uc774\ud15c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Freestyle project<\/code> \ub300\uc2e0 <code>Pipeline<\/code> \uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Build Triggers<\/code> \uc5d0\uc11c <code>GitHub hook trigger for GITScm polling<\/code> \ub97c \uccb4\ud06c\ud569\ub2c8\ub2e4.<\/p>\n<p><code>Pipeline script<\/code> \uc5d0 \uc544\ub798 \ub0b4\uc6a9\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-groovy\">node {\n    stage(&quot;Get Source&quot;) {\n        git url: &quot;https:\/\/github.com\/skyer9\/TestPublic&quot;,\n            branch: &quot;master&quot;\n    }\n\n    stage(&quot;Build&quot;) {\n        sh &quot;chmod 700 gradlew&quot;\n        sh &quot;.\/gradlew clean&quot;\n        sh &quot;.\/gradlew bootJar&quot;\n    }\n}<\/code><\/pre>\n<p><code>Build Now<\/code> \ub97c \ud074\ub9ad\ud558\uba74 \ud328\ud0a4\uc9d5\uc774 \uc131\uacf5\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>PC \uc5d0\uc11c \uc18c\uc2a4 \uc218\uc815\ud6c4 Github \uc5d0 \ubc30\ud3ec\ud574\ub3c4 \ud328\ud0a4\uc9d5\uc774 \uc774\ub8e8\uc5b4\uc9c0\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Dockerize<\/h2>\n<p>\ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>PC \uc5d0\uc11c \ud504\ub85c\uc81d\ud2b8\uc5d0 <code>Dockerfile<\/code> \uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-docker\">FROM openjdk:11.0.6-jre\nEXPOSE 8080\nARG JAR_FILE=build\/libs\/*.jar\nCOPY ${JAR_FILE} app.jar\nENTRYPOINT [&quot;java&quot;, &quot;-jar&quot;, &quot;\/app.jar&quot;]<\/code><\/pre>\n<p>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c <code>Pipeline script<\/code> \uc5d0 \uc544\ub798 \ub0b4\uc6a9\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-groovy\">node {\n    stage(&quot;Get Source&quot;) {\n        git url: &quot;https:\/\/github.com\/skyer9\/TestPublic&quot;,\n            branch: &quot;master&quot;\n    }\n\n    stage(&quot;Build&quot;) {\n        sh &quot;chmod 700 gradlew&quot;\n        sh &quot;.\/gradlew clean&quot;\n        sh &quot;.\/gradlew bootJar&quot;\n    }\n\n    stage(&quot;Dockerize&quot;) {\n        sh &quot;docker build -t skyer9\/testpublic:0.1.${build_number} .&quot;\n        sh &quot;docker build -t skyer9\/testpublic:latest .&quot;\n    }\n}<\/code><\/pre>\n<p>PC \uc5d0\uc11c \uc18c\uc2a4\ub97c \uc218\uc815\ud558\uace0 push \ud558\uba74, \uc820\ud0a8\uc2a4 \uc11c\ubc84\uc5d0 \ub3c4\ucee4 \uc774\ubbf8\uc9c0\uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo docker images\nREPOSITORY          TAG          IMAGE ID       CREATED          SIZE\nskyer9\/testpublic   0.1.12       6274d4459b08   23 minutes ago   302MB\nopenjdk             11.0.6-jre   d4db31b4991e   16 months ago    285MB<\/code><\/pre>\n<h2>AWS ECR \uc5d0 Push \ud558\uae30<\/h2>\n<p><a href=\"https:\/\/teichae.tistory.com\/entry\/Jenkins-Pipeline%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-Docker-Image%EB%A5%BC-ECR%EB%A1%9C-Push\">\ucc38\uc870<\/a><\/p>\n<p><a href=\"https:\/\/bluese05.tistory.com\/51\">\ucc38\uc870<\/a><\/p>\n<h3>AWS \uc124\uc815<\/h3>\n<p>AWS ECR \uc744 \uc0dd\uc131\ud558\uc9c0 \uc54a\uc558\uc73c\uba74 \uc0dd\uc131\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<p><code>myrepo<\/code> \ub9ac\ud3ec\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>IAM \uc5d0\uc11c ecr_user \uacc4\uc815\uc744 \uc0dd\uc131\ud558\uace0, <code>AmazonEC2ContainerRegistryFullAccess<\/code> \uad8c\ud55c\uc744 \ubd80\uc5ec\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-04.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-04.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-05.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-05.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-06.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-06.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-07.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-07.png\" alt=\"\" \/><\/a><\/p>\n<h3>\uc820\ud0a8\uc2a4 Credential \ucd94\uac00<\/h3>\n<p><code>\uc820\ud0a8\uc2a4 \uba54\uc778\ud654\uba74<\/code> &gt; <code>Jenkins \uad00\ub9ac<\/code> &gt; <code>Manage Credentials<\/code> \ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<p><code>ecr_user<\/code> \uacc4\uc815\uc744 \uc820\ud0a8\uc2a4 Credential \uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-02.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-02.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-03.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-03.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-04.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-04.png\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-05.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-05.png\" alt=\"\" \/><\/a><\/p>\n<h3>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uc218\uc815<\/h3>\n<p>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c <code>Pipeline script<\/code> \uc5d0 \uc544\ub798 \ub0b4\uc6a9\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-groovy\">node {\n    stage(&quot;Get Source&quot;) {\n        git url: &quot;https:\/\/github.com\/skyer9\/TestPublic&quot;,\n            branch: &quot;master&quot;\n    }\n\n    stage(&quot;Build&quot;) {\n        sh &quot;chmod 700 gradlew&quot;\n        sh &quot;.\/gradlew clean&quot;\n        sh &quot;.\/gradlew bootJar&quot;\n    }\n\n    \/\/ repo \uc5d0 \ud558\ub098\uc758 \uc774\ubbf8\uc9c0\ub9cc \uc62c\ub9ac\uac8c \ub418\uc5b4\uc788\ub098?\n    stage(&quot;Dockerize&quot;) {\n        sh &quot;docker build -t myrepo:0.1.${build_number} .&quot;\n        sh &quot;docker build -t myrepo:latest .&quot;\n    }\n\n    stage(&quot;Push to ECR&quot;) {\n        \/\/ ecr:&lt;Your region&gt;:&lt;Your Jenkins credential ID&gt;\n        \/\/ myrepo : \uc774\ubbf8\uc9c0\uba85\uacfc ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc740 \uc77c\uce58\ud574\uc57c \ud55c\ub2e4.\n        docker.withRegistry(&#039;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com&#039;, &#039;ecr:ap-northeast-2:ecr_user&#039;) {\n            docker.image(&#039;myrepo:latest&#039;).push()\n        }\n    }\n}<\/code><\/pre>\n<h2>Nomad Worker \uc124\uc815 \ubcc0\uacbd<\/h2>\n<p>\uc544\ub798 \ud30c\uc77c\uc744 <code>PATH<\/code> \uc5d0 \ub123\uc2b5\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com\/0.5.0\/linux-amd64\/docker-credential-ecr-login\">docker-credential-ecr-login<\/a><\/p>\n<pre><code class=\"language-bash\">wget https:\/\/amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com\/0.5.0\/linux-amd64\/docker-credential-ecr-login\nsudo chown root:root docker-credential-ecr-login\nsudo chmod 777 docker-credential-ecr-login\nsudo mv docker-credential-ecr-login \/usr\/local\/bin\/<\/code><\/pre>\n<p>ecr_user \uacc4\uc815\uc744 \uc124\uc815\ud569\ub2c8\ub2e4.<br \/>\nnomad \uac00 root \ub85c \uc2e4\ud589\ub418\uace0 \uc788\uc73c\ubbc0\ub85c root \uacc4\uc815\uc5d0 \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo su -\npip3 install --upgrade awscli\n\naws configure\nAWS Access Key ID [None]: AKIA3V24********\nAWS Secret Access Key [None]: vUeBm5VAO7de3********\nDefault region name [None]: ap-northeast-2\nDefault output format [None]:\nexit<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo vi \/etc\/nomad.d\/client.hcl\n---------------------------\n# bind_addr = &quot;127.0.0.1&quot;\n\ndatacenter = &quot;dc1&quot;           # \ud074\ub7ec\uc2a4\ud130\uba85\ndata_dir = &quot;\/var\/lib\/nomad\/&quot;\n\nclient {\n    enabled = true\n    servers = [&quot;XXX.XXX.XXX.XXX&quot;]   # \ub178\ub9c8\ub4dc \uc11c\ubc84 \ud504\ub77c\uc774\ube57 \uc544\uc774\ud53c\n}\n\nplugin &quot;docker&quot; {\n  config {\n    auth {\n      # Nomad will prepend &quot;docker-credential-&quot; to the helper value and call\n      # that script name.\n      helper = &quot;ecr-login&quot;\n    }\n  }\n}\n---------------------------<\/code><\/pre>\n<p>\ub178\ub9c8\ub4dc\ub97c \uc7ac\uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart nomad\nsudo systemctl status nomad<\/code><\/pre>\n<h2>job \uc0dd\uc131<\/h2>\n<p>Nomad Server(Host) \uc5d0 job \uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">vi myjob.nomad<\/code><\/pre>\n<pre><code class=\"language-nomad\">job &quot;website&quot; {\n  datacenters = [&quot;dc1&quot;]\n  type = &quot;service&quot;\n\n  constraint {\n    attribute = &quot;${attr.kernel.name}&quot;\n    value = &quot;linux&quot;\n  }\n\n  # rolling updates\n  update {\n    stagger = &quot;10s&quot;\n    max_parallel = 1\n  }\n\n  group &quot;cache&quot; {\n    # restart policy\n    restart {\n      attempts = 10\n      interval = &quot;5m&quot;\n      mode = &quot;delay&quot;\n    }\n\n    network {\n      port &quot;lb&quot; { static = 8080 }\n    }\n\n    # Define a task to run\n    task &quot;website&quot; {\n      driver = &quot;docker&quot;\n\n      config {\n        image = &quot;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com\/myrepo:latest&quot;\n        ports = [&quot;lb&quot;]\n      }\n\n      resources {\n        cpu = 500         # 500  Mhz\n        memory = 1024     # 1024 MB\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>\uc815\uc0c1\uc801\uc73c\ub85c \uc791\ub3d9\ud558\ub294 \uac83\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo su -\ncd \/home\/ec2-user\nnomad job run myjob.nomad\nexit\n\nnomad job status website<\/code><\/pre>\n<p>\uc815\uc0c1\uc801\uc73c\ub85c \uc791\ub3d9\ud558\uba74, Client \uc11c\ubc84\uc5d0 \uc774\ubbf8\uc9c0\uac00 \ub2e4\uc6b4\ubc1b\uc544\uc9d1\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo docker images\nREPOSITORY                                                 TAG       IMAGE ID       CREATED             SIZE\n********.dkr.ecr.ap-northeast-2.amazonaws.com\/myrepo       latest    cc257084ba9f   About an hour ago   302MB<\/code><\/pre>\n<h2>\uc820\ud0a8\uc2a4\uc5d0\uc11c nomad \uc2e4\ud589<\/h2>\n<pre><code class=\"language-groovy\">import groovy.text.GStringTemplateEngine\nimport groovy.json.*\n\ndef nomadTemplate = &#039;&#039;&#039;\njob &quot;website&quot; {\n  datacenters = [&quot;dc1&quot;]\n  type = &quot;service&quot;\n\n  # rolling updates\n  update {\n    stagger = &quot;10s&quot;\n    max_parallel = 1\n  }\n\n  group &quot;cache&quot; {\n    # restart policy\n    restart {\n      attempts = 10\n      interval = &quot;5m&quot;\n      mode = &quot;delay&quot;\n    }\n\n    network {\n      port &quot;lb&quot; { static = ${port} }\n    }\n\n    # Define a task to run\n    task &quot;website&quot; {\n      driver = &quot;docker&quot;\n\n      config {\n        image = &quot;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com\/myrepo:0.1.${build_number}&quot;\n        ports = [&quot;lb&quot;]\n      }\n\n      resources {\n        cpu = 500         # 500  Mhz\n        memory = 512      # 512 MB\n      }\n    }\n  }\n}\n&#039;&#039;&#039;\n\nnode {\n    stage(&quot;Get Source&quot;) {\n        git url: &quot;https:\/\/github.com\/skyer9\/TestPublic&quot;,\n            branch: &quot;master&quot;\n    }\n\n    stage(&quot;Build&quot;) {\n        sh &quot;chmod 700 gradlew&quot;\n        sh &quot;.\/gradlew bootJar&quot;\n    }\n\n    \/\/ repo \uc5d0 \ud558\ub098\uc758 \uc774\ubbf8\uc9c0\ub9cc \uc62c\ub9ac\uac8c \ub418\uc5b4\uc788\ub098?\n    stage(&quot;Dockerize&quot;) {\n        sh &quot;docker build -t myrepo:0.1.${build_number} .&quot;\n    }\n\n    stage(&quot;Push to ECR&quot;) {\n        \/\/ ecr:&lt;Your region&gt;:&lt;Your Jenkins credential ID&gt;\n        \/\/ myrepo : \uc774\ubbf8\uc9c0\uba85\uacfc ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc740 \uc77c\uce58\ud574\uc57c \ud55c\ub2e4.\n        docker.withRegistry(&#039;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com&#039;, &#039;ecr:ap-northeast-2:ecr_user&#039;) {\n            docker.image(&quot;myrepo:0.1.${build_number}&quot;).push()\n        }\n    }\n\n    stage(&quot;Run Nomad&quot;) {\n        \/\/ Nomad \uc11c\ubc84 \ud504\ub77c\uc774\ube57 \uc544\uc774\ud53c\n        env.NOMAD_ADDR = &quot;http:\/\/XXX.XXX.XXX.XXX:4646&quot;\n\n        def bindMap = [\n            port: &quot;8080&quot;,\n            build_number: &quot;${build_number}&quot;\n        ]\n\n        def javaNomadText = new GStringTemplateEngine().createTemplate(nomadTemplate).make(bindMap).toString()\n        writeFile file: &#039;myjob.nomad&#039;, text: javaNomadText\n        sh &quot;\/usr\/local\/bin\/nomad job run myjob.nomad&quot;\n        sh &quot;rm myjob.nomad&quot;\n    }\n}<\/code><\/pre>\n<p>\uc820\ud0a8\uc2a4 \uc11c\ubc84 \ubcf4\uc548\uadf8\ub8f9\uc5d0 <code>allow-nomad<\/code> \ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p>\ube4c\ub4dc\ub97c \ud574\ubcf4\uba74 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-06.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-07-06.png\" alt=\"\" \/><\/a><\/p>\n<p>\uc704 \ub9c1\ud06c\ub97c \ud074\ub9ad\ud574 \ub4e4\uc5b4\uac00\uc11c <code>Allow<\/code> \ub97c \ub20c\ub7ec\uc90d\ub2c8\ub2e4.<br \/>\n\uc774 \ub2e8\uacc4\ub294 3~4\ud68c \ubc18\ubcf5\ud574\uc11c \ubc1c\uc0dd\ud558\ubbc0\ub85c \ubc18\ubcf5\ud574\uc11c <code>Allow<\/code> \ub97c \ub20c\ub7ec\uc90d\ub2c8\ub2e4.<\/p>\n<p>http:\/\/&lt;\ud074\ub77c\uc774\uc5b8\ud2b8\uc11c\ubc84 \ud37c\ube14\ub9ad \uc544\uc774\ud53c&gt;:8080\/hello \uc5d0 \uc811\uc18d\ud558\uba74,<br \/>\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc571\uc774 \uc2e4\ud589\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>PC \uc5d0\uc11c \uc18c\uc2a4\ub97c \uc218\uc815\ud574\uc11c \ubc30\ud3ec\ud588\uc744 \ub54c,<br \/>\n\ubcc0\uacbd\uc0ac\ud56d\uc774 \ubc18\uc601\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Github Private Repo \uc5f0\ub3d9<\/h2>\n<h3>Github Private Repo \uc0dd\uc131<\/h3>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2195\">\uc5ec\uae30<\/a> \ub97c \ucc38\uace0\ud558\uc5ec Spring Boot App \uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0dd\uc131\ud55c App \uc744 Github \uc5d0 Private \uc73c\ub85c \ubc30\ud3ec\ud569\ub2c8\ub2e4.<\/p>\n<p>Repo \uba85\uc740 TestPrivate \uc73c\ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h3>Jenkins \ud0a4 \uc0dd\uc131<\/h3>\n<p>\uc820\ud0a8\uc2a4 \uc11c\ubc84\uc5d0\uc11c \uc544\ub798 \uba85\ub839\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo su -s \/bin\/bash jenkins\nwhoami\n\nmkdir \/var\/lib\/jenkins\/.ssh\ncd \/var\/lib\/jenkins\/.ssh\nssh-keygen -t rsa -b 4096 -C &quot;skyer9@gmail.com&quot; -f \/var\/lib\/jenkins\/.ssh\/github<\/code><\/pre>\n<pre><code class=\"language-bash\">cat \/var\/lib\/jenkins\/.ssh\/github.pub<\/code><\/pre>\n<p>\uc704\uc5d0\uc11c \ud655\uc778\ub41c \uacf5\uac1c\ud0a4\ub97c \uc544\ub798\uc640 \uac19\uc774 Github \uc5d0 \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-01.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-01.png\" alt=\"\" \/><\/a><\/p>\n<h3>\uc820\ud0a8\uc2a4 \ud0a4 \ub4f1\ub85d<\/h3>\n<pre><code class=\"language-bash\">cat \/var\/lib\/jenkins\/.ssh\/github<\/code><\/pre>\n<p>\uc704\uc5d0\uc11c \ud655\uc778\ub418\ub294 \ube44\ubc00\ud0a4\ub97c \uc820\ud0a8\uc2a4\uc5d0 \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-02.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-02.png\" alt=\"\" \/><\/a><\/p>\n<h3>Github Webhook \uc124\uc815<\/h3>\n<p>Payload URL \ub294 http:\/\/&lt;\uc820\ud0a8\uc2a4 \ud37c\ube14\ub9ad \uc544\uc774\ud53c&gt;:8080\/github-webhook\/ \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c \uc0dd\uc131<\/h3>\n<p>AWS ECR \uc5d0\uc11c <code>myrepoprivate<\/code> \ub9ac\ud3ec\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc820\ud0a8\uc2a4 \uc544\uc774\ud15c\uc744 pipeline \uc73c\ub85c \uc0dd\uc131\ud558\uace0 \uc544\ub798 script \ub97c \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<p>\uae43\ud5c8\ube0c URL \uc774 ssh \ub85c \ubcc0\uacbd\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-groovy\">    stage(&quot;Get Source&quot;) {\n        git url: &quot;git@github.com:skyer9\/TestPrivate.git&quot;,\n            branch: &quot;master&quot;,\n            credentialsId: &quot;my_jenkins_token&quot;\n    }<\/code><\/pre>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-03.png\"><img decoding=\"async\" src=\"https:\/\/www.skyer9.pe.kr\/wordpress\/wp-content\/uploads\/2021\/08\/2021-08-08-03.png\" alt=\"\" \/><\/a><\/p>\n<pre><code class=\"language-groovy\">import groovy.text.GStringTemplateEngine\nimport groovy.json.*\n\ndef nomadTemplate = &#039;&#039;&#039;\njob &quot;website&quot; {\n  datacenters = [&quot;dc1&quot;]\n  type = &quot;service&quot;\n\n  # rolling updates\n  update {\n    stagger = &quot;10s&quot;\n    max_parallel = 1\n  }\n\n  group &quot;cache&quot; {\n    # restart policy\n    restart {\n      attempts = 10\n      interval = &quot;5m&quot;\n      mode = &quot;delay&quot;\n    }\n\n    network {\n      port &quot;lb&quot; { static = ${port} }\n    }\n\n    # Define a task to run\n    task &quot;website&quot; {\n      driver = &quot;docker&quot;\n      # user = &quot;nobody&quot;\n\n      config {\n        image = &quot;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com\/myrepoprivate:0.1.${build_number}&quot;\n        ports = [&quot;lb&quot;]\n      }\n\n      resources {\n        cpu = 500         # 500  Mhz\n        memory = 512      # 512 MB\n      }\n    }\n  }\n}\n&#039;&#039;&#039;\n\nnode {\n    stage(&quot;Get Source&quot;) {\n        git url: &quot;git@github.com:skyer9\/TestPrivate.git&quot;,\n            branch: &quot;master&quot;,\n            credentialsId: &quot;my_jenkins_token&quot;\n    }\n\n    stage(&quot;Build&quot;) {\n        sh &quot;chmod 700 gradlew&quot;\n        sh &quot;.\/gradlew clean&quot;\n        sh &quot;.\/gradlew bootJar&quot;\n    }\n\n    \/\/ repo \uc5d0 \ud558\ub098\uc758 \uc774\ubbf8\uc9c0\ub9cc \uc62c\ub9ac\uac8c \ub418\uc5b4\uc788\ub098?\n    stage(&quot;Dockerize&quot;) {\n        sh &quot;docker build -t myrepoprivate:0.1.${build_number} .&quot;\n    }\n\n    stage(&quot;Push to ECR&quot;) {\n        \/\/ ecr:&lt;Your region&gt;:&lt;Your Jenkins credential ID&gt;\n        \/\/ myrepo : \uc774\ubbf8\uc9c0\uba85\uacfc ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc740 \uc77c\uce58\ud574\uc57c \ud55c\ub2e4.\n        docker.withRegistry(&#039;https:\/\/********.dkr.ecr.ap-northeast-2.amazonaws.com&#039;, &#039;ecr:ap-northeast-2:ecr_user&#039;) {\n            docker.image(&quot;myrepoprivate:0.1.${build_number}&quot;).push()\n        }\n    }\n\n    stage(&quot;Run Nomad&quot;) {\n        \/\/ Nomad \uc11c\ubc84 \ud504\ub77c\uc774\ube57 \uc544\uc774\ud53c\n        env.NOMAD_ADDR = &quot;http:\/\/172.31.8.155:4646&quot;\n\n        def bindMap = [\n            port: &quot;8080&quot;,\n            build_number: &quot;${build_number}&quot;\n        ]\n\n        def javaNomadText = new GStringTemplateEngine().createTemplate(nomadTemplate).make(bindMap).toString()\n        writeFile file: &#039;myjob.nomad&#039;, text: javaNomadText\n        sh &quot;\/usr\/local\/bin\/nomad job run myjob.nomad&quot;\n        sh &quot;rm myjob.nomad&quot;\n    }\n}<\/code><\/pre>\n<h2>TODO<\/h2>\n<p>\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc571\uc774 root \ub85c \uc2e4\ud589\ub418\uace0 \uc788\ub2e4.<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ub178\ub4dc\uac00 \uc5ec\ub7ec \ub300 \uc778 \uacbd\uc6b0 \ub85c\ub4dc\ubc38\ub7f0\uc2f1\uc740 \uc5b4\ub5bb\uac8c \ud560\uae4c?<\/p>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2735\">\ub2f5\ubcc0<\/a><\/p>\n<p>\uc11c\ubc84 \ub178\ub4dc\uac00 \uc5ec\ub7ec\ub300\uc774\uba74?<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ub178\ub4dc\uc758 \uc2a4\ucf00\uc77c out\/in \uc740?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jenkins Github Nomad \ub97c \uc774\uc6a9\ud55c CI\/CD \uc2dc\uc2a4\ud15c \uad6c\ucd95 nomad \ub780? \ucc38\uc870 \ubaa9\ud45c \uac1c\ubc1c\uc790\uac00 Github \uc5d0 \uc18c\uc2a4\ub97c Push \ud558\uba74, Webhook \uc744 \uc774\uc6a9\ud574 Jenkins \uc5d0 \ub178\ud2f0\ud569\ub2c8\ub2e4. Jenkins \uac00 \uc18c\uc2a4\ub97c \uac00\uc838\uc640 \ucef4\ud30c\uc77c\/\ud328\ud0a4\uc9d5\/Dockerize \ud574\uc11c, AWS ECR \uc5d0 \ubc30\ud3ec\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0, Nomad Server(Host) \uc5d0 \uc18c\uc2a4\uac00 \ubc14\ub00c\uc5c8\uc74c\uc744 \ub178\ud2f0\ud569\ub2c8\ub2e4. Client(Worker) \ub294 \uc8fc\uae30\uc801\uc73c\ub85c Nomad Server(Host) \uc5d0 \uc811\uc18d\ud574\uc11c, \uc0c8\ub85c\uc6b4 \uc774\ubbf8\uc9c0\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0, \uc0c8\ub85c\uc6b4 \uc774\ubbf8\uc9c0\uac00 \uc788\uc73c\uba74\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2546\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-2546","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2546"}],"version-history":[{"count":131,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2546\/revisions"}],"predecessor-version":[{"id":3414,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2546\/revisions\/3414"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}