폐쇄망에서의 Gradle Build

김나쁜 Kimbad·2024년 5월 28일
0

프로젝트

목록 보기
9/9

문제점

  1. 로컬에서는 인트라넷으로 내부망 Nexus에 접근할 수 있음
  2. 이후 해당 프로젝트 소스를 WAS에 올려 빌드해야 함
  3. 그러나 WAS에서 인트라넷 Nexus에 접근할 수 없어 해당 WAS 내에서 오프라인 빌드를 해야하는 경우

CI/CD 파이프라인이 구성되어 있으면 고려하지 않아도 됨

Gradle Wrapper 설정

  • gradle-wrapper.properties
    - distributionUrl=file:///was_home/some/directory/gradle-8.1.1.zip
    - Gradle Wrapper의 압축 파일을 distributionUrl로 지정한다.
    - Zip파일의 내부 구조는 단일 폴더로 시작해야 한다.
    - gradle-8.1.1.zip
    - └─gradle-8.1.1
    -  └─bin
    -  └─...
  • 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") }

추가적인 Gradle Task

  • war파일을 exploded시킨 상태로 배포가 필요한 경우

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를 사용해 만들어지므로 한번 알아두는 것도 나쁘지 않을 듯.

빌드 후 WAS 재기동 Shell Script

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
profile
Bad Language

0개의 댓글