Jenkins - Pipeline (2) 파이프라인 구축 시 만났던 문제들
Github Action CD 스크립트를 작성했던 경험덕분에 엄청나게 헤매진 않았습니다. 다만 해결 방법이 동일하진 않았기 때문에 정리해보려고 합니다.
목차
1. Global Tool Configuration
2. 설정 파일 서빙하기
3. 파이프라인 실행 속도가 느린 상황
4. 권한 관리 2023-05-10 추가
Global Tool Configuration
해당 텝에서는 빌드 툴과 관련된 설정을 합니다. 또한 Jenkins 은 자바로 작성되어 있기 때문에 해당 페이지에서 JDK를 설정할 수도 있습니다. 하지만 저는 Jenkins을 설치하면서 JDK를 설치했기 때문에 내용은 생략했습니다.
참고로 JDK17로 설치하는게 이래저래 편한 것 같습니다. 11로 설치할 경우 빌드 과정에서 스프링 부트가 3.x 라면 자바 17이상으로 작성되었을 것이기 때문에 문제가 발생합니다.
jenkins 관리 페이지로 들어간 다음 Global Tool Configuration으로 이동합니다.
Gradle을 설정합시다. name 옆에 보이는 물음표 버튼을 누르면 name에 대한 설명이 나옵니다.
버전 명을 명시해야 하는 것 같습니다. 저는 아무렇게나 적었다가 문제가 발생해서 애먹었습니다. ㅎㅎ
만약 JDK가 설치되어 있지 않다면 혹은 maven을 사용한다면 이 탭에서 설정하시면 됩니다.
설정 파일 서빙하기
일반적으로 yml, properties 파일에는 노출이 되면 안되는 정보들도 담기기 때문에 .gitIgnore에 등록됩니다. 그렇기 때문에 프로젝트를 따와도 설정 파일이 존재하지 않습니다.
Github Action을 사용할 때는 아래와 같은 식으로 Action 전용 변수들을 만들어 사용했습니다.
Jenkins에도 이와 비슷한 기능으로 credentials이 존재합니다. jenkins 관리 페이지로 들어간 뒤 Credentials으로 이동합니다.
이후 Credentials을 추가합니다. credentials 종류가 다양합니다. 설정 정보는 Secret file을 선택해야 합니다. GitHub Action의 Secret 처럼 안에 있는 값들을 복사해서 설정할 수 없습니다. (제 경우에는 그랬습니다.)
이후 아래처럼 리디렉션을 통해 파일을 덮어씌우면 됩니다.
sh "$TEST_PROPERTIES > ./src/test/resources/application.properties"
파이프라인 실행 속도가 느린 상황
파이프라인 처음 실행 시 매우 느리더라구요. 처음에는 실행시켜놓고 다른 일을 하고 있었는데 1시간에 넘어서도 Build stage가 수행되지 않았고 2시간 후에는 테스트 케이스와 설정 파일간에 문제가 생겨서 결국 실패했습니다.
저는 EC2 스펙업을 통해 이 문제를 해결했습니다. 첫 빌드에만 t2.micro 보다 더 많은 메모리 혹은 더 많은 메모리와 더 좋은 CPU를 가진 인스턴스로 변경해보시면 훨씬 빠르게 파이프라인을 마무리지을 수 있었습니다. 이후에는 다시 프리티어에서 사용가능한 t2.micro로 돌아오면 됩니다.
2023-05-10 내용 추가
t2.micro로 다운그레이드하니 CD까지 약 1시간 정도 걸렸습니다. 많은 해결책이 있겠지만 비용과 Jenkins 학습을 고려했을 때 트리거를 merge가 아니라 자고있는 시간에 걸으려고 합니다.
권한 관리
파이프라인을 수동 실행할 일이 있어서 젠킨스 서버에 가서 실행을 눌렀습니다. 엥? 로그인을 안했는데도 실행이되는구나... 이거 문제다. 젠킨스 권한과 관련된 글은 https://www.bearpooh.com/115 정리가 잘 되어 있어 링크를 남기도록 하겠습니다. 저는 1인 프로젝트기 때문에 복잡한 설정은 필요없습니다. 로그인 한 유저만 모든 작업을 수행할 수 있도록 하는 설정만 해보겠습니다.
Jenkins 관리 페이지에서 Configure Global Security로 이동합니다.
이후 Authorization을 Logged-in users can do anything 으로 변경합니다.
해당 옵션을 선택하면 아래와 같이 Allow anonymous read access 체크박스가 생깁니다. 저는 굳이 익명사용자에게 읽기 권한을 줄 이유가 없어 해제했습니다.
설정을 완료합니다. 이제 로그인 되어 있지 않은 경우 어떤 리소스에도 접근할 수 없습니다. 만약 권한이 없다면 아래와 같이 로그인 페이지로 리다이렉션 됩니다.