문제 분석
배포자동화 과정 중 OAS 파일을 제대로 업로드하려면 build를 두 번 해야만 하는 문제가 존재했습니다. 왜 build를 두 번 이상 할 때만 OAS 파일이 제대로 업로드 되는지 원인을 알기 위해 배포 서버의 JAR 파일을 열어 보았습니다. build를 한 번만 했을 땐 JAR 파일에 OAS 파일이 누락되는 걸 확인할 수 있었습니다.
이는 OAS 파일을 만드는 task가 bootJar task에 의존하고 있어 발생한 문제였습니다. processResources task에서 static 경로에 있는 파일을 읽어두고, bootJar task는 해당 파일들만 인식합니다. OAS 파일은 processRecourses task가 실행된 이후 생성됐기 때문에 JAR 파일에 누락되었습니다.
해결 과정 1
이를 해결하기 위해 먼저 단순하게 task의 순서를 조정해봤습니다. OAS 파일 관련한 task를 processResources task 보다 먼저 실행하면 해결되지 않을까 싶었는데, task들끼리 순환 참조하는 문제가 발생했습니다. 원래는 processResources -> test -> createOAS -> bootJar 순서로 의존했는데, processResources -> test -> createOAS -> processResources 의 순환 의존 관계가 형성되어 문제가 되었습니다.
해결 과정 2
다음으로 bootJar task 에 적용할 수 있는 설정들이 있나 살펴보았습니다. Gradle 공식문서를 통해 아래와 같은 코드로 기존의 순서를 유지하면서 bootJar task가 OAS 파일을 인식할 수 있게 할 수 있단 걸 알게 되었고 적용해 문제를 해결했습니다.
bootJar {
dependsOn copyOasToSwagger
from('src/main/resources/static/swagger-ui') {
include 'openapi3.yaml'
into 'static/swagger-ui/'
}
}
Groovy
복사
사실 이 방식 외에 단순히 bootJar task와 OAS 관련 task 간에 의존 관계를 끊어버리는 방식도 존재했지만 JAR 파일 빌드 과정에 OAS 파일이 필요한 경우가 저희 팀의 default 요구사항이였기에 해당 방식은 택하지 않았습니다. 만일 JAR 파일 빌드 시 OAS 파일이 빠져야 한단 요구사항이 팀에 더 중요한 상황이었다면 해당 방식을 택했으리라 생각합니다.
관련한 내용은 아래 PR에서 확인하실 수 있습니다.