====== 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 설정등을 소개함.