[Spring Boot] CI/CD w/ Docker + Jenkins in GitLab - Trouble Shooting

CNH·2024년 1월 27일

개발

목록 보기
9/17
post-thumbnail

1. 초기 Jenkins 설치

ec2에 docker 설치하고 docker pull을 이용해서 jenkins도 설치했는데 :8080 포트가 안 열렸다.

해결 : 그냥 서버에 포트를 열지 않아서였다.. 젠킨스 기본포트도 8080인데 스프링부트도 8080이니가 젠킨스를 9090으로 바꿨다.

2. 초기 Jenkins 환경설정

보통 블로그들을 보면 플러그인들이 자동으로 잘 설치되는데 나는 아래처럼 설치가 잘 안되었다.

해결 : 사실 어떻게 해결했는지 잘 모르겠다.. 여러 블로그들을 뒤져보고 여러 설정들을 좀 만져봤다.

  1. groupadd -f docker, sudo usermod -aG docker ubuntu를 함.
  2. mkdir jenkins 를 하고 sudo chown 1000 jenkins를 함.
  3. 그러고 docker run -d -p 9090:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root -v /var/run/docker.sock:/var/run/docker.sock --privileged jenkins/jenkins를 함

아마도 jenkins폴더를 만들지 않아서..? 아니면 현재 사용자(ubuntu)를 docker 그룹에 안넣어서,,,? 모르겠다.

3. pipeline 작성

Jenkinsfile에서 파이프라인 명령어 작성 시 처음에는 chmod +x gradlew 이렇게 썼던 것을 sh로 감싸서 sh 'chmod +x gradlew' 로 해결 (코치님 도움)
오류내용 :

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 18: unexpected char: 0xFFFF @ line 18, column 2.
   }
    ^

4. Jenkinsfile, Dockerfile 작성

직접 터미널에서 docker을 이용한 수동 배포를 먼저 해보고 조금 감을 잡음. Dockerfile에는 다른 블로그들 신경쓰지 말고 예전에 깃헙액션 했던것처럼 .jar파일 배포만 하면 된다고 생각하여 해결.

5. 디렉토리 문제

테스트할때는 깃랩 프로젝트에서 root가 바로 프로젝트였지만 실제 싸피 프로젝트에서는 server 폴더 안에 들어가야 있었다. 별거 아니라고 생각했지만 Jenkinsfile에 한줄 한줄이 다 막혔다. (Directory '/var/jenkins_home/workspace/Backend' does not contain a Gradle build. 이런 오류) 처음에는 ./gradlew이 아닌 ./server/gradlew 이런식으로 하나하나 다 바꿨다가 다 바꿔도 뭔가 뒤에서 돌아가는? 일들까지도 경로를 일일이 설정해줄 수 없어 Dockerfile과 setting.gradle 파일만 root디렉토리로 빼거나 했는데 의외로 GPT가 쉽게 해결해줬다.

6-1. 환경변수 설정 문제

sh './gradlew clean build -DJASYPT_KEY=${JASYPT_KEY}' 이렇게 빌드 시 환경변수를 전달하고자 했지만 오류 (GPT 참고)

해결
1. 구글링을 통해 비슷하지만 다른 방법 찾음

  1. 1번 내용대로 하려고 했지만 뭔가 작동이 잘 안됨

    어떻게어떻게 하다가 위 명령을 GPT한테 물어보고, GPT가 고쳐준대로 실행하니까 해결됨
  2. 이제 스프링 프로젝트의 application.properties파일에서 ${JASYPT_KEY}이렇게 사용 가능.

6-2. 환경변수 설정 문제

이렇게 해서 위의 ./gradlew clean build 부분은 통과했지만, 이 밑에 도커 build가 자꾸 실패했음.

해결
난 처음 에 ./gradlew clean build할 때 환경변수를 설정해 줬으니 Dockerfile에서 java -jar할 때 환경변수를 따로 설정해줄 필요가 없다고 생각했으나, 오산이었음. Jenkinsfile에서 docker build 할 때도
sh 'docker build --build-arg JASYPT_KEY=${JASYPT_KEY} -t backend-jenkins .' 처럼 환경변수 설정이 필요하고, Dockerfile 내에서도 ENTRYPOINT ["java", "-DJASYPT_KEY=${JASYPT_KEY}", "-jar", "app.jar"] 처럼 환경변수 설정이 필요했다..

헷갈리는 부분
아직도 잘은 모르겠으나 ./gradlew clean build는 test코드 관련(..?)인 것 같다. 예를 들어 로컬에서 spring boot프로젝트가 정상적으로 실행되는 경우에도 터미널에서 ./gradlew clean build를 하면 test코드까지 싹다 돌기 때문에 java -jar와는 다른 느낌인 것 같다. 따라서 ./gradlew clean build할때도 환경변수 옵션을 넣어줘야 하고, java -jar할 때도 넣어줘야 하는 것 같다.. 근데 ./gradlew clean build를 안하고 java -jar를 하면 또 오류가 난다. 그렇다면 ./gradlew clean build의 결과물을 가지고 java -jar이 실행되는 건 맞는 것 같은데, ./gradlew clean build에서 환경변수 설정을 했다고 해도 이 파일을 가지고 java -jar을 할 때는 또 환경변수 설정이 필요한 것인가..??? 둘의 차이를 잘 아시는 분...?


[참고]
https://velog.io/@hind_sight/Docker-Jenkins-%EB%8F%84%EC%BB%A4%EC%99%80-%EC%A0%A0%ED%82%A8%EC%8A%A4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spring-Boot-CICD

https://gksdudrb922.tistory.com/236

https://erinh.tistory.com/entry/CICD-Spring-Jenkins-Nginx-EC2-Docker%EB%A1%9C-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EA%B5%AC%ED%98%84-2-Jenkins-Gitlab-%EC%97%B0%EB%8F%99-%EB%B0%8F-CI-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95

https://seongwon.dev/DevOps/20220717-CICD%EA%B5%AC%EC%B6%95%EA%B8%B02/

https://velog.io/@comet_strike/CICD-Apache-Kafka-Redis-%EA%B8%B0%EC%88%A0-%EA%B3%B5%EC%9C%A0

profile
끄적끄적....

0개의 댓글