CI, CD/Jenkins

Jenkins > 1. 설치 > Docker 기반

Krevis 2024. 4. 4. 11:14

 

설치 환경

OS: Ubuntu 22.04

 

9/2/2024 기준 젠킨스 최신 LTS 버전은 2.462.1이며 Java 17을 사용한다

https://hub.docker.com/r/jenkins/jenkins

 

 

일단 Jenkins 띄워보기

가볍게 시작해보면서 어떤 식으로 컨테이너에서 젠킨스가 동작하고 있는지 확인해보자

compose.yml

services:
  jenkins:
    image: jenkins/jenkins:2.462.1-lts-jdk17
    container_name: jenkins
    ports:
      - "80:8080"

 

$ docker compose up

 

눈여겨봐야할 로그는 아래와 같다

..
jenkins  | Running from: /usr/share/jenkins/jenkins.war
jenkins  | webroot: /var/jenkins_home/war
..
jenkins  | 2024-09-02 03:23:10.330+0000 [id=1]	INFO	hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
jenkins  | 2024-09-02 03:23:10.453+0000 [id=1]	INFO	o.e.j.s.handler.ContextHandler#doStart: Started w.@316a598d{Jenkins v2.462.1,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
jenkins  | 2024-09-02 03:23:10.465+0000 [id=1]	INFO	o.e.j.server.AbstractConnector#doStart: Started ServerConnector@6b7906b3{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
..
jenkins  | Please use the following password to proceed to installation:
jenkins  |
jenkins  | c50318b70c7441c599b1086cd99fedef
..
jenkins  | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
..

 

Workspace는 /var/jenkins_home이고 모든 데이터, 플러그인, 설정들이 이곳에 생성된다

https://github.com/jenkinsci/docker/blob/master/README.md

 

컨테이너에 안을 들어가보자

$ docker exec -it jenkins /bin/bash

jenkins@a64665d997bd:/$

 

 

$ users

아무 것도 출력되지 않음

 

$ id -u

1000

 

$ id

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)

 

$ java --version

openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment Temurin-17.0.12+7 (build 17.0.12+7)
OpenJDK 64-Bit Server VM Temurin-17.0.12+7 (build 17.0.12+7, mixed mode)

 

$ cat /opt/java/openjdk/release

JAVA_VERSION="17.0.12"

/opt/java/openjdk 폴더에 JDK 17이 있고 젠킨스를 실행할 때 이걸 사용한다

 

$ ps -ef | grep jenkins

jenkins        1       0  0 03:23 ?        00:00:00 /usr/bin/tini -- /usr/local/bin/jenkins.sh
jenkins        7       1  9 03:23 ?        00:00:23 java -Duser.home=/var/jenkins_home -Djenkins.model.Jenkins.slaveAgentPort=50000 -Dhudson.lifecycle=hudson.lifecycle.ExitLifecycle -jar /usr/share/jenkins/jenkins.war

UID 1000으로 젠킨스가 실행된다

 

$ pwd

/

 

$ ls -l /var/jenkins_home

total 52
-rw-r--r--  1 jenkins jenkins 1663 Sep  2 03:23 config.xml
-rw-r--r--  1 jenkins jenkins  108 Sep  2 03:23 copy_reference_file.log
-rw-r--r--  1 jenkins jenkins  156 Sep  2 03:23 hudson.model.UpdateCenter.xml
-rw-r--r--  1 jenkins jenkins  171 Sep  2 03:23 jenkins.telemetry.Correlator.xml
drwxr-xr-x  2 jenkins jenkins 4096 Sep  2 03:23 jobs
-rw-r--r--  1 jenkins jenkins 1037 Sep  2 03:23 nodeMonitors.xml
drwxr-xr-x  2 jenkins jenkins 4096 Sep  2 03:23 plugins
-rw-r--r--  1 jenkins jenkins   64 Sep  2 03:23 secret.key
-rw-r--r--  1 jenkins jenkins    0 Sep  2 03:23 secret.key.not-so-secret
drwx------  2 jenkins jenkins 4096 Sep  2 03:23 secrets
drwxr-xr-x  2 jenkins jenkins 4096 Sep  2 03:23 updates
drwxr-xr-x  2 jenkins jenkins 4096 Sep  2 03:23 userContent
drwxr-xr-x  3 jenkins jenkins 4096 Sep  2 03:23 users
drwxr-xr-x 10 jenkins jenkins 4096 Sep  2 03:23 war

 

파일들을 UID 1000이 소유하고 있다

 

 

젠킨스 설정과 사용자 데이터를 Host에 저장하기

compose.yml

호스트 디렉터리를 데이터 볼륨으로 마운트한다

..
    volumes:
      - /경로/jenkins/jenkins_home:/var/jenkins_home

 

$ docker compose up

..
jenkins  | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins  | INSTALL WARNING: User:  missing rw permissions on JENKINS_HOME: /var/jenkins_home
jenkins  | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins exited with code 1

 

컨테이너 내부 사용자가 호스트 머신의 폴더에 대한 권한을 가지지 못한다

그리고 jenkins_home 디렉터리가 생성은 되는데 root:root 권한을 가진다

 

$ sudo rm -r jenkins_home

 

디렉터리를 직접 생성하고 UID 1000에 대한 권한을 줘야 한다

 

숫자인 uid를 쓰기보다 사용자명을 쓰는 것이 유지보수에 좋으니, 먼저 사용자를 추가한다

$ sudo useradd jenkins_home -u 1000

 

또는

$ sudo vi /etc/passwd

jenkins:x:1000:그룹ID번호:jenkins on docker:/usr/sbin/nologin

그룹ID번호는 0으로?

 

$ mkdir jenkins_home

$ sudo chown jenkins jenkins_home

 

$ docker compose up

이제 정상적으로 실행이 된다

 

 

젠킨스에 접속하기

http://IP

(80 포트로 접속)

 

관리자 패스워드를 입력해야 하는데 로그에 출력된 값 또는 컨테이너 내에서 아래 파일의 내용을 입력하여 젠킨스에 접속하자

 

$ docker exec -it jeknins /var/bash

$ cat /var/jenkins_home/secrets/initialAdminPassword

 

 

컨테이너 내 시간설정을 한국 시간으로 변경

젠킨스에서 보여지는 시간이 맞지 않는 것을 확인했다

 

$ date

Thu Sep 12 22:59:37 UTC 2024

 

컨테이너 설정이 필요하다

 

compose.yml

services:
  jenkins:
    ..
    environment:
      - TZ=Asia/Seoul

 

위와 같이 환경 설정을 추가한다

 

compose.yml을 바꾼 후 docker compose up을 다시 실행하면 설정이 반영된다

 

$ date

Fri Sep 13 08:00:09 AM KST 2024