1. 리포지터리 생성
2024.03.01 - [DevOps/Nexus] - [Nexus] repository 생성 방법
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
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
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();
}
}
}
반응형
'DevOps > Nexus' 카테고리의 다른 글
[Nexus] repository maven group 생성 및 사용 방법 (0) | 2024.03.08 |
---|---|
[Nexus] repository maven proxy 생성 및 사용 방법 (0) | 2024.03.07 |
[Nexus] repository maven hosted 생성 방법 (0) | 2024.03.01 |
[Nexus] Nexus Repository 서버 구축 (0) | 2024.02.29 |