DevOps/Nexus

[Nexus] repository maven hosted 배포(deploy) 방법(자동, 수동, API)

cob 2024. 3. 4. 17:49

 

 

1. 리포지터리 생성

2024.03.01 - [DevOps/Nexus] - [Nexus] repository 생성 방법

 

[Nexus] repository 생성 방법

repository를 생성하 위해서는 데이터를 저장할 Blob store부터 생성해 줘야 한다. 1. Blob Store 생성 데이터를 저장하는 데 사용되는 기본 데이터 저장소로, sonatype-work의 하위 디렉터리와 생성된다. [톱

cocococo.tistory.com

 

 

 


2. 자동 (Release, Snapshot, Mixed) 배포

1. Release 
- 릴리스 버전은 프로젝트가 안정적으로 배포되고 사용될 때 사용 한다.
- 일반적으로 릴리스 버전은 버그 수정, 기능 개선 등의 작은 변경 사항을 포함한다.
- 릴리스 버전의 artifact는 배포된 후에는 변경되지 않는다. (수정 시에 버전을 올려야 함)

2. Snapshot
- 스냅샷 버전은 아직 완전히 안정화되지 않은 개발 중인 버전이다.
- 일반적으로 스냅샷 버전은 개발 중인 코드에 대한 최신 빌드를 나타낸다.
- 스냅샷 버전의 artifact는 개발자가 새로운 코드나 수정 사항을 커밋할 때마다 업데이트된다 
  (개발 진행 간 수시로 배포하기 위해 사용되며 버전을 올리지 않아도 버전 하위로 uuid를 생성하여 배포된다.)

3. Mixed
- Release Snapshot 상관없이 배포는 되지만, 버전을 변경해야 한다.

 

* release, snapshot 버전 적용 방법
pom.xml에서 버전을 명시할 때 끝에 '-SNAPSHOT'  붙이는지 여부로 결정된다.

// release 버전
<version>0.0.1</version>

// snapshot 버전
<version>0.0.1-SNAPSHOT</version>

 

 

2-1) [settings.xml] 

Maven에서 로컬 저장소를 관리하는 데 사용되는 .m2 하위에 settings.xml파일을 생성한다.(없으면 만듦)
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
   http://maven.apache.org/xsd/settings-1.0.0.xsd">

        <servers>
                <server>
                        <id>[서버 ID(매핑시 사용)]</id>
                        <username>[nexus 사용자 ID]</username>
                        <password>[nexus 사용자 PW]</password>
                </server>
        </servers>
</settings>

 

2-2) [pom.xml] 

<repository>, <snapshotRepository> 두 개를 동시에 설정하게 되면 snapshot, release 버전을 구분하여 배포하게 되지만, 둘 중 하나만 설정했다면 구분 없이 해당 저장소로 배포된다.
<distributionManagement>
    <repository>
        <id>[서버 ID (setting.xml과 매핑)]</id>
        <url>[release 리포지토리 url]</url>
    </repository>
    <snapshotRepository>
        <id>[서버 ID]</id>
        <url>[snapshot 리포지터리 url]</url>
    </snapshotRepository>
</distributionManagement>
  • distributionManagement : Maven 프로젝트에서 생성된 아티팩트를 배포하기 위한 설정
  • repositroy : release 버전을 배포할 저장소
  • snapshotRepository : snapshot 버전을 배포할 저장소

 

Deploy 하게 되면 자동으로 배포된다!!!

 

 


3. 수동 배포

수동 배포는 release, mixed 버전만 가능하다. (snapshot버전 안됨)

https://help.sonatype.com/en/uploading-components.html

 

Uploading Components

When your build makes use of proprietary or custom dependencies that are not available from public repositories, you will often need to find a way to make them available to developers in a custom repository. Nexus Repository makes it easy to upload these t

help.sonatype.com

 

3-1) [Browse] -> [리포지토리]

컴포넌트 등록

 

 

3-2) [Upload Component]

컴포넌트 설정

  • Browse : 업로드할 아티팩트를 등록한다.(fakepath는 HTML 폼에서 실제 경로를 숨겨주기 위해 발생한다.)
  • Classifier : 필수 입력값은 아니지만, Maven에서 아티팩트를 식별하는 데 사용되는 추가적인 값이다.
     (ex : JAR 아티팩트의 경우 sources, javadoc 등) 
  • Extension : 확장자 (jar, war 등)
  • Group ID : 트리 구조를 식별자로 사용하기 위해 작성한다. 실제 아티팩트 내에 설정된 값과 관련은 없다.
  • Articat ID : 아티팩트 이름
  • Version : 아티팩트 버전

 

3-3) 등록 완료

 

 

 


4. API 배포

API 배포는 release, mixed 버전만 가능하다. snapshot 버전으로 배포하기 위해서는 프로세스를 실행하는 방법으로 해야 한다.

https://help.sonatype.com/en/components-api.html

 

Components API

Uploading a jar and Automatically Creating a pom File For this example we have a single jar file from a third-party vendor and no project POM file from that third party. We have decided our own Maven 2 coordinates and will ask Nexus to automatically genera

help.sonatype.com

public class Deploy {
    public static void main(String[] args) throws IOException {
        String username = "[nexus 사용자 ID]";
        String password = "[nexus 사용자 PW]";
         releaseDeploy(username, password);
    }

    // 릴리즈 배포
    public static void releaseDeploy(String username, String password) {
        String nexusUrl = "[리포지터리 url]";
        File file = new File("[배포 파일 경로]");

        // Set headers
        HttpHeaders headers = new HttpHeaders();
        headers.setBasicAuth(username, password);
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        // 요청 파라미터 설정
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        body.add("maven2.groupId", "[Group ID]");
        body.add("maven2.artifactId", "[Artifact ID]");
        body.add("maven2.version", "[Version]");
        body.add("maven2.asset1", new FileSystemResource(file.toPath()));
        body.add("maven2.asset1.extension", "[확장자]");

        RestTemplate restTemplate = new RestTemplate();

        // HTTP 요청
        ResponseEntity<String> response = restTemplate.exchange(
                nexusUrl,
                HttpMethod.POST,
                new HttpEntity<>(body, headers),
                String.class);

        // 응답 확인
        System.out.println("Response status code: " + response.getStatusCode());
        System.out.println("Response body: " + response.getBody());
    }
}

 

 

4-1) snapshot 프로세스 실행

package demo;


import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.io.File;
import java.io.IOException;

public class Deploy {
    public static void main(String[] args) throws IOException {
        snapshotDeploy();
    }

    // 스냅샷 배포
    public static void snapshotDeploy(){
        String[] command = {
                "mvn",
                "deploy:deploy-file",
                "-DgroupId=[Group ID]",
                "-DartifactId=[아티팩트 id]",
                "-Dversion=[버전]",
                "-Dpackaging=[확장자]",
                "-Dfile=[파일 경로]",
                "-DrepositoryId=[settings.xml과 매핑할 id and 리포지토리 id]",
                "-Durl=[스냅샥 리포지토리 url]"
        };

        // 명령어 실행
        try {
            // 프로세스 시작
            Process process = new ProcessBuilder(command).inheritIO().start();
            int exitCode = process.waitFor(); // 프로세스 끝날 때까지 대기
            if (exitCode == 0) { // 0 이면 성공
                System.out.println("배포가 성공적으로 완료되었습니다.");
            } else {            // 아니면 실패
                System.out.println("배포 중 오류가 발생했습니다.");
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }
}

 

 

반응형