우리 조직 전체에서 Jenkins 2.303.1을 로컬로 실행합니다. 우리는 매일 수천 개의 빌드를 실행합니다. 제가 작업 중인 프로젝트는 Jenkins 마스터와 약 10개의 빌드 노드 세트를 사용합니다. 우리는 유사한 아키텍처로 수백 개의 Maven/Java/Spring 애플리케이션을 구축했습니다.
빌드 프로세스 중에 java, mvn 및 기타 도구가 포함된 "도구 이미지"가 있습니다.
어제 우리는 사용해야 하는 몇 가지 추가 도구가 포함된 도구 이미지의 업데이트된 버전을 참조하기 위해 빌드 프로세스를 업데이트했습니다. 업데이트를 수행한 직후 우리는 빌드가 모두 같은 방식으로 실패하는 4개의 빌드 노드가 있음을 확인했습니다. 대략적인 명령줄과 출력은 다음과 같습니다.
+ bash -o pipefail -c mvn -U -s ... -Duser.home=/ clean compile test-compile 2>&1 | tee mvn.out
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
이 명령은 "sh" 파이프라인 단계에서 실행됩니다.
이 오류 메시지는 "mvn" 스크립트 내부에서 발생합니다. 존재하지 않는 것으로 확인되면 $JAVA_HOME/bin/java
이 오류가 발생합니다.
그런 다음 이 전에 몇 가지 "sh" 호출을 추가하여 다음을 표시했습니다.
which java
which mvn
ls -lt $JAVA_HOME/bin/java
"잘못된" 노드에서 처음 두 명령의 결과는 모두 빈 문자열입니다. 이는 "java" 및 "mvn"이 PATH에 없거나 실행 가능하지 않음을 의미합니다. "good" 노드에서는 "java" 및 "mvn" 실행 파일의 예상 위치를 인쇄합니다.
세 번째 명령의 출력은 다음과 같습니다.
-rwxr-xr-x. 1 root root 12768 Oct 17 21:48 /opt/java/openjdk/bin/java
그 전에 "env" 출력도 추가했습니다. 이는 "JAVA_HOME"이 " /opt/java/openjdk
"와 동일하고 PATH에 Java 배포판의 mvn 및 bin 디렉터리가 포함되어 있음을 보여줍니다 .
증거는 여러 가지 요인을 시사하지만 종합해 보면 말이 되지 않습니다. "mvn" 스크립트는 분명히 $JAVA_HOME/bin/java
그것이 존재하지 않는다고 불평하지만, sh 출력은 그것이 존재한다는 것을 분명히 보여줍니다. " which mvn
" 출력은 "mvn"이 PATH에 없다는 것을 나타내지만 위의 bash 명령줄은 절대 경로 없이 "mvn"만 실행하므로 도달할 수 있는 유일한 방법은 PATH에서 오는 것입니다. 그렇지 않으면 "mvn" 스크립트 내부에서 오류 메시지가 인쇄되지 않습니다.
"양호한" 노드에서 실행되는 빌드와 "불량" 노드에서 실행되는 빌드의 여러 측면을 비교하려고 합니다. 예를 들어, 두 환경 변수 목록을 복사하여 비교한 결과 큰 차이점이 발견되지 않았습니다.
잘못된 빌드 노드를 다시 시작해 보았습니다. 전체 로컬 도커 캐시를 지우고 도커를 다시 시작해 보았습니다. 이 단계 중 어느 것도 아무런 변화를 가져오지 않았습니다.
나는 이 문제를 설명하기 위해 탐구할 수 있는 모든 가능한 영역에 대한 아이디어를 찾고 있습니다. Jenkins 빌드 노드를 유지 관리하는 사람, 도구 이미지를 유지 관리하는 사람, 그리고 광범위한 경험을 가진 다른 여러 사람을 포함하여 오랫동안 이 문제를 관찰해 온 여러 사람이 있습니다. 우리는 모두 여기에 공백을 그리고 있습니다.