Jenkins

Helm으로 배포한 Jenkins 인코딩 설정

비번변경 2022. 5. 21. 18:46

온프레미스 쿠버네티스 환경에 HelmRelease로 설치한 Jenkins를 사용 중이다.

최근 한글 처리가 정상적으로 이뤄지지 않는 것 같아 확인해보니 인코딩이 ANSI로 설정되어 있었다. 

이 설정을 UTF-8로 변경해보려고 한다.

 

Helm Chart 정보

 

참고로 Jenkins 버전은 2.303.1이다.

 

인코딩 설정 확인

Jenkins 관리 > System Information : 시스템 정보로 접근하면 확인할 수 있다.

바로 시스템 정보 페이지로 가고 싶다면 jenkins URL 끝에 /systemInfo를 붙이면 된다.

file.encoding이 ANSI_X3.4-1968로 설정되어 있는 것을 확인할 수 있다.

 

Jenkins 인코딩

Jenkins는 ANSI 형식으로 문자열을 전달하는데, Jenkins를 실행하는 JVM은 입출력으로 변환되는 데이터를 -Dfile.encoding 옵션으로 지정한 인코딩으로 변경한다.

따라서 JAVA 실행 옵션에 -Dfile.encoding=<ENCODING>과 같이 지정하여 인코딩을 명시적으로 설정할 수 있다.

 

Ubuntu에 설치한 경우

주로 환경 변수 LANG에 의해 결정되거나 설정 파일을 통해 인코딩 설정을 넘기는 것 같다. 직접 설정을 변경해보지 않아서 잘 모르겠지만…… Ubuntu는 /etc/default/jenkins 파일의 JAVA_ARGS 옵션에 값을 추가하면 되지 않을까 싶다.

# defaults for Jenkins automation server
# pulled in from the init script; makes things easier.
NAME=jenkins
# arguments to pass to java
# Allow graphs etc. to work even when an X server is present
JAVA_ARGS="-Djava.awt.headless=true"

 

도커의 경우

Jenkins Dockerfile 70번째 줄을 보면 ENTRYPOINT 명령문에 의해 /bin/tini -- /usr/local/bin/jenkins.sh라는 명령을 실행하는 것을 알 수 있다.

 

그리고 /usr/local/bin/jenkins.sh 스크립트를 보면 docker run 시 전달한 매개변수 중 환경 변수 JAVA_OPTS 값을 읽어, java 실행 옵션으로 전달한다는 것을 알 수 있다.

#! /bin/bash -e

: "${JENKINS_HOME:="/var/jenkins_home"}"
touch "${COPY_REFERENCE_FILE_LOG}" || { echo "Can not write to ${COPY_REFERENCE_FILE_LOG}. Wrong volume permissions?"; exit 1; }
echo "--- Copying files at $(date)" >> "$COPY_REFERENCE_FILE_LOG"
find /usr/share/jenkins/ref/ \( -type f -o -type l \) -exec bash -c '. /usr/local/bin/jenkins-support; for arg; do copy_reference_file "$arg"; done' _ {} +

# if `docker run` first argument start with `--` the user is passing jenkins launcher arguments
if [[ $# -lt 1 ]] || [[ "$1" == "--"* ]]; then

  # read JAVA_OPTS and JENKINS_OPTS into arrays to avoid need for eval (and associated vulnerabilities)
  java_opts_array=()
  while IFS= read -r -d '' item; do
    java_opts_array+=( "$item" )
  done < <([[ $JAVA_OPTS ]] && xargs printf '%s\0' <<<"$JAVA_OPTS")

  jenkins_opts_array=( )
  while IFS= read -r -d '' item; do
    jenkins_opts_array+=( "$item" )
  done < <([[ $JENKINS_OPTS ]] && xargs printf '%s\0' <<<"$JENKINS_OPTS")

  exec java "${java_opts_array[@]}" -jar /usr/share/jenkins/jenkins.war "${jenkins_opts_array[@]}" "$@"
fi

# As argument is not jenkins, assume user want to run his own process, for example a `bash` shell to explore this image
exec "$@"

따라서 도커로 jenkins를 실행하는 경우에는 아래와 같이 -Dfile.encoding 설정을 전달할 수 있다.

docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /app/jenkins:/var/jenkins_home \
-u root -e JAVA_OPTS='-Dfile.encoding=UTF-8' \
jenkins/jenkins:lts

 

 

Helm의 경우

Helm Chart는 values.yaml 파일을 수정함으로써 배포할 애플리케이션의 설정을 수정할 수 있다.

사용 중인 jenkins chart에서 JAVA_OPTS 환경변수는 values.yaml의 134번째 줄에 해당한다. 주석을 풀고 아래와 같이 수정하여 적용하면 된다.

... 생략 ...
# Environment variables that get added to the init container (useful for e.g. http_proxy)
  # initContainerEnv:
  #   - name: http_proxy
  #     value: "http://192.168.64.1:3128"
  # containerEnv:
  #   - name: http_proxy
  #     value: "http://192.168.64.1:3128"
  # Set min/max heap here if needed with:
  javaOpts: "-Dfile.encoding=UTF-8"
  # jenkinsOpts: ""
  # jenkinsUrl: ""
... 생략 ...

 

 

 

참고 문서

https://linuxism.ustd.ip.or.kr/420

https://support.cloudbees.com/hc/en-us/articles/209715698-How-to-add-Java-arguments-to-Jenkins-