๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“š ์‹œ๋ฆฌ์ฆˆ/- Jenkins์™€ Webhook์„ ์ด์šฉํ•œ CICD

[Webhook์„ ์ด์šฉํ•˜์—ฌ CI CD ๊ตฌ์„ฑํ•˜๊ธฐ] - ์›นํ›… ์„ค์ •ํ•˜๊ธฐ

by Wonit 2021. 8. 31.

ํ•ด๋‹น ๊ธ€์€ Jenkins์™€ Github Webhook์„ ์ด์šฉํ•œ CICD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑํ•˜๊ธฐ ์‹œ๋ฆฌ์ฆˆ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

๋งŒ์•ฝ ํ•ด๋‹น ์‹ค์Šต ๋‚ด์šฉ์˜ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๊นƒํ—ˆ๋ธŒ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

GitHub - my-research/todo-with-cicd: Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CICD Pipeline ์ด ๊ตฌ์„ฑ๋œ TodoList

Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CICD Pipeline ์ด ๊ตฌ์„ฑ๋œ TodoList. Contribute to my-research/todo-with-cicd development by creating an account on GitHub.

github.com

 

 

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ 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 ํ•œ๋‹ค๋ฉด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ํŠน์ • ๋กœ์ง์— ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์œ„์˜ ๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ์˜ ์‹ค์Šต ํ™˜๊ฒฝ๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด์ง€๋งŒ ๋Œ€์ถฉ ํ๋ฆ„์€ ์œ„์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

 

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ Code Commit ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  2. Github Webhook์ด Trigger ๋œ๋‹ค
  3. Github Webhook์ด POST๋กœ Jenkins ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค.
  4. 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 ๋˜์—ˆ๋‹ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค

 

๋Œ“๊ธ€