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,重置密码后会自动删除
禁用匿名模式的访问
应用
上传 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 请求,我们自己就可以进行模拟了。
经过分析,大致会用到以下接口
- 获取 Session ID:https://mynexus.com/service/rapture/session (注意账号密码经过 base64 编码)
- 验证账号、创建账号、更新密码、删除账号:https://mynexus.com/service/extdirect
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 上指定的库,没有其它权限,按下图设置就满足了
看需要觉得要加什么仓库类型的什么操作 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_libraries
或 vendored_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" 转载请保留原文链接及作者。