본문 바로가기

개발 일기

./gradlew build 의 굴레

프로젝트 기능을 어느정도 만들고 나서 성능테스트를 제대로 하기 위해 dockerfile 을 작성하고 있었다.

 

스프링의 경우 .jar 파일을 생성하고 docker 에서 컨테이너를 띄울 때 .jar 파일을 실행하고 있다. 

//dockerfile 중 일부...

RUN chmod +x ./gradlew
// jar 파일이 생성되는 부분
RUN ./gradlew build
COPY build/libs/Mytube-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

위 명령어들이 순조롭게 실행되다가...

RUN ./gradlew build 명령어가 영 들지를 않았다.

 

그래서 로컬에서 직접 실행해보았다. 그러자 어마무시한 에러 파티를 발견했다.

 

뭔가 로그가 많이 내려가서 다 작성하기는 어려우니 가장 대표로 눈에 띄었던 문구는....

[Consumer clientId=consumer-myGroup-2, groupId=myGroup] Sending LEAVE_GROUP request with header RequestHeader(apiKey=LEAVE_GROUP, apiVersion=5, clientId=consumer-myGroup-2, correlationId=11, headerVersion=2) and timeout 30000 to node 2147483647: LeaveGroupRequestData(groupId='myGroup', memberId='', members=[MemberIdentity(memberId='consumer-myGroup-2-e61c030a-dc17-46d3-93ea-04eb5412e50d', groupInstanceId=null, reason='the consumer unsubscribed from all topics')])

였다.

 

 

아무래도 kafka consumer 관련해서 뭔가 있는 것만 같았다.

그래서 kafka consumer 관련한 모든 설정을 다시 확인해봤지만 이렇다할 문제가 없어 보였다.

처음에는 topic 이 생성되지 않는건가? 싶었다.

 

kafka-consumer-groups --bootstrap-server localhost:9092 --describe --all-topics -all-groups

위 명령어를 kafka-consumer-groups.sh 가 있는 폴더로 이동해서 실행해 보았을 때 토픽은 문제 없이 잘 생성되어 있었다.

 

그렇다면 consumer group을 잘못 지정했나?

싶어 코드를 다시 들어가보면 config 파일이나, listener 어노테이션이나 다 잘 설정되어 있었다.

 

그 외에도 kafka 관련 설정을 계속 확인하고, 구글링하고 비슷한 사례를 찾아봤지만 문제될 코드도, 나와 똑같은 상황을 겪는 사람은 없었다.

 

그리고 오늘 다시 코드를 확인하며 ./gradlew build 를 계속 실행했다.

상황은 변하지 않았다. 

 

그리고 사실 이 명령어를 칠 때마다 테스트 코드가 실패한다고 떴다.

같은 내용이나 뱉는 터미널 들여다볼 거면 이 테스트 코드나 build 에서 제외시키자- 하며 방법을 찾았다.

./gradlew build -x test

다행히 테스트 코드를 제외하고 빌드하니 아무 문제 없이 success 를 받아냈다.

 

그 때부터 에러 로그가 바뀌기 시작했다. 

 

'xargs not available'

다른 개발자 분의 게시글에서 쉽게 답을 찾을 수 있었다. openjdk:17에 xargs 가 부재해서 발생하는 문제니까 사용 가능한 것으로 바꿔줘야겠다!

 

FROM openjdk:17-jdk-alpine AS builder

 

로 바꾸자 이번엔 또 다른 에러가 등장했다.

 

failed to solve: openjdk:17-jdk-alpine: no match for platform in manifest sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81: not found

 

 

jdk 를 끌어올 때 내 노트북 코어와 호환되지 않아서 발생하지 않는 오류였다고 한다. (본인 m2 air 2022 년형)이미지를 끌어오는 플랫폼을 명시하여 해결했따.

 

  mytube-backend:
    container_name: mytube-backend
    platform: linux/amd64 // 추가된 코드
    build:
      context: .
    command: ./gradlew bootrun
    restart: on-failure
    ports:
      - 8000:8000
    expose:
      - 8000
    depends_on:
      - mytube-mysql
      - mytube-redis
      - mytube-kafka
    env_file: .env

 

 

해결!

 

내가 ./gradlew build 만 할 줄 알지 -x test 같은 속성까지는 몰랐기 발생한 참사였던 것 같다.

 

프로그래머는 코드를 활용할 줄 아는 사람이지 그대로 복붙하는 코더(coder)가 아님을 잊지 말자.