Jenkins ๋น„์ •์ƒ ์ข…๋ฃŒ ์‹œ ์ž๋™ ์‹œ์ž‘ํ•˜๋Š” systemd ์„œ๋น„์Šค ํŒŒ์ผ

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

  • NHN Cloud
  • Ubuntu 20.04 LTS
  • Docker 23.0.3
  • Jenkins 2.399
  • Python 3.9

 

์ƒํ™ฉ

Jenkins๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, Jenkins๊ฐ€ ์ž๋™ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • sudo systemctl enable jenkins ๋ช…๋ น์–ด ์‹คํ–‰
    • Failed to enable unit: Unit file jenkins.service does not exist.์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • Jenkins Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™ ์‹œ์ž‘ํ•˜๋Š” systemd ์„œ๋น„์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ ์šฉํ•ด์ค๋‹ˆ๋‹ค.
  1. /usr/lib/systemd/system ๋””๋ ‰ํ† ๋ฆฌ์— jenkins.serviceํŒŒ์ผ ์ƒ์„ฑ
sudo vi /usr/lib/systemd/system/jenkins.service

 

2. ํŒŒ์ผ ๋‚ด์šฉ ์ž‘์„ฑ

[Unit]
Description=Jenkins container
Requires=docker.service
After=docker.service

[Service]
Restart=on-failure
Group=docker
ExecStart=/usr/bin/docker start -a jenkins
ExecStop=/usr/bin/docker stop -t 2 jenkins

[Install]
WantedBy=multi-user.target

Jenkins Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•  ์ƒˆ systemd ์„œ๋น„์Šค์ธ jenkins๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

์„œ๋น„์Šค ํŒŒ์ผ์—๋Š” ์„ธ ๊ฐœ์˜ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • [Unit]: ์„œ๋น„์Šค๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Docker ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • [Service] :
    • Restart=on-failure : ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์ค‘์ง€๋˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘๋˜์–ด์•ผํ•จ์„ ์ง€์ •
      • ์„œ๋น„์Šค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ์—๋งŒ ๋™์ž‘ํ•จ. ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ์ด๋ฒคํŠธ๋กœ์„œ ์„œ๋น„์Šค ์ž์ฒด์˜ ์ข…๋ฃŒ์™€๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋  ๋•Œ๋Š” systemd๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ. -> ๋ฐ๋ชฌ ๊ฐ์‹œ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ๋ก์ด ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋จ
    • Group : irteam, irteamsu, root ์‚ฌ์šฉ์ž ๋ชจ๋‘ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก Group ์„ค์ •
    • ExecStart : Jenkins ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ช…๋ น์„ ์ง€์ •
    • ExecStop : Jenkins ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๋ช…๋ น์„ ์ง€์ •
  • [Install]: ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ์ด ๊ฒฝ์šฐ multi-user.target ๋ ˆ๋ฒจ์—์„œ ์‹œ์ž‘๋จ์„ ์ง€์ •

 

3. ์ƒˆ ์„œ๋น„์Šค ํŒŒ์ผ์„ ์ธ์‹ํ•˜๋„๋ก systemd ๋ฐ๋ชฌ์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

sudo systemctl daemon-reload

์„œ๋น„์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ธ์‹ํ•˜๋„๋ก systemd ๋ฐ๋ชฌ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

4. Jenkins ์„œ๋น„์Šค๋ฅผ ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹œ์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

sudo systemctl enable jenkins

 

๊ฒฐ๊ณผ

  1. Jenkins ๋น„์ •์ƒ ์ข…๋ฃŒ ์‹œ Jenkins ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ
  • SIGABRT ๋กœ ๋น„์ •์ƒ ์ข…๋ฃŒ ๋จ

 

  • ์ž๋™ ์žฌ์‹คํ–‰ ๋จ

 

  • ๋กœ๊ทธ

 

2. ํ˜ธ์ŠคํŠธ ๋จธ์‹  ๋น„์ •์ƒ ์ข…๋ฃŒ(reboot) ์‹œ Jenkins ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ

  • systemctl enable ๋ช…๋ น์–ด๋กœ reboot ๊ฐ€๋Šฅ ํ™•์ธ!

 

systemd ์„œ๋น„์Šค ํŒŒ์ผ ์„ค์ •

[Service]

Restart=[no|on-success|on-failure|on-watchdog|on-abort|always]

  • ํ•ด๋‹น ์œ ๋‹›์ด ์ฃฝ์—ˆ์„ ๋•Œ๋‚˜ ํ˜น์€ WatchdogSec๋งŒํผ์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์‘๋‹ต์ด ์—†๋Š” ๊ฒฝ์šฐ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • no (๊ธฐ๋ณธ๊ฐ’) : ์œ ๋‹›์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • on-success: ์œ ๋‹›์ด ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ ๋˜์—ˆ์„ ๋•Œ๋งŒ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
    • ์ข…๋ฃŒ ์‹œ '0' ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์—ฌ ์ข…๋ฃŒ ๋˜์—ˆ๊ฑฐ๋‚˜ SIGHUP, SIGINT, SIGTERM, SIGPIPE ๋“ฑ๊ณผ ๊ฐ™์€ ์‹œ๊ทธ๋„ ๋˜๋Š” SuccessExitStatus ์„ค์ •์—์„œ ์ง€์ •๋œ ๋ฆฌํ„ด ์ฝ”๋“œ ๋ชฉ๋ก์— ๋”ฐ๋ฅธ ์‹œ๊ทธ๋„์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ ์„ฑ๊ณต์œผ๋กœ ์ธ์‹ํ•ด ์žฌ์‹œ์ž‘ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • on-failure : ์œ ๋‹›์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ ๋˜์—ˆ์„ ๋•Œ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
    • ๋ฆฌํ„ด๊ฐ’์ด '0' ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, core dump ์™€ ๊ฐ™์ด ๋น„์ •์ƒ์ ์ธ ์‹œ๊ทธ๋„์„ ๋ฐ›๊ณ  ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ, ํƒ€์ž„ ์•„์›ƒ๊ฐ’ ๋‚ด ์‘๋‹ต์ด ์—†๋Š” ๊ฒฝ์šฐ ๋“ฑ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • on-watchdog : WatchdogSec ์— ์„ค์ •๋œ ์‹œ๊ฐ„ ๋‚ด ์‘๋‹ต์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • on-abort : ์ง€์ •๋˜์ง€ ์•Š์€ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›์€ ๊ฒฝ์šฐ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • always : ์ข…๋ฃŒ ์ƒํƒœ ๋“ฑ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ฌด์กฐ๊ฑด ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘์ง€ํ•ด๋„ ์‹œ์Šคํ…œ์ด ๋‹ค์‹œ ๋„์›Œ์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ์„ค์ •๋œ ์œ ๋‹› ์ค‘์ง€ ์‹œ ์ฃผ์˜ ํ•„์š”

์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๊ด€๋ จ Limit ์„ค์ •

  • sudo systemctl show jenkins | grep ^Limit : ๋ฆฌ์†Œ์Šค๋ณ„ ์„ค์ •๋œ Limit ๊ฐ’ ๋ชฉ๋ก ์กฐํšŒ

 

  • LimitAS
    • ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
    • infinity : ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ๋งŒํผ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜์ง€ ์•Š์Œ
  • LimitRSS
    • ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
    • infinity : ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ๋งŒํผ์˜ RAM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜์ง€ ์•Š์Œ
  • LimitCORE
    • ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์„œ๋น„์Šค์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”์–ด ๋คํ”„ ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ
    • infinity : ์ฝ”์–ด ๋คํ”„ ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œํ•˜์ง€ ์•Š์Œ
  • LimitNOFILE
    • ์„œ๋น„์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์—ด๋ฆฐ ํŒŒ์ผ(ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ)์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜
    • 1048576 : ์ตœ๋Œ€ 1048576๊ฐœ์˜ ์—ด๋ฆฐ ํŒŒ์ผ์„ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

 

์ตœ๋Œ€ ์˜คํ”ˆ ํŒŒ์ผ ์ˆ˜ ์„ค์ •

  • ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ํŒŒ์ผ
  • ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ ์ž์›์„ ๋…์ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ž์› ํ• ๋‹น์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
/etc/security/limits.conf

 

  • <domain> : ์ œํ•œ์ด ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ์ง€์ •
    • @๊ทธ๋ฃน๋ช…
    • ์‚ฌ์šฉ์ž๋ช…
    • * : ๋ชจ๋“  ์‚ฌ์šฉ์ž
  • <type> : ์ œํ•œ์˜ ์œ ํ˜• ์ง€์ •
    • soft : ์ผ์‹œ์ ์œผ๋กœ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ์ œํ•œ ๊ฐ’
    • hard : ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€ ๊ฐ’
  • <item> : ์ œํ•œ๋˜๋Š” ์ž์› ์ง€์ •
    • core : ์ฝ”์–ด ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ
    • data : ์ตœ๋Œ€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
    • fsize : ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ
    • memlock : ์ตœ๋Œ€ ์ž ๊ธด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„(๋ฌผ๋ฆฌ์  RAM์— ์ž ๊ธด ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘, ๋””์Šคํฌ๋กœ ์Šค์™‘๋˜์ง€ ์•Š๊ณ  ๋น ๋ฅธ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ)
    • nofile : ์ตœ๋Œ€ ๊ฐœ๋ฐฉ ํŒŒ์ผ ์ˆ˜
    • rss : ์ตœ๋Œ€ ๋ ˆ์ง€๋˜ํŠธ ์„ธํŠธ ํฌ๊ธฐ(ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ RAM์— ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€)
    • stack : ์ตœ๋Œ€ ์Šคํƒ ํฌ๊ธฐ
    • cpu : ์ตœ๋Œ€ CPU ์‹œ๊ฐ„
    • nproc : ์ตœ๋Œ€ ํ”„๋กœ์„ธ์Šค ์ˆ˜
    • as : ์ฃผ์†Œ ๊ณต๊ฐ„ ์ œํ•œ
    • maxlogins : ํ•ด๋‹น ์œ ์ €์˜ ์ตœ๋Œ€ ๋กœ๊ทธ์ธ ์ˆ˜
    • priority : ์œ ์ € ์šฐ์„ ์ˆœ์œ„
    • locks : ์œ ์ €๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํŒŒ์ผ ๊ฐœ์ˆ˜
    •  
  • <value> : ์ง€์ •๋œ ์ž์›์˜ ์ œํ•œ ๊ฐ’ ์ •์˜
  • ์„ค์ • ๋‚ด์šฉ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€
    • 1. ์žฌ๋ถ€ํŒ…ํ•˜๊ธฐ
      1. ulimit -a ๋กœ ๋ฆฌ์†Œ์Šค ์žฌ๋กœ๋“œํ•˜๊ธฐ
ulimit -a

๊ฐ“ ํƒœ์–ด๋‚œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‚ด๋ถ€์— ์„ค์น˜๋œ ๊ฒƒ์ด ๊ฑฐ์˜ ์—†์–ด์„œ vi ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด vim์„ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

# ์ปจํ…Œ์ด๋„ˆ๋ช… ํ™•์ธ
docker ps -a

# ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
docker exec -it [์ปจํ…Œ์ด๋„ˆ๋ช…] /bin/bash

# Permission denied ๋ฐœ์ƒ
Reading package lists... Done
E: List directory /var/lib/apt/lists/partial is missing. 
- Acquire (13: Permission denied)

# ์ปจํ…Œ์ด๋„ˆ u0 ์žฌ์ ‘์†(๊ถŒํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ)
docker exec -itu0 [์ปจํ…Œ์ด๋„ˆ๋ช…] /bin/bash

apt-get update
apt-get upgrade
apt-get install vim

 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

Docker๋กœ Jenkins๋ฅผ ๋„์šฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด๋ฏธ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด Jenkins ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ”๊พธ๊ณ ์ž ํ–ˆ๋‹ค.

 

๋งŒ์•ฝ Docker๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ์— Jenkins๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด "/etc/default/jenkins" ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ •๋ณด๋Š” ๋งŽ์ง€๋งŒ

Docker์˜ Jenkins ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ •๋ณด๋Š” ๋งŽ์ง€ ์•Š์•˜๋‹ค.

 

๐Ÿณ Jenkins Docker ๊ณต์‹๋ฌธ์„œ

https://hub.docker.com/_/jenkins

 

jenkins - Official Image | Docker Hub

DEPRECATION NOTICE This image has been deprecated for over 2 years in favor of the jenkins/jenkins:lts image provided and maintained by the Jenkins Community as part of the project's release process. The images found here have not received updates for over

hub.docker.com

 

Docker์˜ Jenkins ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด JENKINS_OPTS๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ฒ˜์Œ์— ๊ทธ๋ƒฅ ๋ฌด์ž‘์ • 7070:7070๋งŒ ์ž…๋ ฅํ–ˆ๋”๋‹ˆ ์  ํ‚จ์Šค ์ ‘์†์ด ์•ˆ ๋˜๋”๋ผ..

docker run -itd --env JENKINS_OPTS=--httpPort=7070 -p 7070:7070 -v ~/jenkins:/var/jenkins_home --name jenkins jenkins/jenkins:lts

JENKINS_OPTS ํ™˜๊ฒฝ๋ณ€์ˆ˜์— --httpPort๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

 

 

 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

1. ๋ฌธ์ œ ์ƒํ™ฉ

Jenkins POST API๋ฅผ ํ˜ธ์ถœํ•˜๋‹ˆ๊นŒ 403 No valid crumb was included in the request ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Jenkins Configure → Script Console

import jenkins.model.Jenkins
def instance = Jenkins.instance
instance.setCrumbIssuer(null)

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑ ํ›„ ์‹คํ–‰ํ•œ๋‹ค. ์‹คํ–‰ ํ›„์—๋Š” Jenkins๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

๋ฐฐ์น˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋Œ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, DBMS์— ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์™”์„ ๋•Œ ๋ฐ”๋กœ ๋ฐฐ์น˜๋ฅผ ๋Œ๋ ค์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ! 

 

์›น์— [์ˆ˜๋™ ๋ฐฐ์น˜] ๊ฐ™์€ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋†“๊ณ  ๋ˆ„๋ฅด๋ฉด ์  ํ‚จ์Šค์—์„œ ๋ฐฐ์น˜๊ฐ€ ๋Œ๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

์  ํ‚จ์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์›๊ฒฉ์œผ๋กœ ๋นŒ๋“œ ์œ ๋ฐœ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์  ํ‚จ์Šค์— ์„ค์ •ํ•ด ๋†“์€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜, ๋‘๋ ˆ์ด ๋ฉ”์‹ ์ € ์•Œ๋ฆผ ๊ธฐ๋Šฅ, ๋กœ๊ทธ ํ™•์ธ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ์„œ ์›๊ฒฉ์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์œ ๋ฐœํ•ด๋ณด์ž!

 


1. ํ† ํฐ ๋ฐœ๊ธ‰

  • Dashboard > ์‚ฌ๋žŒ

 

  • admin์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— admin ํด๋ฆญ!

 

  • ์„ค์ •์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ API Token ๋ฐœ๊ธ‰

๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋ฉด ๊ฐ’์ด ์‚ฌ๋ผ์ ธ ์žˆ์œผ๋‹ˆ ์ž˜ ๋ณต์‚ฌํ•ด๋‘์ž!

 

2. Job ์„ค์ •

  • ์›๊ฒฉ์œผ๋กœ ๋นŒ๋“œ ์œ ๋ฐœ ์ฒดํฌ ๋ฐ ํ† ํฐ ์ด๋ฆ„ ์„ค์ •

ํ† ํฐ ์ด๋ฆ„์€ ๋‚˜์ค‘์— ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„์–ด์“ฐ๊ธฐ ์—†์ด ์งง๊ฒŒ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

3. ์›๊ฒฉ์œผ๋กœ ๋นŒ๋“œ

1) Job Build

  • Parameter๊ฐ€ ์—†๋Š” build
curl -i -X POST 'http://<jenkins_username>:<jenkins_api_token>@<jenkins_url>/job/<job_name>/build?token= <token_name>'

 

๊ฐ’์„ ์ฑ„์›Œ๋„ฃ๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์  ํ‚จ์Šค job์ด ์ž˜ ์‹คํ–‰๋œ๋‹ค!

 

ํŒŒ์ด์ฌ์—์„œ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋ฉด

@api_view(['POST'])
def trigger_build(request):
    # ์  ํ‚จ์Šค ๋นŒ๋“œ ์ฃผ์†Œ - ํŒŒ๋ผ๋ฏธํ„ฐ : ํ† ํฐ
    jenkins_url = f"http://{jenkins_username}:{jenkins_password}@{jenkins_server}/job/{jenkins_job_name}/build?token={jenkins_token}"

    try:
        response = requests.post(jenkins_url)  # ์  ํ‚จ์Šค ๋นŒ๋“œ ์ฃผ์†Œ๋กœ post ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

        if response.status_code == 201:  # ์š”์ฒญ ์„ฑ๊ณต
            print("[Success] Jenkins trigger builds remotely!")
            return HttpResponse("Jenkins build triggered successfully!", status=201)
        else:  # ์š”์ฒญ ์‹คํŒจ
            print("[Fail] Failed to trigger builds remotely. Status code:", response.status_code)
            return HttpResponse("Failed to trigger Jenkins build. Status code: " + str(response.status_code), status=500)

    except Exception as e:  # ์˜ˆ์™ธ ๋ฐœ์ƒ
        print("[Fail] Failed to trigger builds remotely. Exception:", e)
        return HttpResponse("Failed to trigger Jenkins build. Exception: " + str(e), status=500)

 

  • Build with Parameter
curl -X POST 'http://[IP]:[PORT]/job/[JOB_NAME]/build buildWithParameters --data [PARAM1]=[VALUE1] --data [PARAM2]=[VALUE2] --user [USER_NAME]:[USER_API_TOKEN]'

 

@api_view(['GET'])
def trigger_build_with_parameters(request):
    try:
        # ์  ํ‚จ์Šค ๋นŒ๋“œ ์ฃผ์†Œ - ํŒŒ๋ผ๋ฏธํ„ฐ : ํ† ํฐ, ํŒŒ๋ผ๋ฏธํ„ฐ
        jenkins_url = f"http://{jenkins_username}:{jenkins_password}@{jenkins_server}/job/{jenkins_job_name}/buildWithParameters?token={jenkins_token}&params={params}"
        response = requests.post(jenkins_url)  # ์  ํ‚จ์Šค ๋นŒ๋“œ ์ฃผ์†Œ๋กœ post ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

        if response.status_code == 201:  # ์š”์ฒญ ์„ฑ๊ณต
            print("[Success] Jenkins trigger builds remotely!")
            return HttpResponse("Jenkins build triggered successfully!", status=201)
        else:  # ์š”์ฒญ ์‹คํŒจ
            print("[Fail] Failed to trigger builds remotely. Status code:", response.status_code)
            return HttpResponse("Failed to trigger Jenkins build. Status code: " + str(response.status_code), status=500)

    except Exception as e:  # ์˜ˆ์™ธ ๋ฐœ์ƒ
        print("[Fail] Failed to trigger builds remotely. Exception:", e)
        return HttpResponse("Failed to trigger Jenkins build. Exception: " + str(e), status=500)

 

2) Job Build ์กฐํšŒ

curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

3) Job Build ๊ฒฐ๊ณผ ์กฐํšŒ

 curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/[BUILD_NUM]/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

๋นŒ๋“œ ๋„˜๋ฒ„๋ฅผ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒฝ์šฐ

BUILD_NUM ๋Œ€์‹  lastStableBuild๋ฅผ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์กฐํšŒ ๊ฒฐ๊ณผ๋Š” json, xml, python ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/lastStableBuild/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

 

 

 

 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

+ Recent posts