====== Jenkins ======
* [[http://jenkins-ci.org/|Jenkins CI]]
* [[http://www.blackbuild.com/15-must-have-plugins-for-jenkins/|15 Must have plugins for jenkins]]
* [[https://jenkins.io/doc/book/architecting-for-scale/|Architecting for Scale]] : 확장성 관련 처리
* [[ci:jenkins:remote_api|Jenkins Remote API]]
* [[ci:jenkins:groovy_hook|Jenkins Groovy Hook]]
* [[ci:jenkins:jcasc|Jenkins Configuration As Code - JCasC]]
* [[ci:jenkins:agent|Jenkins Agent ( slave )]]
* [[ci:jenkins:cli|Jenkins CLI]]
===== Slave 전략 =====
* Jenkins Master 를 바로 이용해서 Batch Job scheduling 등을 할 경우, Master 에서 batch job을 곧바로 실행하면 일부 Job 이 시스템 리소스를 다 잡아먹어서 Master 의 스케줄링 작업을 방해할 수도 있다.
* 따라서 중요 Batch Job 스케줄링을 할 경우에는 **Master 에서는 스케줄링만 하고 모든 Job 을 Slave Agent 에서만 실행**하게 한다.
===== 설치 실행 =====
* [[https://www.jenkins.io/doc/book/installing/|Jenkins Install]] : Debian/Ubuntu 리포지토리도 제공함.
* [[https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins|Administering Jenkins]]
* ''JENKINS_HOME'' 환경 변수로 설정 정보 및 빌드 정보 실행 디렉토리를 지정할 수 있다.
* [[https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins|Starting and Accessing Jenkins]]
java -jar jenkins.war
# or
nohup java -jar jenkins.war > $LOGFILE 2>&1
* 주요 옵션
* ''%%--%%httpPort=$HTTP_PORT''
* ''%%--%%prefix=$PREFIX'' : context path 처럼 URL 앞에 붙는 값
* ''-XX:PermSize=512M -XX:MaxPermSize=2048M -Xmn128M -Xms1024M -Xmx2048M''
* [[https://www.popularowl.com/jenkins/automating-jenkins-install-docker-terraform/|Automating Jenkins install and configuration with Docker and Terraform - Popularowl]]
* admin 생성을 완전 자동으로 하는 방법
* plugin 자동 설치
===== 설치 Systemd =====
* 2022년 경부터 Linux 용 Jenkins 패키지가 [[linux:systemd|systemd]] 를 기준으로 패키징됐으며, systemd 지원 리눅스에서 동일한 방식의 설치를 지원하게 됨.
* [[https://www.youtube.com/watch?v=VD3dB5wGtJI|How to Install Jenkins on Ubuntu 22.04 - YouTube]]
* [[https://www.youtube.com/watch?v=pwR9TPW2oG4|Managing the Jenkins systemd Service on Ubuntu 20.04 - YouTube]]
* [[https://www.youtube.com/watch?v=MkokjTQ2ngc|Managing the Jenkins systemd Service on CentOS 7.9 - YouTube]]
* [[https://www.youtube.com/watch?v=LmgzvD7xvKU|How to Install Jenkins on AlmaLinux 8 - YouTube]] : [[linux:alma_linux|Alma Linux]]에서 [[linux:systemd|systemd]]로 설치하는 과정
===== Ubuntu/Debian 패키지 설치 Jenkins 실행 사용자 변경 =====
* **Deprecated** ''systemd'' 관련 항목 확인
* [[http://blog.manula.org/2013/03/running-jenkins-under-different-user-in.html|How to run Jenkins under a different user in Linux [Redhat] | Manula's Blog]]
* ''/etc/default/jenkins'' 에서 아래 항목을 원하는 계정으로 변경
JENKINS_USER=
JENKINS_GROUP=
# 다음 명령으로 한 번에 변경
sudo sed -i.bak -e "s/JENKINS_USER=\$NAME/JENKINS_USER=$USER/g" \
-e "s/JENKINS_GROUP=\$NAME/JENKINS_GROUP=$USER/g" \
-e "s/HTTP_PORT=8080/HTTP_PORT=7777/g" \
/etc/default/jenkins
* 재시작
# 이미 생성된 디렉토리 권한 변경
sudo chown -R : /var/lib/jenkins
sudo chown -R : /var/cache/jenkins
sudo chown -R : /var/log/jenkins
# 재시작
sudo service jenkins restart
# jenkins 프로세스 확인
ps -ef | grep jenkins
===== Jenkins on Redhat 계열 Linux =====
* **Deprecated** ''systemd'' 관련 항목 확인
* [[https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions|Installing Jenkins on Red Hat distributions - Jenkins - Jenkins Wiki]]
* [[https://www.jenkins.io/doc/tutorials/tutorial-for-installing-jenkins-on-AWS/|Jenkins on AWS]]
* ''/etc/sysconfig/jenkins'' 파일에서 JVM 옵션 등 변경 가능
* ''/var/log/jenkins/jenkins.log'' 에 로그 남음
* ''UnknownHostException'' 발생시에 [[https://support.cloudbees.com/hc/en-us/articles/218156717-Jenkins-is-Experiencing-UnknownHostException|Jenkins is Experiencing UnknownHostException – CloudBees Support]]
* [[:docker|Docker]] 사용시 ''jenkins'' 사용자를 ''docker'' group 에 추가해야 한다.
sudo usermod -aG docker jenkins
===== Jenkins Docker =====
* [[https://hub.docker.com/r/jenkins/jenkins|jenkins official docker image]]
* [[https://github.com/jenkinsci/docker|Jenkins Official Docker source]]
* [[https://github.com/jenkinsci/docker/blob/master/README.md|docker/README.md at master · jenkinsci/docker]]
* [[https://mydeveloperplanet.com/2019/01/30/setup-jenkins-ci-in-30-minutes/|Setup Jenkins CI in 30 Minutes – My Developer Planet]]
* [[https://youtu.be/QNZNfvrFBMo|How to Run Jenkins on Docker]] : Docker 로 Jenkins를 띄우고, 업그레이드 하는 방법 설명.
* [[https://gist.github.com/darinpope/39e4718919d22bc22f470ad3e94f8df1|/Gist for video]]
* Docker를 사용하는 것이 유지보수성, 보안성등이 더 좋다.
* 특별한 이유가 없다면 ''latest''말고 ''lts'' 버전으로 설치할 것. 혹은 버전 명시. ''TZ=Asia/Seoul''도 명시해야 시간값이 맞다.
docker run --name=mytestjenkins -p 8080:8080 -p 50000:50000 \
-v /your/home:/var/jenkins_home \
-e TZ=Asia/Seoul \
-e JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com \
jenkins/jenkins:lts
* plugin 자동설치도 가능하다. 이 경우 Docker Image를 별도 생성해야함. Docker 내부에서 ''/usr/local/bin/install-plugins.sh'' 스크립트를 호출해서 수행한다. [[https://github.com/jenkinsci/docker|Jenkins Official Docker source]] README 참조
===== 모니터링 =====
* 인증 걸려 있을 경우 이거 안됨 : ''http://jenkins-server:port/cc.xml'' : ''jenkins-server:post'' 부분을 대체하고 출력되는 XML을 받아 처리하면 모니터링 툴을 만들 수 있다. [[http://cruisecontrol.sourceforge.net/|CruiseControll]]용 모니터링 툴과 동일한 스펙이므로 CC용 툴을 사용해도 된다.
* [[aws:elb|ELB - Elastic Load Balancing]] Health Check는 ''http://jenkins-server:port/whoAmI'' 에 대해 **302** 응답을 정상 응답으로 간주하면 된다.
===== 설정 =====
==== Custom Workspace Directory ====
* workspace 경로를 직접 지정가능하다.
* **General -> 고급(Advanced) -> 사용자 빌드 경로 사용** 에서 지정
==== JUnit Test 결과 ====
* **Post-build Actiosn -> Publish JUnit test result report**의 값을 (Gradle일 경우) ''%%**%%/build/test-results/*.xml'' 형태로 지정한다.
==== Jenkins의 모든 노드에 대해 Job 실행 ====
* 가끔씩 Jenkins 노드들에 대해 어떠한 일괄작업(cron 비슷한 일)이 필요할 때가 있다.
* [[https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin|Parameterized Trigger Plugin]]과 [[https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin|Node Parameter Plugin]]을 통해 모든 Jenkins 노드에 대한 일괄 처리를 수행할 수 있다.
==== 인증 ====
* 인증시 group을 ''authenticated''로 지정하면 로그인 사용자에 대한 권한을 의미한다.
==== 설정의 백업 ====
* [[https://wiki.jenkins-ci.org/display/JENKINS/SCM+Sync+configuration+plugin|SCM Sync configuration plugin]] : git, subversion을 통한 설정 백업
* script를 만들어 백업하기 [[http://www.holisticqa.com/2013/11/backing-up-your-jenkins-configuration/|Backing up your Jenkins configuration]]
DUMP="jenkins_data.`date +%Y-%m-%d`.tar.gz"
JENKINS_HOME=/home/us/jenkins/jenkins-data
nice -n 19 tar --exclude-from jenkins_backup_exclusions -C $JENKINS_HOME -zcf $DUMP .
* 백업 제외 목록 파일 ''jenkins_backup_exclusions''
config-history/*
jobs/*/workspace*
jobs/*/builds/*/archive
plugins/*/*
plugins/*.bak
war
cache
* 제외목록 내 임의 추가
jobs/*/builds
logs
===== Backup =====
* [[ci:jenkins:scmsync|Jenkins SCM Sync Configuration plugin]]
* [[ci:jenkins:thinbackup|Jenkins ThinBackup]]
===== Logging =====
* 플러그인 등의 로그를 분할해서 볼 수 있다.
* ''Jenkins 관리 -> 시스템 로그''에서 ''신규 로그 기록기 추가''에서 플러그인의 패키지를 로거로 지정해준다.
===== Plugins =====
* [[https://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin|Gearman]] Multipule Master 지원
==== Clone Workspace SCM Plugin ====
* [[https://wiki.jenkins-ci.org/display/JENKINS/Clone+Workspace+SCM+Plugin|Clone Workspace SCM Plugin - Jenkins]]
* 클론 대상(부모) 빌드의 **Post Build Action**에서 **Archive for Clone Workspace SCM**을 등록하고 대상 파일은 ''%%**%%'' 정도로 주면 된다.
==== Warnings Next Generation Plugin ====
* [[https://wiki.jenkins.io/display/JENKINS/Warnings+Next+Generation+Plugin|Warnings Next Generation Plugin]]
* 다른 정적 분석 플러그인들을 모두 대체할 플러그인.
==== FindBugs Plugin ====
* [[https://wiki.jenkins-ci.org/display/JENKINS/FindBugs+Plugin|Jenkins FindBugs Plugin]]
* 버그 종류와 갯수에 따라 빌드를 실패로 간주하게 설정함으로써 점진적으로 코드 품질을 높여갈 수 있다.
==== Log Parser Plugin ====
* [[https://wiki.jenkins.io/display/JENKINS/Log+Parser+Plugin|Jenkins Log Parser Plugin]]
* build의 console log를 파싱하여 등장하는 로그 메시지에 따라 error,warning 등을 발생시킬 수 있다.
* 사용예 [[java:lombok:field_exist_verify|Lombok Field 지정이 올바른지 검사]]
==== Build User Vars Plugin ====
* [[https://plugins.jenkins.io/build-user-vars-plugin|Build User Vars Plugin]]
* 빌드릴 실행한 사용자 정보를 환경 변수로 만들어주는 플러그인
==== Google Login ====
* [[https://plugins.jenkins.io/google-login|Google Login]] 구글을 통한 인증
==== Build Blocker ====
* [[https://plugins.jenkins.io/build-blocker-plugin/|Build Blocker Plugin]]
* 다른 Job 이 실행중일 때는 build 를 막게 설정. Job들간 실행이 상호 배타적일 때 사용.
===== JOB =====
==== Parameterized Build ====
* [[https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build|Parameterized Build]]
* 직접 빌드 실행시 파라미터를 주어 실행할 수 있다.
* 원격으로도 파라미터를 주어 빌드를 실행할 수 있다.
==== Execute Shell 의 결과로 다른 Parameterized Build 호출 ====
* Execute Shell 등의 결과로 나온 파라미터 값을 가지고 다른 Parameterized Build를 호출하려면 해당 key=value 값을 Java Properties 파일 형식으로 셸에서 생성해 둬야 한다.
* [[https://stackoverflow.com/questions/30110876/passing-variable-from-shell-script-to-jenkins|Passing variable from shell script to jenkins - Stack Overflow]]
echo DATE=$(date +%Y-%m-%d) > env.properties
* 그리고서, 해당 파일 ''env.properties''를 **빌드 후 조치 -> Trigger parameterized build on other projects 에서 Parameters from properties file**에 지정해준다.
* 만약, Jenkins 자체에 미리 지정된 환경 변수를 파라미터로 넘기려면 **Predefined Parameters** 로 충분하다.
==== Process Kill ====
* Jenkins Build에서 tomcat등을 실행해 띄워 두려고 하면 자꾸 프로세스가 죽는다.
* Jenkins Build는 빌드에서 실행한 모든 프로세스를 기본으로 죽인다.
* https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller
* 죽이기를 원하지 않는 프로세스는 프로세스를 띄울 때 환경변수 ''BUILD_ID''를 Jenkins가 지정한 것이 아닌 엉뚱한 값으로 바꿔주면된다. Jenkins는 프로세스의 ''BUILD_ID'' 환경 변수 값을 보고 프로세스를 죽이기 때문이다.
BUILD_ID=무언가JENKINS BUILD_ID가 아닌 어떤값
./your_hudson_script_that_starts_tomcat.sh
=== Jenkins build log 파일에서 문자열 검색 ===
* 특정 날짜의 build 로그 파일들 중에서만 문자열 검색을 하고 싶을 때
* see [[linux:find|find]]
find . -name log -newerct yyyy-MM-dd ! -newerct yyyy-MM-dd -exec grep -Hni '검색어' {} \;
=== 환경변수 등 읽기 ===
* [[https://wiki.jenkins.io/display/JENKINS/Building+a+software+project|Building a software project - Jenkins - Jenkins Wiki]]
===== External Job =====
* Jenkins 서버가 아닌(master, slave 모두 아닌) 전혀 다른 외부 서버에서 실행된 Job을 Jenkins 에서 모니터링할 수 있다.
* 단, 해당 서버에서 특정 작업을 실행할 때 Jenkins 서버로 실행 정보를 쏴줘야 한다.
* [[https://wiki.jenkins.io/display/JENKINS/Monitoring+external+jobs|Monitoring external jobs - Jenkins - Jenkins Wiki]]
* [[https://stackoverflow.com/questions/11830098/setup-jenkins-to-monitor-external-job|monitoring - Setup Jenkins to monitor external job]]
# 외부 모니터링 툴 설치
sudo apt-get install jenkins-external-tool-monitor
# 외부 Job 실행, my-jenkins 는 Jenkins Master Server, nightly-backup 은 external job 이름
JENKINS_HOME=http://my-jenkins/ java -jar jenkins-core-*.jar nightly-backup ./backup.sh --nightly /home
===== Upgrade =====
* [[https://www.youtube.com/watch?v=fEO7dOxHvgU&t=71s&ab_channel=CloudBeesTV|How to Safely Upgrade Jenkins to a New Version - YouTube]]
* [[https://plugins.jenkins.io/support-core/|Support Core | Jenkins plugin]] 을 통해 현재 상태를 그대로 docker File 로 뜬 상태에서 업그레이드를 수행해 보고서 잘 되면 새로운 상태를 기준으로 docker 뜨기
===== 기타 =====
* [[http://stackoverflow.com/questions/18600715/how-to-get-the-job-name-on-a-groovy-dynamic-parameter-in-jenkins|How to get the job name on a groovy dynamic parameter in Jenkins]]
* Jenkins git plugin이 슬래시(slash, /) 들어간 브랜치 이름을 인식 못하는 문제가 있는 듯 함.
* SSH Slave Plugin의 경우 ''stderr / Standard Error'' 스트림을 제대로 전달해주지 못하는 문제가 있어보임.
* [[https://wiki.jenkins.io/display/JENKINS/Administering+Jenkins|Administering Jenkins - Jenkins - Jenkins Wiki]]
* [[https://github.com/jenkinsci/jenkins-scripts|jenkins-scripts]]
* [[https://support.cloudbees.com/hc/en-us/articles/222446987-Prepare-Jenkins-for-Support|Prepare Jenkins for Support – CloudBees Support]] : Jenkins 에 접합한 JVM 설정등을 소개함.