ํด๋น ๊ธ์ Jenkins์ Github Webhook์ ์ด์ฉํ CICD ํ์ดํ๋ผ์ธ ๊ตฌ์ฑํ๊ธฐ ์๋ฆฌ์ฆ ์ ๋๋ค. ์์ธํ ์ฌํญ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๋ง์ฝ ํด๋น ์ค์ต ๋ด์ฉ์ ์ฝ๋๊ฐ ๊ถ๊ธํ๋ค๋ฉด ํ๋ก์ ํธ ๊นํ๋ธ ์์ ํ์ธํ ์ ์์ต๋๋ค.
- 1ํธ ์๋ฆฌ์ฆ๋ฅผ ์์ํ๋ฉฐ :: ์ปจํ ์ธ ๊ฐ์์ ๋๊ธฐ
- 2ํธ ํ๋ก ํธ์๋ ๊ฐ๋ฐํ๊ธฐ :: ๋ฆฌ์กํธ์ axios
- 3ํธ ๋ฐฑ์๋ ๊ฐ๋ฐํ๊ธฐ :: SpringBoot ์ h2
- 4ํธ ec2 ์์ฑ ๋ฐ Jenkins ์ค์น :: AWS EC2๋ก Jenkins ์๋ฒ ๋ง๋ค๊ธฐ
- 5ํธ Dockerizing ๋ฐ Nginx ์ค์ :: ๋ฐฐํฌ๋ฅผ ์ํ ๋์ปค ๋น๋์ Nginx์ ๋ฆฌ๋ฒ์ค ํ๋ก์
- 6ํธ ์นํ ์ค์ ํ๊ธฐ :: Github Webhook ์ฐ๋ํ๊ธฐ
- 7ํธ pipeline์ผ๋ก ๋ฐฐํฌํ๊ธฐ :: Jenkins Pipeline Script ์์ฑํ๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Jenkins ์ค์ ์ ํ๊ณ Github ์ Webhook ๊ณผ ์ฐ๋ํ ๊ฒ์ด๋ค.
์์
- ์น ํ ์ด๋?
- jenkins ๋ฆฌ๋
์ค ๊ณ์ ์ค์
- jenkins ์ฌ์ฉ์ ๋ณ๊ฒฝ
- ๋์ปค ๊ถํ ์ค์
- Jenkins Credential ์ค์
- ssh-keygen ์ ์ด์ฉํ RSA ํค ์์ฑ
- github repository ์์ฑ
- deploy keys setting
- Jenkins Credential ์ถ๊ฐ
- ์ ํจ์ค Integration ์ค์
- github webhook setting
- jenkins ์์ github integration ์ค์น
- Github ์นํ ์ค์ ํ๊ธฐ
- Jenkins ์นํ ์ค์
- ํ ์คํธ
1. ์นํ (Webhook) ์ด๋?
์น ํ , Webhook ์ ๊ฐ๋จํ ๋ง ํ์๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ Event Handler ์ด๋ค.
์นํ ์ ์ ๊ณตํ๋ ํน์ ์๋ํฌ์ธํธ์์ ์นํ ์ Trigger ํ๋ค๋ฉด ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ํน์ ๋ก์ง์ ๋ฐ๋ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
์์ ๊ทธ๋ฆผ์ ์ฐ๋ฆฌ์ ์ค์ต ํ๊ฒฝ๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด์ง๋ง ๋์ถฉ ํ๋ฆ์ ์์ ๊ฐ์ ๊ฒ์ด๋ค.
- ๊ฐ๋ฐ์๊ฐ Code Commit ์ ์ํํ๋ค.
- Github Webhook์ด Trigger ๋๋ค
- Github Webhook์ด POST๋ก Jenkins ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค.
- Jenkins๊ฐ ๋ค์ Action์ ์ทจํ๋ค.
์น ํ ์ Jenkins ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๋ถ์ผ์์ ์ฌ์ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ Dockerhub๋ฅผ ์ฌ์ฉํ ๋ Webhook ์ ์ด์ฉํ๋ค๋ฉด Slack ์ผ๋ก Message๋ฅผ ๋ณด๋ด๊ฒ ํ ์ ์๊ณ ๋ฉ์ผ ์๋น์ค์๋ ์ฐ๋ํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก ์นํ ์ ์ด์ฉํ ๊ฒ์ด๋ค.
์ด์ Jenkins ์ Github ์ฐ๊ฒฐ์ ์ํ ์ธํ ์ ํด๋ณด๋๋ก ํ์.
2. Jenkins ๋ฆฌ๋ ์ค ๊ณ์ ์ค์ ๋ฐ ๊ถํ ์ค์
์ฐ๋ฆฌ๊ฐ ์์ ์ ํ๊ณ jenkins ๊ฐ ํด๋น ์์คํ ๋ด๋ถ์์ deploy๋ฅผ ํ ์ ์๋๋ก ๊ณ์ ์ค์ ์ ํด์ค์ผ ํ๋ค.
ํ๋ ๊น์ docker ๊ถํ ๊ทธ๋ฃน ์ค์ ๋ ํจ๊ป ํด์ฃผ์
$ sudo usermod -aG docker jenkins
$ sudo su -s /bin/bash jenkins
3. Jenkins Credential ์ค์
ssh-keygen ์ ์ด์ฉํด์ webhook ๊ณผ ์ฐ๊ฒฐํ ssh ํค๋ฅผ ์์ฑํ๋๋ก ํ์
$ mkdir /var/lib/jenkins/.ssh
$ ssh-keygen -t rsa -b 4096 -C "wh-key" -f /var/lib/jenkins/.ssh/jenkins-github-wh
๊ทธ๋ผ passphrase ๊ฐ ์์ํ ๋ฐ ์ผ๋จ์ ๋น์ฐ๊ณ ๋์ด๊ฐ์.
๊ทธ๋ผ ssh ํค๊ฐ ์ ์์ฑ๋๋ ๊ฒ์ ์ ์ ์๋ค.
์ด์ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ์ ์ฅ๋ Github ์ผ๋ก ๊ฐ์ Setting ์์ Deploy keys๋ฅผ ์ถ๊ฐํ์
์์ ๊ฐ์ด ์ด๋ฆ์ ์ค์ ํด์ฃผ๊ณ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋๋ฐ, ๋น๋ฐ๋ฒํธ๋ ์๊น ๋ง๋ public ํค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋จผ์ cat ๋ช ๋ ์ด๋ก ์ฐ๋ฆฌ๊ฐ ์์ฑํ key ํ์ผ์ ํ์ธํด๋ณด๋ฉด,
$ cat /var/lib/jenkins/.ssh/jenking-github-wh.pub
> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD2YeOTOf/WeAZwHDZHq4wFobawCdbZahkhlqz9mUzsukf9dQnSik+Nwxm2S25cASg3eowRCLOttyvMIfoFocP3466LGzaPF0vrfPpIiYLJknr/keSM01gR1WSAHd1yrXNf8DShE2x3o9rWfi/e8hqTtt5UM5IyZQESM7xT36bI/junQPeovVzul9+sf2nnNvXN/bKLthmsOiya8aLcaLAecOeXjjBlA/N4rSO4pd7fBOR2EKyx9LWV+AovsAnBPMj/d9+pgRGW3fmDAjwzG39obHpybTAh+FHKpI+Gi4Hj6nPc5O0Iq33zsc6vKaBg6fMaB5V9IXGmFf3JAF2cOXpNIcP06yJmaMfxmfSBB/7OUv61VWo8wEmn/CiOhIUCU0PgWz2586asu3enKz+g+HY5oNySFIDcLp1E4nyykf7oISjh8+FSQNQs0K3nm5OzVG49rWyN3DJXaA79PUwqAm82s/MjsABftXt+q53Ch7IUS/HUEYIOEK922qvykCpAO0bSfdXvfJ1INMuiC6f4Zhg1qUU1AdYcJJDZnWa0p+SPlcDyz1qWVK+uZpHJKSRZH7rewBH2NPNQzS+a8+EWBwolmolCT6rqnN0BpAX7isx0HJIf76xiiL36RutWfKmxa14J2RESbmfqAO67q1qto3j6CnyNpk/XOI1kjEuRnnQaJw== wh-key
๊ณผ ๊ฐ์ด ํํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ชจ๋ ๋ค ๋ณต์ฌํด์ github์ ์ถ๊ฐํด์ฃผ์
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด Deploy Keys ๊ฐ ์์ฑ๋๋ค!
์ด์ Credentials ๋ฅผ ์ค์ ํด๋ณด์!
Jenkins ์น ๋์๋ณด๋๋ก ์ด๋ํ ๋ค, Jenkins ๊ด๋ฆฌ ํญ์์ Manage Credentials๋ฅผ ํด๋ฆญํด๋ณด์
add key๋ฅผ ํด๋ฆญํ๊ณ Kind๋ฅผ SSH Username with private key๋ก ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Scope๋ฅผ Global์ Jenkins Node๋ก ์ค์ ํ ๋ค, Username ์ ์๊น ๋ง๋ค์ด์ค RSA Key์ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ค์ ํ์
RSA ํค๋ Private Key ๋ฅผ ์ ๋ ฅํด์ผ ํ๋๋ฐ,
$ cat /var/lib/jenkins/.ssh/jenking-github-wh
๋ฅผ ์น๋ฉด ํค๊ฐ ๋์ค๊ฒ ๋๋ ๋ณต์ฌํด์ ์ฌ์ฉํ์!
์ฐธ๊ณ ๋ก ====== ์ด๋ฐ ๋ฌธ์๋ ์น ๋ณต์ฌํด์ผ ํ๋ค
4. ์ ํจ์ค Integration ์ค์
์ด์ Credential ์ค์ ๋ ๋๋ฌ์ผ๋ Jenkins ๋ก CI ๊ตฌ์ฑ์ ํด๋ณด์
๋์๋ณด๋์์ New Item ์ ํด๋ฆญํ๊ณ ๋ค์๊ณผ ๊ฐ์ด Freestyle Project๋ก ์๋ก์ด Item์ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ๋์ ์ํ ์ฌ๋ฌ ์ค์ ์ ๋ณด, Github ํ๋ก์ ํธ๊ฐ ์๋ URL ์ด ํ์ํ๊ธฐ๋ ํ๊ณ ์ฝ๋ ๊ด๋ฆฌ๋ฅผ ์ํ Github Repository์ SSH ์ฃผ์ ๋ฐ Jenkins ์ Credentials ๊ฐ ํ์ํ๋ค.
์์ ๊ฐ์ด ์ ๋ง๊ฒ ์์ฑํด์ฃผ๋ฉด Jenkins๊ฐ ์์ค ์ฝ๋๋ฅผ Build ํ ์ ์์ด์ผ ํ๋ค.
๊ทธ๋์ Build Now ๋ฅผ ํด๋ฆญํด์ฃผ๊ณ Build History ์์ ์ฑ๊ณต์ ์ผ๋ก Build๊ฐ ๋๋ค๋ฉด ๋ค์ ์คํ ์ผ๋ก ๋์ด๊ฐ์
5. Github ์นํ ์ค์ ํ๊ธฐ
์ด์ Github Webhook ์ด Trigger ๋๋ฉด ์๋์ผ๋ก Jenkins๊ฐ Build๋ฅผ ์ํํ ์ ์๋๋ก Github Webhooks ๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค.
๋ค์ Github๋ก ๊ฐ์ Setting -> Webhooks -> Add webhook ์ ํด๋ฆญํด์ฃผ์
๊ทธ๋ผ ์๋์ ๊ฐ์ด Webhooks์ด ๋ฐ๋๋ Target URL ์ ๋ช ์ํ ์ ์๊ณ , ์ด๋ค ์ด๋ฒคํธ์ ์นํ ์ ๋ฐ๋์ํฌ ๊ฒ์ธ์ง ์ค์ ํ ์ ์๋ค.
Payload URL ์ Github Webhook ์ด ๋ฐ๋๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ URL์ ์๋ฏธํ๋๋ฐ, ์ฐ๋ฆฌ์ Jenkins์ Integration ์ผ๋ก ๊ฐ์ผํ๋ค.
URL์ ์์ ๊ฐ์ด EC2 ์ธ์คํด์ค์ 9999 ํฌํธ๋ก ์ค์ ํ๊ณ /github-webhook/
์ ์ถ๊ฐํด์ฃผ์.
๊ทธ๋ฆฌ๊ณ push ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋๋ก ํ์ฌ ์นํ ์ ์ถ๊ฐํ๋ค.
ํ์ฌ๋ Github์ ์นํ ์ด ์ถ๊ฐ๋์์ง๋ง Jenkins ์์ Webhook์ ๋ฐ์์ค ์ค๋น๊ฐ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ถ์ด ๋ค์ด์ค์ง ์๊ฒ ๋๋ค.
Jenkins ์์ ์น ํ ์ ์ค์ ํด์ค์ผ์ง๋ง ์ ๋๋ก ๋์ํ๊ฒ ๋๋ ๋ค์ ์คํ ์ผ๋ก ๋์ด๊ฐ์
6. Jenkins ์นํ ์ค์
๋ค์ Jenkins ๋์๋ณด๋๋ก ๋์๊ฐ์ Jenkins -> Dashboard -> Jenkins ๊ด๋ฆฌ -> ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ -> ์ค์น๊ฐ๋ฅ ์ผ๋ก ์ด๋ํ ํ github integration ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๊ณ ์ฌ์คํ ์์ผ์ฃผ์
๊ทธ๋ผ ์๊น๋ ๊บผ์ ธ ์๋ Webhooks๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋์์์ ์๋ ค์ฃผ๋ ์ฒดํฌ๊ฐ ์๊ธฐ๊ฒ ๋๋ค
๋ง์ฝ 403 ์๋ฌ๊ฐ ๋๋ค๋ฉด URL์ ์ ํ์ธํ์ http://[jenkins]:[port]/github-webhook/
์์ /
๋ง์ง๋ง ์ฌ๋์ฌ๊ฐ ์๋ค๋ฉด ๋์ํ์ง ์๋๋ค๋ ์ด์ผ๊ธฐ๋ ์์ด์ /
๋ฅผ ์ ๋งํ๋ฉด ์ถ๊ฐํด์ฃผ๊ณ redelivery ๋ฅผ ํด์ฃผ์
7. ํ ์คํธ
์ฌ๊ธฐ๊น์ง ์ฐ๋ฆฌ๋ Continouse Integration ์ ์ค์ ํ ๊ฒ์ด๋ค.
์ด ์ค์ ์ด ์ ๋์๋์ง๋ฅผ ํ์ธํ๊ธฐ ํ๋ ค๋ฉด,
Github์ Code Push๋ฅผ ํ๊ณ , Jenkins์์ ํด๋น ๋ณ๊ฒฝ์ฌํญ์ ์ ๋ฐ์์ค๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ค
์ฐ๋ฆฌ์ ๋ก์ปฌ git ์ ์ฅ์๋ก ์์น๋ฅผ ์ด๋ํ ๋ค, README.md ์ ์๋ฌด ๋ด์ฉ์ ์ถ๊ฐํ์
๊ทธ๋ฆฌ๊ณ ๋ค์ Jenkins ๋์๋ณด๋๋ก ๋ค์ด๊ฐ์ ๋ฐ๋ ๋ณ๊ฒฝ์ ์ด Build ๋์๋ค๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒ์ด๋ค
๋๊ธ