从零开始通过 Artifactory 搭建公网的 maven 仓库

来自我的 Blog Danny's Dream

起因

最近在给公司的 SDK ,做一个 maven 的仓库,方便 CP 嵌入。花了整两天的时间,身为移动开发的我之前没怎么接触过服务器相关的内容,这里做一个记录和分享,** 并且网上大部分的教程都是如何搭建本地仓库的 **。
用到了以下几个内容

  • Artifactory jfrog 家的用来做仓库管理和持续集成【配合 Jenkins 】的工具 免费版就够用了 【支持 maven gradle】
  • Maven Maven是Java开发者中流行的构建工具,Maven的好处之一是可以帮助减少构建应用程序时所依赖的软件构件的副本,Maven建议的方法是将所有软件构件存储于一个叫做repository的远程仓库中。
  • Gradle 是 Android Studio 中带的自动化构建工具 是 maven 的扩展
  • Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,用来处理代理的。

之前没有怎么操作过 Linux 的服务器,这次经历还是很有趣的,把遇到的问题记录一下。

连接主机

运维提供的服务器是 Linux 的,通过 ssh 方式来连接服务器。

ssh xxx.xxx.xxx.xxx

这一步遇到的问题是 公司的 Linux 登录验证是提供了一个 私有的 ssh key,
我本地配置的是 GitHub 的 ssh key,默认连接的时候用的是 GitHub 的 key。
运维给出的方式是通过 -i 加上 key 的路径来登陆。

ssh -i dan-key xxx.xxx.xxx.xxx

这样的方式虽然可以,但是每次都这么输入未免太麻烦了。
网上查了,提供了以下的方式解决的我的需求。
在 .ssh 文件下面建一个 config 文件如下配置

# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa 

# maven
Host 192.168.111.11
User liudan 
PreferredAuthentications publickey
IdentityFile ~/.ssh/liudan-server 

这样就能完美解决了多 ssh key 的登录情况。

安装 Artifactory

Artifactory 的官网 https://www.jfrog.com/open-source/
通过 java - version 检查 java 环境
他需要的是 java8 的环境,如果没有的话,要先给服务器搭建 jdk8 的环境。
但是里面的下载好像不能通过,Linux 的 wget 指令直接在服务器内部进行下载。
我是在本地下载完之后,通过 scp 指令再拷贝到服务器的【这里也需要 ssh key】
移动到服务器之后,通过 unzip 解压。
得到下面的内容


进入到 bin 文件夹中有


注意三个文件:

  • artifactory.sh 用来直接运行 artifactory 的进程,运行之后就会打开 tomcat ,并且部署一个可视化的网页
http://<你的ip>/artifactory/webapp/#/home
  • installService.sh 这个是用来安装 artifactory 的服务,可以作为服务在后台自动运行,并会随服务器一起启动【我猜的。。我看他是移动到了init的目录下面】
  • artifactoryManage.sh 是用来做服务管理的提供几种方式
    {start|stop|restart|redebug|status|check} 这个就不翻译了,可以看到当前的状态。
    使用方法这样 ./artifactoryManage.sh check 加命令

注意的地方:
一般的教程都是让你,直接执行 artifactory.sh 就可以启动了。其实服务端更多的时候希望他是作为后台常驻的。
所以这里我们要执行的 installService.sh 脚本
执行完之后 会看到给我们的提示帮我们移动到了 /etc/init.d/artifactory 目录中
通过这两个指令可以检查和启动后台的服务。
/etc/init.d/artifactory check
/etc/init.d/artifactory start

** 这里要注意 artifactory.default 中的 user 的配置 !**
默认的是设置为 artifactory 的,但是 artifactory 用户的权限不够【可能是我们服务器配置的原因】,
会导致 /etc/init.d/artifactory start 由于权限不够而无法启动 tomcat 的。这是当时困扰了我很久问题。

按照上面的操作,你应该已经能看到 Artifactory 的界面了
刚进去的时候会让你设置 admin 密码,同时设置仓库类型。
都完成之后是这样的界面:


这里学到了如下几个 Linux 指令

ps -ef | grep artifactory

ps -ef 查看所有的进程,通过 grep 进行过滤,可以看到和 artifactory 相关的进程,拿到 pid 之后
通过

kill -9 目标id

就可以停止目标进程

Lib 的上传

下面的内容就相对简单了。
在你的 lib 的工程的 build.gradle 中增加如下插件的依赖

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:latest.release'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

接着在你需要上传的 lib 的 module 的 build.gradle 的文件中增加如下配置:
这个是用来配置上传的路径和账号信息的

artifactory {
    contextUrl = MAVEN_LOCAL_PATH
    publish {
        repository {
            // 需要构建的路径
            repoKey = 'gradle-release-local'

            username = 'admin'
            password = '这里是密码'
        }
        defaults {
            // Tell the Artifactory Plugin which artifacts should be published to Artifactory.
            publications('aar')
            publishArtifacts = true

            // Properties to be attached to the published artifacts.
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            // Publish generated POM files to Artifactory (true by default)
            // POM 文件
            publishPom = true
        }
    }
}

还有是配置上传的版本信息

def MAVEN_LOCAL_PATH ='http://192.168.111.11:8081/artifactory'
def ARTIFACT_ID = 'testsdk'
def VERSION_NAME = '3.0.0'
def GROUP_ID = 'cn.test.test'

publishing {
    publications {
        aar(MavenPublication) {
            groupId GROUP_ID
            version = VERSION_NAME
            artifactId ARTIFACT_ID

            // Tell maven to prepare the generated "*.aar" file for publishing
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")

        }
    }
}

最主要的是配置这两个 task。
然后开始执行上传!
步骤如下

  • clean 初始化
  • assembleRelease 构建 aar
  • artifactoryPublish 发布到 Artifactory 中

问题
这里第一次 publish 的时候上传失败,遇到问题,说找不到 POM 文件。
我去对应的路径里面找,确实没有生成。
一开始我的操作是把上面的 artifactory 中的 defaults 的 publishPom 设置为 false 。这样能顺利 build 的,但是没有上传 POM 文件。

导致了后面在 demo 中通过 compile 'cn.test.test:testsdk:3.0.0' 这样的形式找不到包,必须通过明确的 aar 后缀的 complie 方式才能找到包,估计 POM 文件是起到类型配置的作用的。

正确的操作应该执行一下 artifactoryPublish 下面的 generatePomFileForAarPublication 就会生成了。
🙂 呵呵 没想到吧
反正我是翻了大量的资料,最后自己发现的。。。看的懂英文多重要!

上传上去需要配置的三个参数

  • ARTIFACT_ID 你的库名字
  • GROUP_ID 库的包名【可以这么理解】
  • VERSION_NAME 库的版本号

Lib 的集成

当上一步的包上传完成之后,在你的本地通过下面两个配置就可以测试了。
首先在 Demo 的项目 gradle 增加 maven 库的地址,记得和你上面的对应。
大概是这样

allprojects {
    repositories {
        jcenter()
        maven { url "http://192.168.111.11:8081/artifactory/gradle-release-local" }
    }
}

在 Demo 的 app 的 gradle dependencies 加上

compile 'cn.test.test:testsdk:3.0.0'

sync 一下你的 gradle 文件,需要的插件就下下来了~

注意这个 compile 的格式,是根据这个规则生成的。

GROUP_ID:ARTIFACT_ID:VERSION_NAME

公网映射

上面的流程,你已经可以在你的本地,在连接上服务器之后,可以愉快的进行构建的,可是目标是为了服务 CP,CP 可不在内网环境。
我们希望的最终目标是他们能配置下面的 repo 地址,就能够下载到需要的依赖包。

 maven { url "http://repo.test.com/gradle/" }

这边有两部分操作

  • Nginx 做端口转发80到8081
  • 联系运维做外网的域名映射

之前一直对 Nginx 是个什么东西半知半解。
比如我们访问了一个 ** tan 90 ** 的网址,看到这个界面

下面一行小字 nginx 。我所理解的 Nginx 应该是客户端和服务端中间的一层代理,他可以控制 a1 事件到 b 服务器处理,a2 事件到 c 服务器处理。请教了后台的同事,nginx 还有很多作用,如负载均衡等等。

所以我们的流程如下

配置 Nginx

可以参考这篇文章相当的详细
http://www.nginx.cn/install

需要以下环境

对应的最新包地址如下,都可以通过 wget 命令下载:

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz 
wget http://zlib.net/zlib-1.2.11.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz

下完之后就是解压,tar,cd 进去,./config,make,make install 的操作了。
把三个都执行完之后,开始安装 Nginx 。

最新地址

wget http://nginx.org/download/nginx-1.12.0.tar.gz

这里要设置一下 configure 的相关参数,设置为上面的几个包。
默认都是下载到一个路径下面,解压安装

./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid  --with-http_ssl_module --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.0.2l

启动 Nginx

通过 /usr/local/nginx/sbin/nginx

发现报错了:
error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
经网上查询,这是linux的通病
下面这样可以解决

[root@localhost nginx]# sbin/nginx 
sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
[root@localhost nginx]# error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
[root@localhost nginx]# whereis libpcre.so.1
libpcre.so: /lib64/libpcre.so.0 /usr/local/lib/libpcre.so /usr/local/lib/libpcre.so.1
[root@localhost nginx]# ln -s /usr/local/lib/libpcre.so.1 /lib64
[root@localhost nginx]# sbin/nginx   

先找到libpcre.so.1所在位置,然后做个软链接就可以了。

再次启动!
直接访问你的 ip 地址如果是这个界面就是成功了。

端口转发

下面就可以,配置 nginx 进行端口的跳转 80 交给 http://192.168.111.11:8081/artifactory/gradle-release-local
修改 nginx 的 nginx.conf 文件。
配置如下

  server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        //通过这里加了代理的跳转
        location /gradle/{
            proxy_pass  http://192.168.111.11:8081/artifactory/gradle-release-local/;
        }

    }

这里用到了重启 nginx 的指令

./nginx -s reload

通过上面的配置就能实现跳转功能。
测试的方式就是访问
http://192.168.111.11/gradle/
看看是不是和之前是一样的路径,成功就是说明转发成功了。

映射

接下来就是联系运维帮你做一下外网的映射。就可以通过
http://repo.test.com/gradle/
来访问你的 maven 库了。

总结

通过这篇文章,基本可以从零服务端基础完整的搭建起一个 maven 仓库了。如果只是内网或者本地仓库的话,就不用 nginx 这部分操作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容