ansible 배포 자동화 구성을 위해 Jenkins 설치

우선 설치까지만 진행하고 구성은 다음에...
1. Jenkins 컨테이너 실행
$ docker run -d --name jenkins \
-e TZ=Asia/Seoul \
-p 8888:8080 -p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \
jenkins/jenkins
Unable to find image 'jenkins/jenkins:latest' locally
latest: Pulling from jenkins/jenkins
fd0410a2d1ae: Pull complete
8fd0e6949700: Pull complete
0b8c4de74554: Pull complete
6cb562e5f934: Pull complete
02bbf1f6f7ac: Pull complete
af526f34b1b3: Pull complete
301ce19b0e14: Pull complete
02660793e834: Pull complete
d2c171e62e2e: Pull complete
f8f232577aa1: Pull complete
27a6ae3e33d5: Pull complete
d3633a8df18a: Pull complete
Digest: sha256:53e112cf5556582ddcc94e08ce1ae2066070d8a7e45ca57a6bd7409544aa35de
Status: Downloaded newer image for jenkins/jenkins:latest
2a556be33987a857c0edcbca19b5530464dc2ac2754c4ab81c9d2f4427fd1344
더보기
-d
- 데몬 모드로 컨테이너를 백그라운드에서 실행
-p 8888:8080
- 호스트의 8888 포트를 컨테이너의 8080 포트에 매핑(Jenkins 웹 인터페이스)
-p 50000:50000
- 호스트의 50000 포트를 컨테이너의 50000 포트에 매핑(Jenkins 에이전트 통신용)
-v jenkins-data:/var/jenkins_home
- Jenkins 데이터를 영구적으로 저장하기 위해 Docker 볼륨 'jenkins-data'를 컨테이너의 '/var/jenkins_home' 디렉토리에 마운트.
-v /var/run/docker.sock:/var/run/docker.sock
- 호스트의 Docker 소켓을 컨테이너 내부에 마운트
- Jenkins 컨테이너 내에서 호스트 시스템의 Docker 데몬에 접근할 수 있게 하기 위함
"Docker-out-of-Docker" 또는 "DooD"라고 부름 - Jenkins 컨테이너가 호스트의 Docker 데몬에 완전한 접근 권한을 가져, 잠재적인 보안 위험이 있을 수 있음.
Jenkins 컨테이너 실행 확인
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a556be33987 jenkins/jenkins "/usr/bin/tini -- /u…" 23 seconds ago Up 23 seconds 0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp jenkins
2. docker log에서 Jenkins 패스워드 확인
$ docker logs jenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
2025-02-10 07:11:56.539+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file
2025-02-10 07:11:57.809+0000 [id=1] WARNING o.e.j.ee9.nested.ContextHandler#setContextPath: Empty contextPath
2025-02-10 07:11:57.900+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-12.0.16; built: 2024-12-09T21:02:54.535Z; git: c3f88bafb4e393f23204dc14dc57b042e84debc7; jvm 17.0.14+7
2025-02-10 07:11:58.483+0000 [id=1] INFO o.e.j.e.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.ee9.jsp.JettyJspServlet
2025-02-10 07:11:58.549+0000 [id=1] INFO o.e.j.s.DefaultSessionIdManager#doStart: Session workerName=node0
2025-02-10 07:11:58.978+0000 [id=1] INFO hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2025-02-10 07:11:59.130+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started oeje9n.ContextHandler$CoreContextHandler@2776015d{Jenkins v2.496,/,b=file:///var/jenkins_home/war/,a=AVAILABLE,h=oeje9n.ContextHandler$CoreContextHandler$CoreToNestedHandler@b174a73{STARTED}}
2025-02-10 07:11:59.147+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@719d35e8{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2025-02-10 07:11:59.162+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started oejs.Server@340da44c{STARTING}[12.0.16,sto=0] @3515ms
2025-02-10 07:11:59.163+0000 [id=26] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2025-02-10 07:11:59.345+0000 [id=25] INFO jenkins.model.Jenkins#<init>: Starting version 2.496
2025-02-10 07:11:59.431+0000 [id=34] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization
2025-02-10 07:11:59.446+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2025-02-10 07:12:00.347+0000 [id=37] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2025-02-10 07:12:00.353+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins
2025-02-10 07:12:00.354+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2025-02-10 07:12:00.542+0000 [id=33] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
2025-02-10 07:12:00.543+0000 [id=45] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted
2025-02-10 07:12:00.544+0000 [id=46] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2025-02-10 07:12:00.546+0000 [id=36] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2025-02-10 07:12:00.565+0000 [id=60] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server
2025-02-10 07:12:01.007+0000 [id=40] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
패스워드
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2025-02-10 07:12:06.843+0000 [id=40] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2025-02-10 07:12:06.859+0000 [id=25] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2025-02-10 07:12:08.438+0000 [id=60] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2025-02-10 07:12:08.439+0000 [id=60] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
3. 웹브라우저를 열고 Jenkins 접속
- http://dockerIP:8888
- log에서 확인한 패스워드를 입력하여 잠금 해제

4. Customize Jenkins
- Install suggeted plugins 선택하여 초기 플러그인 모두 설치


5. 관리자 계정 생성

6. 설치 마무리
- 접속 주소 확인 후 Save and Finish 클릭

- Start using Jenkins 클릭

7. Jenkins 접속 확인
