CI/CD 파이프라인이 구성되어 있으면 고려하지 않아도 됨
gradle-wrapper.properties
distributionUrl=file:///was_home/some/directory/gradle-8.1.1.zip
distributionUrl
로 지정한다.build.gradle
repositories
Scope내에 선언 된 Maven Repository 경로를 로컬 레파지토리 경로로 바꿔준다.maven { url = uri("/was_home/some/directory/repository") }
plugins
Scope내에 선언된 라이브러리는 apply plugin으로 변경해준다.plugins { ... }
로 선언된 라이브러리는 빌드 시 못찾는 경우가 있다.apply plugin: 'org.springframework.boot'
bootWar
스코프에 mainClass
속성을 지정해준다. (offline 빌드 시 메인클래스를 못찾는 문제 해결)mainClass = 'com/myproject/main/AppApplication.java'
settings.gradle
pluginManagement
의 Maven Repository 경로도 로컬 레파지토리로 수정한다.maven { url = uri("/was_home/some/directory/repository") }
JBOSS - Tomcat 사용으로 war파일을 인식 못해 해당 war파일을 전개한 후 배포가 필요해 만든 Task
task explodedWar(type: Copy) {
into "$buildDir/war-exploded" // 빌드 디렉토리 아래의 특정 경로를 지정
with war
}
bootWar {
mainClass = 'com/myproject/main/AppApplication.java'
dependsOn explodedWar // bootWar 실행 시 explodedWar Task가 같이 실행되도록 한다
}
Gradle Cache와 Maven Local Repository는 다르다
로컬에서 빌드하면서 만들어진 Gradle Cache로 동일하게 Maven Repository를 구성하기 위해
만든 Task
task cacheToMavenLocal(type: Copy) {
from new File("C:\\your\\gradle\\cache\\directory\\", 'caches/modules-2/files-2.1') //
into 'C:\\your\\local\\repository'
eachFile {
List<String> parts = it.path.split('/')
it.path = (parts[0] + '/' + parts[1]).replace('.','/') + '/' + parts[2] + '/' + parts[4]
}
includeEmptyDirs false
}
Gradle Property는 Groovy를 사용해 만들어지므로 한번 알아두는 것도 나쁘지 않을 듯.
war 전개 후 해당 폴더를 재배포 하는 일련의 과정을 특정 빌드 스크립트 실행을 통해 한번에 처리하는 경우
#!/bin/bash
# 경로
SOURCE_DIR="/was_home/your/directory/source"
TARGET_DIR="/was_home/your/directory/war-exploded"
# 빌드 디렉토리 이동
cd "${SOURCE_DIR}" || { echo "Source Directory doesn't exist."; exit 1; }
# 환경변수 설정 (distributionUrl 1Depth 아래 경로로 설정했음)
export GRADLE_USER_HOME=/was_home/your/gradlewrapper
# Gradle 실행권한 부여 및 Gradle 빌드 (War파일 생성)
# 실행권한에 따라 gradlew 실행 권한이 없는 경우도 있어 실행권한만 부여함
chmod +x ./gradlew
./gradlew clean bootWar --offline
# Gradle 'explodedWar' Task로 생성될 전개 폴더를 지정
WAR_EXPLODED_DIR="${SOURCE_DIR}/build/war-exploded"
# 타겟 디랙토리 생성 (-p 옵션으로 타겟 폴더가 이미 존재하는 경우는 무시함)
mkdir -p "$TARGET_DIR"
if [ -d "$WAR_EXPLODED_DIR" ]; then
# 기존 타겟 디렉토리 내부 삭제
echo "Target Directory Clear..."
rm -rf "$TARGET_DIR"/*
if [ -z "$(ls -A "$TARGET_DIR")" ]; then
echo "Target Directory Clear Success."
else
echo "Target Directory Clear Fail..."
exit 1;
fi
# war-exploded 폴더 내 파일들을 타겟 디렉토리로 복사
cp -r "$WAR_EXPLODED_DIR"/* "$TARGET_DIR"
echo "COPY Done."
echo "Attempt server restart..."
# 서버 종료 스크립트 실행
sh /was_home/your/directory/was_stop.sh
sleep 2 # WAS가 완전히 정지하지 않고 Start되는 Issue로 Sleep 추가
if [ $? -eq 0 ]; then
echo "Server Stopped."
sh /was_home/your/directory/was_start.sh
if [ $? -eq 0 ]; then
echo "Server Start."
else
echo "Server start failed."
fi
else
echo "Server stop failed."
fi
else
echo "war-exploded directory not found."
fi