Jenkins를 사용하면서 Execute Shell 단계에서 다음과 같은 오류를 만난 적이 있습니다.
FATAL: Unable to produce a script file
java.nio.charset.UnmappableCharacterException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:275)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:307)
...
Caused: java.io.IOException: Failed to create a temp file on /var/lib/jenkins/workspace/...
이 오류는 임시 파일을 생성하는 과정에서 발생했으며, 이를 해결하기 위해 몇 가지 단계를 거쳤습니다. 이 글에서는 문제 원인과 해결 방법을 공유합니다.
1. 문제 원인
이 오류는 Jenkins가 쉘 스크립트를 실행하기 위해 임시 파일을 생성하려고 할 때 발생합니다. 주요 원인은 다음과 같습니다:
- Jenkins가 사용하는 임시 디렉터리의 권한 문제.
- Java 인코딩 설정이 맞지 않음.
- Jenkins 작업 디렉터리에서 임시 파일 생성 실패.
2. 해결 방법: 임시 디렉터리 변경
Jenkins가 사용하는 임시 디렉터리를 명시적으로 설정하고, 적절한 권한을 부여하면 문제를 해결할 수 있습니다.
1단계: Jenkins 설정 파일 수정
Amazon Linux 2에서는 Jenkins 설정 파일이 /usr/lib/systemd/system/jenkins.service에 위치합니다.
설정 파일을 열어 수정합니다
sudo vi /usr/lib/systemd/system/jenkins.service
Environment 블록에 다음 내용을 추가합니다
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.io.tmpdir=/tmp/jenkins_tmp -Dfile.encoding=UTF-8"
2단계: 임시 디렉터리 생성 및 권한 설정
새로 정의한 임시 디렉터리(/tmp/jenkins_tmp)를 생성하고, Jenkins 사용자에게 적절한 권한을 부여합니다.
디렉터리 생성 및 Jenkins 권한 부여
sudo mkdir -p /tmp/jenkins_tmp
sudo chown -R jenkins:jenkins /tmp/jenkins_tmp
3단계: Jenkins 재시작
Jenkins 설정을 적용하려면 서비스를 재시작해야 합니다.
sudo systemctl daemon-reload
sudo systemctl restart jenkins
sudo systemctl status jenkins