Gradle은 여러 언어를 지원하는 빌드 자동화(build automation) 도구입니다.
기존에는 Ant나 Maven과 같은 여러 빌드 도구가 있었지만, Gradle은 이 중 가장 최근에 출시한 빌드 도구로써 성능이나 이용성 면에서 더 진보한 도구이기도 합니다.
이번 포스팅에서는 Gradle을 이용해서 GCP API를 연동한 Springboot 웹 애플리케이션을 빌드해보고, 이를 통해 생성된 Jar 아티팩트를 GCP의 아티팩트 레포지토리인 Artifact registry에 배포하는 과정을 step by step으로 알아보도록 하겠습니다.
1. GCP 리소스 구성
우선 Google Cloud Platform에서 준비해야 할 리소스들을 구성합니다.
이번 포스팅에서는 Gradle을 이용해 생성한 Jar 아티팩트를 GCP의 Artifact registry 레포지토리에 배포할 것이기 때문에, 관련한 리소스를 준비해보겠습니다.
1-1. GCP 서비스 어카운트 키 생성
Gradle에서 Artifact registryt로의 인증을 위한 서비스 어카운트 키를 생성 후, 서비스 어카운트 키를 다운받습니다.
본 포스팅에서는 편의를 위해 Default Compute Engine 서비스 어카운트를 사용하지만, 프로덕션 환경에서는 별도의 서비스 어카운트를 생성하는 것을 권장합니다.
별도의 서비스 어카운트 키를 생성하더라도 본 포스팅의 과정과 동일하게 진행할 수 있습니다.
서비스 어카운트에서 키를 생성한 후 아래 명령어로 json 키를 로컬 환경에 다운로드받습니다.
1
|
gcloud auth activate-service-account ACCOUNT --key-file=KEY-FILE
|
cs |
ACCOUNT : 서비스 어카운트 계정 명
KEY-FILE : 다운로드받을 키 파일 경로 및 이름
1-2. Artifact registry 구성
다음으론 Private 레포지토리 역할을 할 아티팩트 레지스트리를 구성합니다.
좌측 CI/CD 탭의 Artifact Registry 페이지에서 Create repository 버튼을 클릭해 레포지토리 생성 페이지로 진입합니다.
생성 페이지에서 Format을 Maven으로 지정한 뒤 Version policy와 Region 등의 설정을 지정한 후 생성합니다.
레포지토리가 정상적으로 생성되었음을 확인하고, 생성한 레포지토리의 체크박스를 클릭한 후 우측 상단의 SHOW INFO PANEL 버튼을 클릭합니다.
좌측 패널을 열면 해당 레포지토리에 권한을 부여할 수 있는 탭이 열립니다.
여기서 생성한 서비스 어카운트의 계정 명을 입력한 뒤, Artifact Registry Writer 역할을 부여합니다.
이렇게 함으로써 지정한 서비스 어카운트 계정의 키를 사용하면 해당 레포지토리에 인증을 수행할 수 있습니다.
1-3. Gradle Setting 출력
다음으로는 Gradle을 이용해 Artifact registry 레포지토리로 배포하기 위해 필요한 설정을 가져오겠습니다.
Gradle을 이용해서 Artifact registry로 배포하기 위해서는 build.gradle 파일과 gradle.properties 파일에 수정이 필요합니다.
이 과정을 수행하기 위해 필요한 Code snippet을 출력해보겠습니다.
터미널에서 아래 명령어를 수행합니다.
1
|
gcloud artifacts print-settings gradle --project=YOUR_PROJECT --repository=YOUR_REPOSITORY --location=YOUR_REGION --json-key=./key.json
|
cs |
명령어를 실행하면 아래와 같은 코드 스니펫이 출력됩니다. 추후 이 코드를 사용해야 하니 적절한 곳에 저장해둡니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
// Move the secret to ~/.gradle.properties
def artifactRegistryMavenSecret = "base64 private key ..."
// Insert following snippet into your build.gradle
// see docs.gradle.org/current/userguide/publishing_maven.html
plugins {
id "maven-publish"
}
publishing {
repositories {
maven {
url "https://us-central1-maven.pkg.dev/PROJECT_NAME/REPOSITORY_NAME"
credentials {
username = "_json_key_base64"
password = "$artifactRegistryMavenSecret"
}
}
}
}
repositories {
maven {
url "https://us-central1-maven.pkg.dev/PROJECT_NAME/REPOSITORY_NAME"
credentials {
username = "_json_key_base64"
password = "$artifactRegistryMavenSecret"
}
authentication {
basic(BasicAuthentication)
}
}
}
|
cs |
1-4. GCS 버켓 생성
이번 포스팅에서 생성할 JAVA 프로젝트는 Springboot에서 GCP API를 연동하는 간단한 웹 애플리케이션입니다.
연동해볼 GCP API는 GCP의 오브젝트 스토리지 서비스인 GoogleCloudStorage API를 사용합니다.
이를 위해 프로젝트와 연동할 GCS 버켓을 생성합니다.
아래 명령어를 실행해 GCS 버켓을 생성합니다.
1
|
gcloud mb gs://BUCKET_NAME
|
cs |
이후 콘솔에서 버켓이 생성된 것을 확인할 수 있습니다.
생성한 버켓 안에 테스트용으로 사용할 아무 텍스트파일을 업로드합니다.
2. Gradle 프로젝트 구성
이제 GCP 단에서 구성해야 할 준비는 끝났습니다.
본 포스팅의 목적인 Gradle을 이용해 Java 프로젝트 생성 및 배포를 위해 준비해야 할 구성을 보겠습니다.
Java 프로젝트의 생성 및 관리는 VSCode, Eclipse 등의 IDE를 사용하면 훨씬 편하지만, 이번 포스팅에서는 본질적인 이해를 위해 최대한 IDE를 사용하지 않고 터미널 환경에서 구성해보겠습니다.
포스팅에서는 실행 환경에 Java가 설치되었음을 가정하겠습니다. Java 설치 및 구성은 스킵합니다.
2-1. Gradle 설치
먼저 로컬 환경에서 Gradle을 설치합니다.
설치 방법은 OS마다 상이하므로 자세한 설치 방법은 공식 문서를 참고해주시면 되겠습니다.
Gradle | Installation
Install the Gradle build tool on Linux, macOS or Windows, either manually or using a package manager like SDKMAN! or Homebrew.
gradle.org
저자의 환경인 MacOS를 기준으로는 brew 패키지 매니저를 사용해 간편하게 설치 가능합니다.
터미널에서 아래 명령어로 Gradle을 설치합니다.
1
|
brew install gradle
|
cs |
설치를 완료했다면 gradle -version 명령어를 실행해 설치가 정상적으로 진행되었는지 확인합니다.
2-2. Gradle로 JAVA프로젝트 시작
Gradle 설치 후에는 Springboot 웹서버를 실행하기 위한 JAVA 프로젝트를 생성합니다.
Gradle에는 최소한의 JAVA 프로젝트를 위한 템플릿을 제공하고 있으며, 이는 간단한 명령어로 수행 가능합니다.
먼저 터미널에서 gradle init 명령어를 실행해 JAVA 프로젝트를 생성합니다.
명령어를 실행하면 다양한 설정을 묻기 위해 인터랙티브한 과정으로 진입합니다.
1번 항목에서 웹 애플리케이션을 생성할 것이기 때문에 2: application 선택
2번 항목에서 JAVA 프로젝트를 생성할 것이기 때문에 3:JAVA 선택
3번 항목에서 단일 프로젝트를 생성할 것이므로 1:no 선택
4번 항목에서 빌드 스크립트로 그루비를 사용할 것이므로 1:Groovy 선택
5번 항목에서 테스트 프레임워트로 JUnit Jupiter를 사용할 것이므로 4:JUnit Jupiter 선택
설정을 완료하면 다음과 같은 디렉토리 구조가 생성됩니다.
프로젝트의 루트 디렉토리에서 gradle tasks 명령어로 Gradle이 제공하는 다양한 기능인 Task를 확인할 수 있습니다.
사용할 수 있는 Task는 build.gradle 파일에 Plugin을 명시함으로써 추가할 수 있습니다.
2-3. Gradle 환경 구성
이제 Gradle에서 Artifact registry 레포지토리로 배포하기 위한 환경을 구성해보겠습니다.
환경 구성을 위해서는 이전 1-3 장에서 출력한 세팅을 기반으로 build.gradle과 같은 파일을 수정해야 합니다.
출력된 코드 스니펫을 기반으로 build.gradle 파일과 gradle.properties 파일을 아래와 같이 수정합니다.
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
plugins {
id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java'
id 'maven-publish'
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId 'com.example'
from components.java
}
}
repositories {
maven {
url "https://us-central1-maven.pkg.dev/YOUR_PROJECT/YOUR_REPOSITORY"
credentials {
username = "_json_key_base64"
password = "$artifactRegistryMavenSecret"
}
}
}
}
repositories {
mavenCentral()
maven {
url "https://us-central1-maven.pkg.dev/YOUR_PROJECT/YOUR_REPOSITORY"
credentials {
username = "_json_key_base64"
password = "$artifactRegistryMavenSecret"
}
authentication {
basic(BasicAuthentication)
}
dependencies { implementation 'org.springframework.cloud:spring-cloud-gcp-starter-storage:1.2.8.RELEASE' implementation 'org.springframework.boot:spring-boot-starter-web' } |
cs |
plugin : java 언어를 위한 java 플러그인과 Public를 위한 maven-publish 플러그인, Springboot를 위한 Springboot 플러그인을 설치합니다.
publishing : "repositories" 섹션에 기재한 url은 생성한 artifact registry 레포지토리의 주소입니다.
artifact registry에 인증을 수행하는 방법은 Credential helper를 이용한 방법, Password를 이용한 방법 2가지가 존재합니다.
본 포스팅에서는 이 중 Password를 이용한 방법에 대해서 기술합니다. 이 경우 URL에 artifactregistry:// 가 아닌 https://로 시작하는 주소를 적어야 한다는 점에 주의해야 합니다.
repositories : Gradle이 참조할 레포지토리를 지정합니다. 애플리케이션에 필요한 MavenCetral 레포지토리와 프로젝트를 배포할 Artifact registry 레포지토리를 지정했습니다.
dependencies : 애플리케이션을 생성하는 데 필요한 의존성을 기재합니다.
gradle.properties
1
|
artifactRegistryMavenSecret = KEY_FILE...
|
cs |
KEY_FILE : 1-3에서 출력한 코드 스니펫 중
// Move the secret to ~/.gradle.properties
def artifactRegistryMavenSecret = ...
에 해당하는 부분을 적어야 합니다.
3. Springboot 애플리케이션 생성
지금까지 GCP단의 구성과 Gradle 구성까지 끝마쳤습니다.
이제는 Springboot를 이용해 GCP의 스토리지 서비스인 GoogleCloudStorage의 파일 컨텐츠를 출력하는 간단한 웹 애플리케이션을 생성하겠습니다.
먼저 main/java/PROJECT_NAME 폴더 아래에 있는 App.java 파일을 삭제하고 DemoApplication.java와 GcsController.java 파일을 아래와 같이 생성합니다.
GcsController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.example.demo;
import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GcsController {
@Value("gs://GCS_URL/FILE_NAME")
private Resource gcsFile;
@GetMapping
public String readGcsFile() throws IOException {
return StreamUtils.copyToString(
gcsFile.getInputStream(),
Charset.defaultCharset());
}
}
|
cs |
GCS_URL/FILENAME : 1-4에서 생성한GoogleCloudStorage의 버켓 URL과 그 안의 파일 이름을 지정합니다.
GCS 내의 텍스트파일을 읽어서 문자열로 출력하는 간단한 코드입니다.
DemoApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
|
cs |
Springboot 애플리케이션을 가동하기 위한 간단한 코드입니다.
4. 프로젝트 빌드 및 배포
이제 Gradle을 이용해 생성한 프로젝트를 바탕으로 빌드 및 배포까지 진행해보겠습니다.
먼저 터미널에서 ./gradlew bootjar 명령어를 실행해 간단한 빌드를 진행해보겠습니다.
gradlew는 Gradle을 설치하거나 버전에 관계없이 사용할 수 있도록 wrapping한 스크립트입니다. gradle 명령어를 이용해서도 빌드를 수행할 수 있지만, 본 포스팅에서는 gradlew를 이용해서 빌드를 진행합니다.
빌드를 성공적으로 수행하면 아래와 같이 build/libs 폴더에 jar파일이 생성됩니다.
빌드한 jar 파일을 실행해서 Springboot 웹 애플리케이션을 실행해보겠습니다.
아래 java 명령어로 생성한 jar 파일을 기반으로 웹 애플리케이션을 실행합니다.
1
|
java -jar JAR_FILE_PATH
|
cs |
JAR_FILE_PATH : 생성된 Jar 파일을 지정합니다. "-plain" 접미사가 붙은 jar파일과 안 붙은 jar파일 중 붙지 않은 jar 파일을 지정해야 합니다. -plain.jar 파일은 의존성을 제외한 리소스로 구성한 것이므로 해당 파일을 지정하면 에러를 뱉습니다.
이후 localhost:8080 주소로 접속하면 웹에서 하드코딩한 GCS버켓의 텍스트파일을 읽어오는 것을 볼 수있습니다.
이렇게 GCP API를 연동한 Springboot JAVA 프로젝트를 생성할 수 있었습니다.
이 jar 파일을 로컬 환경에 저장했지만, 본 포스팅의 목적은 Artifact registry의 외부 레포지토리에 배포하는 것이므로 다른 명령어를 사용해서 외부 레포지토리에 해당 jar 파일을 업로드하겠습니다.
터미널에서 ./gradlew publish 명령어를 실행합니다.
Task를 성공하면 Artifact registry에 새로운 디렉토리가 생성된 것을 확인할 수 있습니다.
해당 디렉토리에서 로컬에서 빌드한 jar파일이 업로드된 것을 확이할 수 있습니다.
상단의 SETUP INSTRUCTIONS 버튼을 클릭하면 해당 프로젝트를 사용할 수 있는 설명서를 볼 수 있습니다.
이 jar 파일을 사용하여 다른 환경에서도 로컬에서 생성한 JAVA 프로젝트를 사용할 수 있습니다.
5. 마치며
지금까지 Gradle로 Springboot 웹 애플리케이션을 GCP API와 연동한 JAVA 프로젝트를 Artifact registry같은 외부 레포지토리에 배포해봤습니다.
Gradle을 Artifact registry에 배포할때 사용하는 인증수단 중 Credential helper를 이용한 방법이 Key 파일 대신 ADC를 사용하기 때문에 보안 면에서 더 나은 선택지이지만, 어째서인지 해당 방법을 사용할 수 없어서 서비스 어카운트 key 파일을 사용한 인증수단을 사용했습니다.
추후에 문제를 고칠 수 있다면 Credential helper를 이용한 인증으로 바꾸는 것이 더 나을 것 같습니다.
이 포스팅을 보고 많은 도움이 되었으면 합니다.
'Dev' 카테고리의 다른 글
Go로 커맨드를 실행할 수 있는 CLI를 구현해보자 (With Cobra) (1) | 2023.06.26 |
---|---|
Apache beam으로 Streaming & Batch 데이터 파이프라인을 생성해보자 (with GCP Dataflow) (1) | 2022.03.15 |
Onclick vs AddEventListener 어떤 것을 사용해야 할까? (2) | 2020.03.27 |
Django 의 Password Validation 삽질기 (1) | 2020.03.24 |
Node.js + MongoDB 로 이미지 웹 만들어보기 (2) (0) | 2020.03.12 |