12月01, 2017

Nexus初探

最近在考虑我们容器服务的上游CI方案,在代码包管理这个环节,顺便把玩了下nexus;

代码包管理(package repository manager)是啥?

简单说就是:能cover很多主流语言,能代理central maven、PyPI、npm等,还能提供私有仓库的软件系统;

这个领域有2家主要的公司,JFrog和Sonatype,都主要卖商业软件,同时也提供开源版,JFrog公司的产品叫Artifactory,Sonatype公司的叫Nexus,Nexus又有2、3两个主要版本,较新的Nexus 3算是一次重构,底层实现和功能都有很多变化;

Nexus是用Java开发,开源版本叫Nexus Repository Manager OSS,当前的版本是3.6.1,部署很简单:

1、安装JDK,最好是从oracle网站下载的,比如jdk-8u151-linux-x64.rpm

2、下载Nexus的最新版,在一个磁盘空间较大的目录解压,解压出2个目录:nexus-3.6.1-02、sonatype-work,前者是代码,后者是数据、存储目录

3、运行启动,比如:/data/nexus-3.6.1-02/bin/nexus start

启动后,浏览器访问8081端口,即可访问dashboard:

alt

可以看到,它支持的包格式,还是比较丰富的(该领域开源软件里最丰富的);

通过默认的admin用户名密码,登陆进去后,可以做很多系统管理配置,最主要的是仓库管理、用户权限安全管理;

alt

“Repository”是我们测试的主要目标,“仓库”是需要存储的,Nexus以Blob格式存储,可以通过“Blob Stores”管理其后端存储媒介,默认存在一个“default”,类型是“File”:

alt

还可以创建其他的,但是开源版仅支持File类型,商业版支持S3等其他类型的存储媒介;

Repositories中,默认存在7个,如下图,maven格式的4个,涉及三种类型:

  • proxy,“代理”类型,代理请求官方仓库,并缓存在本地,图中maven-central即是
  • hosted,“私有”仓库,公司组织内部自由仓库,比如存储自己的jar包等,maven-releases、maven-snapshots即是
  • group,“组”,逻辑上的,可以把几个仓库划归到某个组,对外统一的地址访问,maven-public即是,它包含了另外3个

alt

最后,如何使用这个“私服”呢?

很简单,把各种构建工具、依赖管理工具的仓库地址,指到这个“私服”就可以了;

如果是maven,如下,稍加设置settings.xml,就可以指示maven,不再去请求官方的central maven,转而去请求你的“私服”:

$ mvn -v
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.5.2.el7.x86_64", arch: "amd64", family: "unix"


$ cat .m2/settings.xml
<settings>
  <mirrors>
    <mirror>
      <!--This sends everything else to /public -->
      <id>nexus</id>
      <mirrorOf>central</mirrorOf>
      <url>http://your.nexus.host:8081/repository/maven-central/</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>nexus</id>
      <!--Enable snapshots for the built in central repo to direct -->
      <!--all requests to nexus via the mirror -->
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <!--make the profile active all the time -->
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
  <servers>
    <server>
      <id>nexus</id>
      <username>xxx</username>
      <password>xxx</password>
    </server>
  </servers>
</settings>

那自有项目的一些包,如何上传到“私服”呢?

也很简单,项目的pom.xml,添加一段distributionManagement的配置即可:

$ cat pom.xml 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>demo-maven-app</artifactId>
  <packaging>jar</packaging>
  <version>0.1</version>
  <name>demo-maven-app</name>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <distributionManagement>
    <repository>
      <id>nexus</id>
      <name>Releases</name>
      <url>http://your.nexus.host:8081/repository/demo-releases/</url>
    </repository>
    <snapshotRepository>
      <id>nexus</id>
      <name>Snapshot</name>
      <url>http://your.nexus.host:8081/repository/demo-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

  $ mvn clean deploy

如上命令,在项目代码编译、打包、上传后,即可存储于“私服”的demo-releases、demo-snapshots的仓库中,供后续测试,或者其他人安装使用;

本文链接:https://addops.cn/post/a-bite-of-nexus.html

-- EOF --

Comments

opsdev