Jenkins Setup - aragorn/home GitHub Wiki

installation

plugins

κΈ°λ³Έ plugin 에 μΆ”κ°€ν•˜μ—¬ μ„€μΉ˜ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈ

  • Git plugin
  • Cron Column Plugin
  • Grails plugin
  • user build vars plugin
  • inheritance-plugin

μ‚¬μš©ν•  것인지 μ—¬λΆ€λ₯Ό 잘 λͺ¨λ₯΄κ² λ‹€...

  • Build Pipeline Plugin ?
    • Delivery Pipeline Plugin ?

HTTP Proxy μ„€μ •

  • Jenkins 관리 > ν”ŒλŸ¬κ·ΈμΈ 관리 > κ³ κΈ‰ λ©”λ‰΄μ—μ„œ HTTP Proxy λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.
    μ„œλ²„, 포트 등을 μ§€μ •ν•œ ν›„, ν™”λ©΄μ˜ κ°€μž₯ μ•„λž˜ 였λ₯Έμͺ½μ— λ³΄μ΄λŠ” "μ§€κΈˆ 확인" λ²„νŠΌμ„ λˆ„λ₯΄λ©΄, μ—…λ°μ΄νŠΈ μ‚¬μ΄νŠΈλ‘œλΆ€ν„° 갱신이 κ°€λŠ₯ν•˜λ‹€. μ—¬κΈ°μ—μ„œ μ„€μ •ν•œ ν”„λ‘μ‹œ 섀정은 이후 JDK, Grails μžλ™μ„€μΉ˜ λ“±μ—μ„œλ„ μ‚¬μš©λœλ‹€.

ldap setup

  • 사내 LDAP μ„€μ • κ°€μ΄λ“œλ₯Ό 따라 μ„€μ •ν•˜λ©΄ Configure Global Security μ„€μ •μœΌλ‘œ 둜그인 κΈ°λŠ₯이 μž‘λ™ν•œλ‹€.

git and credentials

  • 사내 github μ—μ„œ source code λ₯Ό clone ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ ‘κ·ΌκΆŒν•œμ„ μ–»μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•œ 섀정방법이 μ—¬λŸ¬κ°€μ§€κ°€ μžˆμœΌλ‚˜, jenkins κ°€ μ„€μΉ˜λœ μ„œλ²„μ—μ„œ ssh-keygen 으둜 ssh public/private key λ₯Ό μƒμ„±ν•˜κ³ , 이 public key λ₯Ό github repository 에 μΆ”κ°€ν•˜λŠ” 방법을 μ‚¬μš©ν•œλ‹€.
    • jenkins κ°€ μ„€μΉ˜λœ μ„œλ²„μ—μ„œ ssh-keygen 을 μ‹€ν–‰ν•œλ‹€.
      ubuntu server μ—μ„œ μœ„μ˜ μ„€μΉ˜ κ°€μ΄λ“œμ— 따라 jenkins λ₯Ό μ„€μΉ˜ν•˜λ©΄, jenkins λΌλŠ” 계정이 μƒμ„±λ˜κ³ , ν™ˆλ””λ ‰ν† λ¦¬κ°€ /var/lib/jenkins 둜 μ§€μ •λœλ‹€. su - jenkins 둜 jenkins κ³„μ •μ˜ κΆŒν•œμ„ 얻은 ν›„, ssh-keygen λͺ…령을 μ‹€ν–‰ν•œλ‹€. /var/lib/jenkins/.ssh/id_rsa.pub 파일이 μƒμ„±λœ 것을 ν™•μΈν•œλ‹€.
    • github repository μ—μ„œ settings 메뉴에 λ“€μ–΄κ°€λ©΄, Deploy keys λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
      Add deploy key λ²„νŠΌμ„ μ„ νƒν•˜κ³ , title μ—λŠ” jenkins@hostname μ •λ„μ˜ ꡬ뢄값을 μž…λ ₯ν•˜κ³ , Key 에 방금 μƒμ„±ν•œ id_rsa.pub 의 값을 λ³΅μ‚¬ν•˜μ—¬ λ„£λŠ”λ‹€.
    • jenkins μ›ΉμΈν„°νŽ˜μ΄μŠ€μ˜ Jenkins > Credentials > Global credentials (unrestricted) λ©”λ‰΄μ—μ„œ Add Credentials λ₯Ό 톡해 인증 정보λ₯Ό μž…λ ₯ν•œλ‹€.
      Kind λŠ” SSH Username with private key, Scope 은 Global, Username 은 jenkins@hostname, Private Key λŠ” From the Jenkins master ~/.ssh λ₯Ό μ„ νƒν•œλ‹€.
  • jenkins 의 item configure μ—μ„œ μ•žμ—μ„œ μ„€μ •ν•œ 값듀을 μ‚¬μš©ν•œλ‹€.
    μ†ŒμŠ€μ½”λ“œ 관리λ₯Ό Git 으둜 μ„ νƒν•œ ν›„, Repository URL, Credentials λ₯Ό μ„€μ •ν•œλ‹€. 이후 λΉŒλ“œ ν…ŒμŠ€νŠΈ κ³Όμ •μ—μ„œ μ •μƒμ μœΌλ‘œ μ†ŒμŠ€μ½”λ“œλ₯Ό κ°€μ Έμ˜€λŠ”μ§€ ν™•μΈν•œλ‹€.

JDK, Grails Setup

  • Jenkins 관리 > μ‹œμŠ€ν…œμ„€μ • λ©”λ‰΄μ˜ μ„€μ •λ§ŒμœΌλ‘œ JDK, Grails λ₯Ό μ„€μΉ˜ν•  수 μžˆλ‹€.

Maven Project Configuration

  • λ‚΄λΆ€ maven repository 에 μ ‘κ·Όν•˜μ§€ λͺ»ν•œλ‹€λŠ” μ—λŸ¬ λ©”μ‹œμ§€κ°€ λ°œμƒν•  수 μžˆλ‹€.
    ~/.m2/settings.xml 의 문제둜 μΆ”μΈ‘ν•˜κ³  μ—¬λŸ¬κ°€μ§€ μ‹œλ„λ₯Ό ν•΄ λ³΄μ•˜μœΌλ‚˜, μ‹€μ œ 문제의 원인은 proxy μ„œλ²„μ˜ μ ‘κ·Όμ œμ–΄ λ¬Έμ œμ˜€λ‹€. Build With Grails 의 ν”„λ‘œνΌν‹° μ„€μ •μ—μ„œ λ‹€μŒκ³Ό 같이 http.nonProxyHosts 섀정을 μΆ”κ°€ν•˜μ—¬ λ‚΄λΆ€μ„œλ²„λŠ” proxy μ„œλ²„λ₯Ό ν†΅ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•œλ‹€.

    grails.env=sandbox
    https.proxyHost=proxy.mycompany.io
    https.proxyPort=3128
    http.proxyHost=proxy.mycompany.io
    http.proxyPort=3128
    http.nonProxyHosts=localhost|127.0.0.0/8|192.168.0.0/16|10.0.0.0/8|172.16.0.0/12|*.mycompany.io|*.companycorp.com|*.mycompany.net|*.mycompany.com
    

JVM Options By Environment Variables

  • JVM μ‹€ν–‰ μ˜΅μ…˜μ„ μΆ”κ°€ν•˜κΈ° μœ„ν•΄ ν™˜κ²½λ³€μˆ˜λ₯Ό μ„€μ •ν•  ν•„μš”κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ target 을 war 둜 ν•˜μ—¬ λΉŒλ“œλ₯Ό μ§„ν–‰ν•˜λŠ” 도쀑, λ©”λͺ¨λ¦¬ λΆ€μ‘±μœΌλ‘œ λΉŒλ“œκ°€ μ‹€νŒ¨ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆλ‹€. Grails Build μ„€μ •μ—μ„œλŠ” JVM μ˜΅μ…˜μ„ λ³€κ²½ν•˜κΈ° μœ„ν•œ 섀정을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ 보인닀.
  • Environment Injector Plugin 을 μ„€μΉ˜ν•˜λ©΄, Build Configure μ—μ„œ 'Inject environment variables to the build process' ν•­λͺ©μ΄ μΆ”κ°€λœλ‹€. 이 μ„€μ •μ—μ„œ μ•„λž˜μ™€ 같은 μ˜΅μ…˜μ„ μΆ”κ°€ν•  수 μžˆλ‹€.
    • JAVA_OPTS=-server -noverify -Xms2G -Xmx6G -XX:+UseParallelGC

codenarc and violations plugin

Grails μ—μ„œ codenarc plugin 을 BuildConfig.groovy 에 μ μš©ν•˜κ³ , Jenkins μ—μ„œ Violations ν”ŒλŸ¬κ·ΈμΈμ„ μ„€μΉ˜ν•˜λ©΄, codenarc 의 정적 뢄석 κ²°κ³Όλ₯Ό jenkins μ—μ„œ λ°”λ‘œ 확인할 수 μžˆλ‹€.

violations ν”ŒλŸ¬κ·ΈμΈ ν™ˆνŽ˜μ΄μ§€λ‚˜ λ¬Έμ„œμ—μ„œ μΉœμ ˆν•œ 섀정방법을 μ•Œλ €μ£Όμ§€ μ•Šμ•„μ„œ μ„€μ • 과정이 κΉŒλ‹€λ‘­λ‹€λ©΄ κΉŒλ‹€λ‘­λ‹€.

  • jenkins μ—μ„œ violations plugin 을 μ„€μΉ˜ν•œ ν›„, Project configuration μ—μ„œ Violations Report λ₯Ό 생성할 수 μžˆλ‹€. 'λΉŒλ“œ ν›„ 쑰치' ν•­λͺ©μ—μ„œ 'Report Violations' ν•­λͺ©μ„ μ„ νƒν•˜λ©΄ λœλ‹€. Freestyle project 뿐만 μ•„λ‹ˆλΌ, Inheritance project μœ ν˜•μ—λ„ 이 섀정을 μΆ”κ°€ν•  수 μžˆλ‹€.
  • codenarc λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, XML filename pattern 으둜 **/CodeNarc-Report.xml 와 같은 값을 μž…λ ₯ν•˜λ©΄ λœλ‹€. λΉŒλ“œκ°€ μ„±κ³΅ν•˜λ©΄, ν•΄λ‹Ή λΉŒλ“œλ₯Ό μƒμ„Έμ‘°νšŒν•˜λŠ” ν™”λ©΄μ˜ μ™Όμͺ½ 메뉴에 Violations λΌλŠ” 메뉴가 μΆ”κ°€λœ 것을 확인할 수 μžˆλ‹€. 이 메뉴λ₯Ό μ„ νƒν•˜λ©΄, 뢄석 리포트λ₯Ό μ‚΄νŽ΄λ³Ό 수 μžˆλ‹€.
  • Grails 의 경우, multi-module project λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. 이 경우, 리포트 생성 ν›„ 각 파일의 상세 리포트λ₯Ό μ‘°νšŒν•  수 μ—†λŠ” ν˜„μƒμ΄ λ°œμƒν•  수 μžˆλ‹€. XML 기반의 λ¦¬ν¬νŠΈμ™€ μ†ŒμŠ€μ½”λ“œ 연결을 ν•˜μ§€ λͺ»ν•΄μ„œ λ‚˜νƒ€λ‚˜λŠ” ν˜„μƒμΈλ°, 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ Project configuration μ—μ„œ Faux Project Path λΌλŠ” 값을 적절히 μž…λ ₯ν•˜μ—¬μ•Ό ν•œλ‹€. 이 값을 μ–΄λ–»κ²Œ μž…λ ₯ν•΄μ•Ό ν•˜λŠ”μ§€ λ¬Έμ„œμ—μ„œ 잘 μ„€λͺ…ν•˜μ§€ μ•ŠλŠ”λ°, 이 값은 jenkins 의 workspace + project directory 경둜λ₯Ό λŒ€μ²΄ν•˜λŠ” 값이며, μ ˆλŒ€κ²½λ‘œλ₯Ό μž…λ ₯ν•΄μ•Όλ§Œ ν•œλ‹€.
  • 사내 CI μ„œλ²„μ—μ„œ μ‚¬μš©ν•œ Faux Project Path 섀정값은 μ•„λž˜μ™€ κ°™λ‹€.
    • /var/lib/jenkins/workspace/sandbox.grails2.common.codenarc/common
    • /var/lib/jenkins - μ  ν‚¨μŠ€ ν™ˆλ””λ ‰ν† λ¦¬ 경둜이며, ubuntu μ„œλ²„μ˜ κΈ°λ³Έ 섀정값이닀.
    • workspace - μ  ν‚¨μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 경둜
    • sandbox.grails2.common.codenarc - μ  ν‚¨μŠ€μ—μ„œ μ„€μ •ν•œ Project 의 이름
    • common - Grails 의 module 이름
      common/grails-app/, common/src/ κ³Ό 같은 κ²½λ‘œμ— μ‹€μ œ μ†ŒμŠ€μ½”λ“œκ°€ μœ„μΉ˜ν•œλ‹€.

Slave Instances

slave λ…Έλ“œλ₯Ό μΆ”κ°€λ‘œ κ΅¬μ„±ν•œλ‹€.

  • http://systemscitizen.com/2014/05/02/ubuntu-jenkins-slave-using-ssh/

  • μƒˆλ‘œμš΄ VM μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

    • slave node μ—λŠ” jenkins λ₯Ό apt-get 으둜 μ„€μΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • JDK λ₯Ό μ„€μΉ˜ν•œλ‹€.
  • /etc/group, /etc/passwd 의 λ§ˆμ§€λ§‰ κ·Έλ£Ή, κ³„μ •μ˜ GID, UID λ₯Ό ν™•μΈν•œλ‹€.

    • 이번 μ„œλ²„μ˜ 경우, ntp group 이 GID 111, UID 106 이닀.
    • jenkin λ₯Ό μ„€μΉ˜ν•˜λŠ” 경우, λ‹€μŒκ³Ό 같은 계정이 λ§Œλ“€μ–΄μ§„λ‹€.
      jenkins:x:107:112:Jenkins,,,:/var/lib/jenkins:/bin/bash
  • sudo groupadd -g 112 jenkins

  • sudo useradd -u 107 -g 112 -c Jenkins -m -d /var/lib/jenkins -s /bin/bash jenkins

  • su - jenkins

  • .ssh/authorized_keys 에 master λ…Έλ“œ jenkins κ³„μ •μ˜ ssh public key λ₯Ό λ³΅μ‚¬ν•΄μ„œ λ„£λŠ”λ‹€.

  • master node 의 jenkins κ³„μ •μ—μ„œ slave node 둜 ssh μ—°κ²°λ˜λŠ”μ§€ ν™•μΈν•œλ‹€. 인증 없이 μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€.

  • master node 의 μ  ν‚¨μŠ€ μ›ΉμΈν„°νŽ˜μ΄μŠ€μ—μ„œ slave node λ₯Ό κ΅¬μ„±ν•œλ‹€.

    • Credential 섀정에 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€. Credential 섀정을 생성할 λ•Œ, Username 지정을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
      Kind λŠ” SSH Username with private key, Scope 은 Global, Username 은 jenkins, Private Key λŠ” From the Jenkins master ~/.ssh λ₯Ό μ„ νƒν•œλ‹€. Username 을 jenkins@hostname 으둜 μ§€μ •ν•˜λ©΄ master node μ—μ„œ slave node 둜 μ—°κ²°λ˜μ§€ μ•Šκ²Œ λœλ‹€.
  • slave node μ—°κ²° ν›„, λ™μ‹œμ— μ‹€ν–‰ν•  job 의 수 등을 μ„€μ •ν•œ ν›„, job 을 μ‹€ν–‰ν•œλ‹€.

    • slave node 에 git 이 μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄, μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλ‹€. sudo apt-get install git --yes 둜 git 을 μ„€μΉ˜ν•œλ‹€.
    • jenkins μ—μ„œ μ‚¬μš©ν•  JDK, Grails 등이 slave node μ—μ„œ μžλ™μœΌλ‘œ μ„€μΉ˜λœλ‹€.

Grails and Jenkins

  • κ°€μƒμ„œλ²„μ˜ λ©”λͺ¨λ¦¬λ₯Ό 8GB 둜 ν• λ‹Ήν•œ 경우, Grails Build μž‘μ—…μ„ 4개 이상 μ‹€ν–‰ν•˜λ©΄, λ©”λͺ¨λ¦¬ λΆ€μ‘±μœΌλ‘œ μž‘μ—…μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. Grails Build κ³Όμ •μ—μ„œ Java ν”„λ‘œμ„ΈμŠ€κ°€ RSS 2.5GB 이상 μ‚¬μš©ν•˜λŠ” μƒνƒœλ₯Ό μ’…μ’… 확인할 수 μžˆλ‹€. 8GB μ„œλ²„ κΈ°μ€€μœΌλ‘œ μ΅œλŒ€ 3개 μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.
  • best practice to estimate java heap size
  • μ•„λž˜μ™€ 같이 μ΅œμ†Œ heap size λ₯Ό 쀄이면, μ‹€ν–‰ 도쀑 μ΅œλŒ€ λ©”λͺ¨λ¦¬κ°€ 1.6GB μ •λ„λ‘œ 쀄어든닀.
    JAVA_OPTS=-server -noverify -Xms512M -Xmx4G -XX:+UseParallelGC
  • java heap size 의 μ μ ˆν•œ 섀정값을 μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ μΆ©λΆ„ν•œ ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•˜λ‹€.