Ubuntu 下搭建带鉴权机制的 SDK 仓库

搭建 Nexus3.x Maven

环境搭建

安装 JDK

$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk # 安装 open 版本 JDK
$ java -version # 查看安装是否成功

安装 Nexus

$ cd /tmp
$ wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz # 下载
$ tar zxvf latest-unix.tar.gz # 解压
$ mv nexus-3.20.1-01/ /data/maven/ # 移到项目目录

# 查看 JDK 路径
$ which java 
/usr/bin/java
$ ls -lrt /usr/bin/java
lrwxrwxrwx 1 root root 22 Jan  4 02:13 /usr/bin/java -> /etc/alternatives/java
$ root:/lib# ls -lrt /etc/alternatives/java
lrwxrwxrwx 1 root root 46 Jan  4 02:13 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
$ cd /usr/lib/jvm

$ vim /data/maven/nexus-3.20.1-01/bin/nexus # 编辑环境变量

编辑 Nexus 的环境变量

# Uncomment the following line to override the JVM search sequence
INSTALL4J_JAVA_HOME_OVERRIDE="/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"
# Uncomment the following line to add additional VM parameters
# INSTALL4J_ADD_VM_PARAMS=

启动

$ /data/maven/nexus-3.20.1-01/bin/nexus start

浏览器打开 Nexus 界面,默认端口号是 8081(注意需要判断服务器是否开通了该端口号的监听)

设置 Nexus

修改端口号(可选)

$ vim /etc/sysconfig/iptables # 加入指定端口号
$ netstat -ntlp # 查看是否监听端口(如果配置了自己定义的端口,需要先访问该端口一次才能看到监听)
$ service iptables restart # 重启防火墙配置(不重启端口还是无法生效)
$ vim /data/maven/nexus-3.20.1-01/etc/nexus-default.properties # 修改 Nexus 端口号
$ /data/maven/nexus-3.20.1-01/bin/nexus restart # 重启 Nexus

设置将 Nexus 添加到环境变量中(可选)

$ cd /data/maven/
$ sudo ln -s nexus-3.20.1-01/ nexus
$ vim ~/.bashrc
$ export PATH="$PATH:/data/maven/nexus-3.20.1-01/bin"
$ source ~/.bashrc

使用 Nginx 反向代理并设置 https,需要在 nginx/conf/nexus.conf 中按如下关键项设置,否则会出现使用域名访问一直卡在 Initialize 的界面,因为通过 rapture 模块接口获取的 static 资源加载失败,而用 https 访问则被拒绝的情况。其实使用 Nginx 设置 https 的话,Nexus 本身无需做特别的设置,除非要修改它自身提供的 TSL 配置。

upstream nexus-server {
    server 127.0.0.1:8081;
}

server {
    ...
    location / {
        ...
        proxy_set_header X-Forwarded-Proto "https";
    }
}

其它设置

$ /data/maven/nexus-3.20.1-01/bin/nexus stop
$ /data/maven/nexus-3.20.1-01/bin/nexus status
$ rm -rf nexus-3.20.1-01 # 卸载删除目录即可  
$ vim /data/maven/sonatype-work/nexus3/admin.password # 查找初始密码,账号名为 admin,重置密码后会自动删除

禁用匿名模式的访问

nexus_anonymous

应用

上传 Maven 的配置

在需要发布的工程库模块上的 build.gradle 文件中,添加如下代码导入 Gradle 的插件

apply plugin: 'com.android.library'
apply plugin: 'maven'

然后继续添加如下代码,创建上传任务

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://ip:port/repository/maven-releases/") {
                authentication(userName: "userName", password: "password")
            }
            pom.groupId = 'com.test.yourid'
            pom.artifactId = 'yourartifacid'
            pom.version = '1.0.0'
            pom.packaging = 'aar'
        }
    }
}

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.sourceFiles
}

task androidJavadocsJar(type: Jar) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
}

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

uploadArchives.mustRunAfter('build')

uploadArchives {
    doLast {
        println "Uploaded success"
    }
}

最后,运行命令 ./gradlew uploadArchives,如果一切顺利的话依赖包会被上传到maven服务器上。

从 Maven 下载的配置

重点来了,切换到需要引用依赖以上库的项目工程上,在主工程的 build.gradle 文件中添加如下代码,声明 Maven 仓库,注意 credentials 方法中设置的账号明和密码,若不设置 Maven 仓库将返回 401 unauthented(配合服务器上取消匿名访问的设置)

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'http://ip:port/repository/maven-releases/'
            credentials {
                username = "userName"
                password = "password"
            }
            authentication {
                basic(BasicAuthentication)
            }
        }

    }
}

再在需依赖此库的工程模块上的 build.gradle 中添加如下代码

dependencies {
    implementation 'com.test.yourid:yourartifacid:1.0.0@aar'
    ...
}

build 一下,在 External Libraries 中找到从私服 Maven 下载的库即完成。

定制账号

假设有一个这样的场景,下载库的客户端需要分配权限管理,而这个权限则需要由其它系统同步过来。

如果是 iOS 的 Cocoapods,可以使用 GitLab 提供的 REST API 来创建 Git 账号。

Nexus 也有 REST API,但官方提供的仅能管理 Repo,没有账号相关的。要另辟蹊径。

LDAP

最方便的方式其实是使用 LDAP(Lightweight Diretory Access Protocal)轻量目录接入协议,但前提是得原有的账号系统支持该协议。

简单原理就是在管理账号的主体系统上实现好 LDAP,然后其它子系统需要沿用主体系统上的账号时,只需对子系统的 LDAP 模块进行配置(相当于设勾子),待鉴权时调回主体系统上进行校验。这里就不展开,可自行 Google 更多资料(主要由于当时主体系统不支持 LDAP - -)。

操作数据库

直接操作数据库

首先,查看 Nexus 3 的 Data 目录

$ ps -ef | grep NexusMain
# 找到输出中的 -Dkaraf.data=../sonatype-work/nexus3

然后,在项目的根目录下进入 OrientDB 的控制台

$ java -jar ./lib/support/nexus-orient-console.jar
orientdb>

连接 security 数据库(表)

orientdb> connect plocal:../sonatype-work/nexus3/db/security admin admin

最后,就可以操作用户级的数据表了

orientdb {db=security}> select * from user where id = "admin"

orientdb {db=security}> INSERT INTO user (status, id, firstName, lastName, email, password) VALUES ('active', 'admin', 'admin', 'admin', 'changeme@yourcompany.com', '$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==')

orientdb {db=security}> update user SET password="xxx" UPSERT WHERE id="somebody"

如果要实现接收外部传入的账号信息来更新数据库的话,直接在命令行上操作就不太方便了(其实用 <<EOF 也是ok的),所以要借助 .osql 脚本来提供给 shell 调用,例如

connect plocal:../sonatype-work/nexus3/db/security admin admin

CREATE CLASS B; 
CREATE PROPERTY B.name STRING; 

CREATE CLASS A; 
CREATE PROPERTY A.name STRING; 

ALTER PROPERTY A.name MANDATORY true; 
CREATE PROPERTY A.bList LINKSET B;

但是!当我直接设了一个明文密码到数据库后,用其登录时是无法鉴权成功的,想想也知道,密码怎么可能明文存在数据库(看看 admin 的密码就知道,根本和登录时用的不是一个样),但我又找不到 Nexus 对用户密码做加密或者搞摘要的部分在哪,所以这个方案也先作罢。

自挖 REST API

最后,把目光转移到 Nexus 后台的 UI 上,在那我们可以直接用 admin 操作新建账号、修改密码、更新资料、删除账号这些的交互,所以如果能了解到这些 UI 操作对应哪些 API 请求,我们自己就可以进行模拟了。

经过分析,大致会用到以下接口

extdirect 接口主要是通过 method 参数区分动作。

其中遇到了一个过不去的坎,就是 Nexus 采用了 Anti CSRF Token 的方式预防跨站攻击,但我找不出在请求的 Cookies 上的 NX-ANTI-CSRF-TOKEN 来源位置,无法模仿生成它给创建账号请求时使用,导致创建结果都是 401 Anti cross-site request forgery token mismatch。

无奈只能在 Nexus 的配置 sonatype-work/nexus3/etc/nexus.properties 上直接关闭 anticsrftoken 的验证并重启

nexus.security.anticsrftoken.enabled=false

这样在请求时只需对 Cookies 设置 NXSESSIONID 就OK了,NX-ANTI-CSRF-TOKEN 无需再关注。

最后,就是设置角色,给特定的账号纳入指定分组,我当时的目标是给出去的账号所在角色只能拉取 gradle 上指定的库,没有其它权限,按下图设置就满足了

privileges

看需要觉得要加什么仓库类型的什么操作 nx-repository-view-<RepoType>-<RepoName>-<operationType>

CocoaPods 搭建

搭建 Gitlab

安装

# 安装依赖
$ sudo apt-get install curl openssh-server ca-certificates postfix
# 下载包
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
# 安装包
$ sudo apt-get install gitlab-ce

配置

$ cd /opt/gitlab/embedded/service/gitlab-rails/config
$ cp gitlab.yml.example gitlab.yml
$ vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml # 修改 IP 、端口、协议头
$ vim /etc/gitlab/gitlab.rb # 修改 对外 URL、Nginx 监听端口

修改 gitlab.rb 几个注意点,否则很容易出现 connect refused 的问题

external_url 'https://x.x.x.x' # 必须带 http 或 https 协议头
...
nginx['listen_port'] = 1234 # 需要在这里修改 nginx 监听的端口号

以及修改 gitlab.yml

gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    host: x.x.x.x
    port: 1234
    https: true

最后激活配置及启动 GitLab

$ gitlab-ctl reconfigure
$ gitlab-ctl start

如果服务器的 root 被重置密码的话,需对 gitlab 的 root 账号也进行重置密码

gitlab-rails console production //进入gitlab串口环境
>user = User.where(id: 1).first //定位到gitlab 数据库中Users表中的一个用户,通常就是管理员用户admin@local.host
> user.password=12345678 
> user.password_confirmation=12345678 //确认管理员密码为12345678
> user.save! //保存更改信息,需要使用后面的感叹号!

定制账号

因为 iOS 可以使用 GitLab 提供的 REST API 来创建 Git 账号,相对 Android 方便些。

资源把控

我们对外的 Cocoapods 不能使用源码的方式提供,即使你把 vendored_librariesvendored_frameworks 设置上了,让被依赖的项目以库形式提供,但因 Cocoapods 本身会将

这又要面对另一个问题,随着这些二进制的库文件不断提交,GitLab 服务器硬盘资源也在被快速消耗,因为它们不是以增量式,而是以全量的变更记录来提交版本。解决办法有几个:

  • 尽量将仓库项目细分,避免因为单一的变动而需要更新一次大体量库的情况;
  • 保持使用整合式的大体量库仓库,但每次提交新版本后都将历史版本移除。

配置 Cocoapods

创建私有 Pod 仓库

此处省略1千字

配置发布项目

主要是配置项目中的 podspec 文件,而只提供 framework 不提供源码可参考 Bugly 的配置

Pod::Spec.new do |s|
  s.authors      = "Tencent"
  s.name         = "Bugly"
  s.version      = "2.5.2"
  s.summary      = "Bugly iOS SDK"
  s.description  = "iOS library for Bugly Crash Report Service. Sign up for a service at https://bugly.qq.com."
  s.homepage     = "http://bugly.qq.com/"
  s.license      = { :type => "Commercial", :text => "Copyright (C) 2017 Tencent Bugly, Inc. All rights reserved."}
  s.author       = { "Tencent" => "bugly@tencent.com" }
  s.source       = { :http => "http://softfile.3g.qq.com/myapp/buglysdk/Bugly-2.5.2.zip" }
  s.requires_arc = true  
  s.platform     = :ios
  s.ios.deployment_target = '7.0'
  s.vendored_frameworks ='Bugly.framework'
  s.frameworks = 'SystemConfiguration','Security'
  s.library = 'z','c++'
  s.license      = {
    :type => 'Copyright',
    :text => <<-LICENSE
      Copyright (C) 2017 Tencent Bugly, Inc. All rights reserved.
      LICENSE
  }
end

核心就是靠 s.vendored_frameworks 去声明该库需以 framework 形式引用,其次在 s.source 指定放库(zip)的私有 Git 地址(原本是设定开源项目地址+Tag的形式)。

步骤

  • 打出新版本 framework
  • 修改 podspec 文件中的版本号等信息,push 到 pod repo
  • 将 framework 压缩成 zip,连同 podspec 上传到私有仓库(被 pod 时会自动解压)
  • 依赖工程的 Podfile 中为 Target 添加 use_frameworks!

迁移

2021.11.05 更新
后来有一个从 ubuntu 迁移到 centos7 的情况,有下列相关的过程

安装/更新 pyhton
https://www.jianshu.com/p/e07fc84bb879

安装 uwsgi
https://blog.51cto.com/u_7739395/2736431

查看 gitlab 版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

下载 gitlab
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

gitlab 备份及恢复
https://www.cnblogs.com/mingerlcm/p/12633720.html

maven 备份
https://www.cnblogs.com/nethrd/p/9554163.html

升级 sqlite3
https://www.cnblogs.com/leffss/p/11555556.html

重启 ng
https://developer.aliyun.com/article/603862

启动 gitlab
https://stackoverflow.com/questions/41956994/initdb-bin-invalid-locale-settings-check-lang-and-lc-environment-variables
https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4840

下载 nexus
https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3
实际将整个 nexus 和 sonatype 拷贝过去即可

升级 gitlab
https://zhuanlan.zhihu.com/p/352342116

参考

搭建自己的maven服务器
Centos下 Nexus 3.x 搭建Maven 私服
GitLab - Users API - List users
How to reset a forgotten admin password in Nexus 3.x
GitLab CE 搭建小结
NGINX: 反向代理 Nexus
401 Anti cross-site request forgery token mismatch blocks valid npm client publish and login
Add run script build phase to Xcode project from podspec


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com

文章标题:Ubuntu 下搭建带鉴权机制的 SDK 仓库

文章字数:3.1k

本文作者:Mingfung

发布时间:2021-06-24, 16:42:28

最后更新:2022-01-13, 17:32:03

原始链接:http://blog.ifungfay.com/uncategorized/Ubuntu-下搭建带鉴权机制的-Nexus3-x-Maven-私服/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

宝贝回家