WEB

[Jenkins] Jenkins 인증 초기화와 마이그레이션

긍.응.성 2024. 6. 16. 14:22
반응형

Jenkins의 계정정보를 잃어버려 이를 복구하며 겪었던 삽질에 대한 내용과, 마이그레이션까지 진행했던 절차에 대해 정리한 글입니다.

1. 개요

저희 팀에서는 배치 작업 외 PR 요청 시 브랜치 테스트, 일별 메인 브랜치의 테스트 커버리지 측정, 배포 전 소스 컴파일 및 빌드 등 다양한 용도로 Jenkins를 사용중입니다.

보통 배치 Job을 개발하여 등록하는 경우가 아니라면 초기 세팅 후엔 Jenkins에 접근할 일이 별로 없습니다. 이번에 사용하던 애플리케이션 빌드 시 maven 버전의 업그레이드가 필요하여 이를 세팅하기 위해 오래간만에 Jenkins 접근하였다가 인증 정보가 만료되어 로그인이 되지 않는 이슈가 있었습니다.

하지만 Jenkins 서버가 설치된 장비에 직접 접근할수만 있다면 복구할 수 있는 방법이 있습니다.

추가적으로 만약 복구를 위해 플러그인을 만지작 거리다가 재부팅이나 Job 실행 시 호환성 문제로 Jenkins가 이전처럼 동작하지 않을 수 있는데요(제가 그랬습니다…), 이런 경우엔 다른 Jenkins로 Job들을 마이그레이션하는 방법에 대하여 정리하였습니다.

2. Jenkins 인증 초기화

2.1. 설정 수정

Jenkins의 홈 디렉터리에는 config.xml 파일이 존재합니다.

홈 디렉터리는 일반적으로 패키지 매니저등을 통해 설치하였다면 /var/lib/jenkins/ 로, war 파일을 통해 실행하였다면 ~/.jenkins/ 로 지정됩니다.

config.xml 파일은 Jenkins 관리 중 시스템 설정, 보안 등 메뉴의 설정에서 볼 수 있는 값들이 저장된 파일인데요, 파일을 열어보면 useSecurity 속성을 확인할 수 있습니다. useSecurity 는 보안에 대한 설정을 on, off 하는 설정입니다. 로그인 정보를 잃어버린 상황에서는 useSecurity 값을 false로 세팅하여 인증 체크를 하지 않도록 수정합니다.

<!-- false로 변경 
	<useSecurity>true</useSecurity>
-->
<useSecurity>false</useSecurity>

 

이전에 보안 설정이 되어있었다면 authorizationStrategy, securityRealm 속성이 존재할텐데요, 이 속성도 함께 제거합니다. 이 속성들을 제거하지 않으면 설정을 적용하더라도 로그인 창이 노출되게 됩니다.

2.2. 재부팅 및 보안 설정

config.xml 파일 수정이 완료되었다면 Jenkins 를 재시작하여 설정을 적용시킵니다.

systemctl restart jenkins 또는 실행된 커맨드를 확인하여 프로세스를 kill 하고 재구동합니다.

재시작된 Jenkins에 접속하면 로그인 과정없이 접근됨을 확인할 수 있습니디.

이제 다시 Jenkins 설정을 통해 보안 설정을 진행합니다. 보안 관련 설정은 Jenkins 관리 → Configure Global Security 메뉴에서 설정할 수 있습니다

3. Jenkins 마이그레이션

위의 복구 방법에 따라 진행한다면 여기까지 볼 일은 없을 것입니다. 하지만 위 과정을 모른채로 설정을 바꾸거나 플러그인들을 만지작 거리다보면 되돌릴 수 없는 상황에 오게 됩니다… 저같은 경우 잘못 플러그인 업데이트를 돌렸다가 다시는 이전으로 돌아갈 수 없는 상황이 되었습니다. 업데이트 된 플러그인들의 호환성 + jdk 버전 이슈로 앱이 뜨지 않았고, 띄워도 Job 수행 시 계속 실패하였습니다.

그래서 아예 새로 Jenkins를 구축하고 노가다 방지를 위해 최대한 설정들을 가져올 수 있도록 하였습니다.

이 과정에서는 두개의 Jenkins가 사용되는데요 혼란을 줄이기 위해 복사할 Job이 있는 Jenkins를 from , Job을 붙여넣기할 Jenkins를 to라고 부르겠습니다.

3.1. Job Import Plugin

Job Import 플러그인을 이용하면 from Jenkins의 Job들을 to Jenkins로 손쉽게 옮길 수 있습니다.

그러나 Job 이외의 것들은 옮겨주지 않기 때문에 아래와 같은 것들은 사용자가 직접 설치/설정 하여야 합니다.

  • Credentials
  • Plugins
  • Tools (JDK, Maven, nodejs, …)

플러그인이 설치되면 홈화면의 왼쪽 메뉴에 Job Import Plugin 이 보이게 되는데요, Job Import Plugin을 사용하기 위해선 먼저 export할 Jenkins 서버의 정보를 입력해야합니다.

Jenkins 관리 → 시스템 설정 으로 들어가서 Job Import Plugin 항목에서 add remove Jenkins 버튼을 눌러 from Jenkins 정보를 입력합니다.

이제 from Jenkins가 등록되었으니, 왼쪽 메뉴의 Job Import Plugin 를 통해 Job을 가져옵니다.

버전이 너무 낮아요…

하지만 이 방법은 from Jenkins의 버전에 따라 사용하지 못할 수 있습니다. 1버전대 Jenkins에서 Job Import Plugin을 설치하려하면 아래와 같이 WARNING 메시지가 출력되는것을 확인할 수 있습니다.

(2.107.3 버전 이후에 만들어진 플러그인이라 동작에 대해 보장하지 못한다는 안내가 노출됩니다)

3.2. Jenkins File Copy

수동으로 기존 Jenkins에서 Job을 마이그레이션 하는 방법입니다.

이 방식은 개인에 따라 다르게 처리할 수도 있을텐데요, 개인적으로 제가 수행했던 방법에 대하여 공유드리려 합니다.

Jenkins 홈에는 jobs 디렉터리가 있는데요 해당 디렉터리에 Jenkins가 관리하는 job에 대한 모든 정보가 들어있습니다. 확인해본결과 Jenkins 버전이 올라가도 기본적으로 Job 디렉터리의 구조는 비슷한데요, from의 jobs 디렉터리를 압축하여 ftp에 업로드하고, to 에서 그 다운로드 받아 jobs 디렉터리로 대체하는 방법입니다.

(저는 Jenkins 1.651.1 버전부터 2.235.3 버전으로 마이그레이션 하였습니다.)

  1. from Jenkins의 홈 디렉터리에서 jobs 정보를 압축합니다.
    • tar cvf jobs.tar /jobs
  2. 압축한 jobs.tar를 to 서버로 이동하기 위해 ftp 에 업로드합니다.
  3. to Jenkins에서 jobs.tar를 다운로드합니다

Pod 으로 띄운 Jenkins에 대해서는 kubectl cp 커맨드를 통해 jobs.tar를 Jenkins 홈 디렉터리에 전달한 후, Pod에 접속하여서 압축을 풀고 ${JENKINS_HOME}/jobs 디렉터리를 세팅해주었습니다.

kubectl cp jobs.tar {jenkins_pod}:${JENKINS_HOME}
kubectl exec -it {jenkins_pod} -- bash # pod에 접속하여 다운로드 받은 파일에 대하여 처리합니다

4. 정리

이번 글을 작성하며 느낀점이 있다면, 이것저것 건들여 보는것보다 확실하게 방법을 찾고 진행하자 입니다. 괜히 플러그인을 건들였다가 해결못한 디버깅들로 이어지고 결과적으로 재설치 및 마이그레이션까지 진행하게 되었는데, Jobs을 마이그레이션 하는것 보다 Job에 대한 Credential을 다시 세팅하고, 배포 툴과 Jenkins Job을 연동하는 작업까지 부가적으로 든 공수를 합하면 하루가 꼬박 걸렸습니다.

인터넷에 찾아보니 이미 해결책들도 많이 있고 좋은 자료들이 많았기에 반성하면서도 한편으로는 Jenkins의 내부 구조에 대해 이전보다 깊이 알게된것 같네요. 이 글을 읽는 사람들은 저와 같은 실수를 반복하지 않길 빕니다.

긴 글 읽어주셔서 감사합니다.

5. 참고링크

반응형