알고리즘/항해99

99클럽 코테 스터디 1일차 TIL + 해시(를 가장한 Jenkins 플러그인 오류)

IamBD 2024. 5. 20. 22:46

오늘의 과제

프로그래머스 Lv.2 전화번호 목록... 이지만

1일차부터 이미 푼 문제가 등장해 주제는 바로....

 

구형 플러그인을 신버전 Jenkins에서 사용하기!

SI 프로젝트 도중 17년도에 개발한 소스를 그대로 고객사에 구축해야 하는 업무가 주어졌습니다.

 

모든 Job은 FreeStyle로 구성되어 있으며 핵심 로직은 Global Post Script를 통해

모든 Job 시작 및 종료시 Http를 통해 배포 시스템과 연동하는 것이었습니다.

 

https://plugins.jenkins.io/global-post-script/

 

Global Post Script

This plugin execute a script configured in global configure after all builds, all jobs.<br /> <b>Caution: jython script supports removed since 1.1.0</b>

plugins.jenkins.io

(현재는 수정되지 않은 보안 이슈로 인해 사용하지 않는것이 추천된다고 합니다)

 

해당 플러그인의 목적은 단순히 시작과 끝남을 감지하여 Http로 알려주는게 끝이기 때문에 대안은 얼마든지 있으나

"있던거 써. 데드라인 넘어가면 책임질래?" 라는 압박에 사원 나부랭이는 그저 있는것을 쓰기 위해 발버둥을 칩니다.

 

Jenkins는 소스와 달리 최신 버전으로 설치 해달라는 고객 요구에 따라 얌전히 서버에 셋팅 후 배포 시스템과 연결하여

원격으로 Job을 실행시키고 Jenkins의 호출을 기다리고 있는데 응답이 없습니다.

 

java.lang.ClassNotFoundException: org.apache.commons.httpclient.Credentials

분명 잠깐이지만 이전 시스템에 대한 SM 지원도 해봤고 서버 이관시 혼자 직접 셋팅까지 다 해봤을 때 보지 못했던

문제점인데 젠킨스에서는 뜬금없이 플러그인에서 위 에러를 뱉고 있었습니다.

 

열심히 구글링을 해보다가 github 에 한 이슈 중에 원인을 찾았습니다.

Jenkins no longer bundles a patched version of the deprecated Commons HttpClient 3.x library for use by plugins.
Plugins should be migrated to the native Java 11 HTTP client or updated to depend on the legacy Commons HttpClient 3.x API plugin.

 

그렇습니다. 2.379 버전부터 해당 라이브러리는 젠킨스에서 기본적으로 제공하지 않아 발생한 오류였습니다.

 

이전 서버 이관 작업시에는 구형 버전 그대로 설치했기 때문에 같은 오류가 발생하지 않았던 것이고

이번 케이스는 구형 플러그인 + 최신 젠킨스로 인해 발생한 오류였습니다.

 

이제 원인을 알았으니 간단히 저 라이브러리를 포함해 해결해보도록 합니다.

 

젠킨스에서 직접적으로 제공해주진 않으나 친절하게 해당 라이브러리를 사용할 수 있는 플러그인은 제공되고 있습니다.

https://plugins.jenkins.io/commons-httpclient3-api/

 

Commons HttpClient 3.x API

This plugin provides a <a href="https://github.com/jenkinsci/lib-commons-httpclient" target="_blank" rel="nofollow noopener noreferrer">patched version</a> of the deprecated <a href="https://hc.apache.org/httpclient-legacy/" target="_blank" rel="nofollow n

plugins.jenkins.io

 

위 플러그인을 설치 후 오류가 발생하고 있는 global post script를 clone받아 pom.xml에 해당 의존성을 추가해줍니다.

<dependency>
  <groupId>io.jenkins.plugins</groupId>
  <artifactId>commons-httpclient3-api</artifactId>
  <version>3.1-3</version>
</dependency>

 

그리고 메이븐 install을 눌러주면...

 

httpclinet 에러가 무섭지 않은 나만의 플러그인 설치파일이 생겨났습니다!

 

다행히 위 플러그인 파일로 설치 후 같은 에러는 발생하지 않고 무사히 해당 업무를 마칠 수 있었습니다.

 

 

배운점

현재 회사에서 고객사 CI/CD 환경을 구축해주는 업무를 주로 하면서도

한 번도 Jenkins 플러그인을 직접 내려받아 고쳐볼 생각은 꿈에도 해본적이 없었습니다.

 

이번에는 단순히 의존성 하나를 추가하는 일이었으나 사용하는 플러그인에 뭔가 1%의 부족함을 느낄 때

직접 수정할 수도 있겠구나? 혹은 직접 소스를 보고 분석할 수 있겠구나 ?라는 한 가지의 길을 얻었습니다.

 

사실 SI 업무를 진행하며 Github를 그저 "내 코드 저장소"로만 생각하고 있었는데 이번 이슈로 인해 오픈 소스들은

Github에 "오픈"되어 있으며 누구나 열람할 수 있다. 라는 무척 중요한 사실을 잊고 살았던 것 같습니다.

 

 

 

그래서 결론은...

 

겁 먹지 말고 코드를 씹고 뜯고 맛보고 즐기자!