🚦DevOps/Jenkins

Jenkins μžλ™ μž¬κΈ°λ™μ„ μœ„ν•œ μ„œλΉ„μŠ€ 파일 생성

미인주 2023. 5. 2. 10:00

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