====== SonaType Nexus ======
* http://www.sonatype.org/nexus/
===== 설정시 주의점 =====
* gradle이나 maven이 Nexus에 요청을 보낼때 GET이 아닌 **HEAD** 요청을 보내 파일의 존재 여부를 체크하는 경우가 있는데, 이때 nginx 1.2 버전에서 HEAD + gzip 설정이 돼 있을 경우 HEAD에 body 까지 담아 보내는 버그가 있어서 파일 다운로드 체크가 올바로 안되는 현상이 발생함. [[nginx:gzip|nginx gzip]] - gzip 을 꺼버려서 해결. 혹은 nginx을 1.4 이상으로 업그레이드 할 것.
* Maven Central 리포지토리 설정에서 ''HTTP Request Settings'' 조절안하면 존재하지 않는 파일에 대한 요청을 무한히 기다리는 현상이 발견됨.
* ''Request Timeout'' : 3 초로 조정.
* ''Request Retry Attemps'' : 3 회로 조정.
===== Proxy 설정 =====
* Proxy 설정 후 **Public Repository**에 추가해줘야 public 주소 하나로 접근 가능하다.
===== jcenter.bintray.com 과 Github Raw Repository =====
* https://github.com/sagemintblue/sagemintblue-repositories 참조.
* Nexus 를 리포지토리로 사용할경우 Github 리포지토리를 Proxing 할 때 설정을 주의해야 한다.
* **Proxy**로 설정한다.
* **Remote Repository Access > Download Remote Indexes**를 **false**로 지정한다.
* **Remote Repository Access > Auto blocking active**를 **false**로 지정하고 ''Refresh''한다.
* **Repository Status**가 ''Attempting to Proxy and Remote Unavailable'' 로 변한다.
===== Snapshot buildNumber 안 맞는 문제 =====
SNAPSHOT을 배포했는데, 아래처럼 buildNumber(아래에서는 2)와 실제 파일의 빌드넘버(아래에서는 1)로 안 맞는 경우가 발생했다.
some.group.id
some-artifact
0.0.1-SNAPSHOT
20140208.121756
2
20140208121803
javadoc
jar
0.0.1-20140208.121756-1
20140208121756
아때 Nexus 리포지토리에서 해당 아티팩트를 선택하고 **Rebuild Metadata**를 했더니 정상으로 변경되었다.
===== Nexus v2 Rest API =====
* [[http://jagadesh4java.blogspot.com/2016/09/nexus-rest-api.html|My Technical Works: Nexus Rest API]]
* [[network:httpie|HTTPie]] 기반 예제. 인증 옵션은 상황에 따라 다름
* [[https://gist.github.com/cedricwalter/e7739aab3d370ef83f1a13b8322e50be|Sonatype NEXUS 2 has a rest API :-) but NEXUS 3 has none/not ready, the following simulate curl/wget call]]
* **LATEST** 버전 체크 API 가 인덱스 갱신이 느린지 정상 작동하지 않음.
* 차라리 https://stackoverflow.com/a/40378096/1051402 이 방식이 작동함
# maven-metadata.xml URL을 group/artifact 에 따라 달라짐
wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
# 혹은 curl 로
curl -s https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
last_version=$(wget -O - -o /dev/null http://nexus.myrepo/content/repositories/releases/myjar/maven-metadata.xml | grep -Po '(?<=)([0-9\.]+(-SNAPSHOT)?)' |
sort --version-sort -r| head -n 1)
# snapshot 의 최신 빌드를 확인하려면 - last_version 을 안다고 했을 때
curl -s "https://repo1.maven.org/maven2/org/brutusin/wava/${last_version}-SNAPSHOT/maven-metadata.xml" | grep -Po '(?<=)([0-9\.\-]+)' | sort --version-sort -r | head -n 1
# 서버 상태
http -a admin:admin123 -v "http://[서버]/service/local/status"
# 최신버전. r=리포지토리ID, g=그룹명, a=아티팩트ID, e=jar|war 등. 잘 작동안함.
http -a admin:admin123 "http://[서버]/service/local/artifact/maven/content?r=repoId&g=groupName&a=art&e=jar&v=LATEST"
# 최신버전 curl 잘 작동안함
curl -u "admin:admin123 http://[서버]/service/local/artifact/maven/content?r=repoId&g=groupName&a=art&e=jar&v=LATEST" -o art.jar
# 특정 버전 명시 curl : 특정버전 명시할 때는 잘 작동함.
## r=snapshots, v=1.0.1-SNAPSHOT 형태로 스냅샷을 지정하면 스냅샷도 잘 받아짐.
curl -u "admin:admin123 http://[서버]/service/local/artifact/maven/content?r=repoId&g=groupName&a=art&e=jar&v=VERSION" -o art.jar