來自我的 Blog Danny's Dream
起因
最近在給公司的 SDK 蝶糯,做一個 maven 的倉庫琉雳,方便 CP 嵌入叮趴「铙希花了整兩天的時間,身為移動開發(fā)的我之前沒怎么接觸過服務器相關(guān)的內(nèi)容疫向,這里做一個記錄和分享咳蔚,** 并且網(wǎng)上大部分的教程都是如何搭建本地倉庫的 **。
用到了以下幾個內(nèi)容
- Artifactory jfrog 家的用來做倉庫管理和持續(xù)集成【配合 Jenkins 】的工具 免費版就夠用了 【支持 maven gradle】
- Maven Maven是Java開發(fā)者中流行的構(gòu)建工具搔驼,Maven的好處之一是可以幫助減少構(gòu)建應用程序時所依賴的軟件構(gòu)件的副本谈火,Maven建議的方法是將所有軟件構(gòu)件存儲于一個叫做repository的遠程倉庫中。
- Gradle 是 Android Studio 中帶的自動化構(gòu)建工具 是 maven 的擴展
- Nginx 是一個高性能的HTTP和反向代理服務器舌涨,也是一個IMAP/POP3/SMTP服務器糯耍,用來處理代理的。
之前沒有怎么操作過 Linux 的服務器囊嘉,這次經(jīng)歷還是很有趣的温技,把遇到的問題記錄一下。
連接主機
運維提供的服務器是 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
這樣的方式雖然可以博其,但是每次都這么輸入未免太麻煩了套才。
網(wǎng)上查了,提供了以下的方式解決的我的需求慕淡。
在 .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 的官網(wǎng) https://www.jfrog.com/open-source/
通過 java - version 檢查 java 環(huán)境
他需要的是 java8 的環(huán)境,如果沒有的話,要先給服務器搭建 jdk8 的環(huán)境傻寂。
但是里面的下載好像不能通過息尺,Linux 的 wget 指令直接在服務器內(nèi)部進行下載。
我是在本地下載完之后崎逃,通過 scp 指令再拷貝到服務器的【這里也需要 ssh key】
移動到服務器之后掷倔,通過 unzip 解壓眉孩。
得到下面的內(nèi)容
進入到 bin 文件夾中有
注意三個文件:
- artifactory.sh 用來直接運行 artifactory 的進程个绍,運行之后就會打開 tomcat ,并且部署一個可視化的網(wǎng)頁
http://<你的ip>/artifactory/webapp/#/home
- installService.sh 這個是用來安裝 artifactory 的服務浪汪,可以作為服務在后臺自動運行巴柿,并會隨服務器一起啟動【我猜的。死遭。我看他是移動到了init的目錄下面】
- artifactoryManage.sh 是用來做服務管理的提供幾種方式
{start|stop|restart|redebug|status|check} 這個就不翻譯了广恢,可以看到當前的狀態(tài)。
使用方法這樣 ./artifactoryManage.sh check 加命令
注意的地方:
一般的教程都是讓你呀潭,直接執(zhí)行 artifactory.sh 就可以啟動了钉迷。其實服務端更多的時候希望他是作為后臺常駐的。
所以這里我們要執(zhí)行的 installService.sh 腳本
執(zhí)行完之后 會看到給我們的提示幫我們移動到了 /etc/init.d/artifactory 目錄中
通過這兩個指令可以檢查和啟動后臺的服務钠署。
/etc/init.d/artifactory check
/etc/init.d/artifactory start
** 這里要注意 artifactory.default 中的 user 的配置 糠聪!**
默認的是設置為 artifactory 的,但是 artifactory 用戶的權(quán)限不夠【可能是我們服務器配置的原因】谐鼎,
會導致 /etc/init.d/artifactory start 由于權(quán)限不夠而無法啟動 tomcat 的舰蟆。這是當時困擾了我很久問題。
按照上面的操作狸棍,你應該已經(jīng)能看到 Artifactory 的界面了
剛進去的時候會讓你設置 admin 密碼身害,同時設置倉庫類型。
都完成之后是這樣的界面:
這里學到了如下幾個 Linux 指令
ps -ef | grep artifactory
ps -ef 查看所有的進程草戈,通過 grep 進行過濾塌鸯,可以看到和 artifactory 相關(guān)的進程,拿到 pid 之后
通過
kill -9 目標id
就可以停止目標進程
Lib 的上傳
下面的內(nèi)容就相對簡單了唐片。
在你的 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 {
// 需要構(gòu)建的路徑
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丙猬。
然后開始執(zhí)行上傳!
步驟如下
- clean 初始化
- assembleRelease 構(gòu)建 aar
- artifactoryPublish 發(fā)布到 Artifactory 中
問題
這里第一次 publish 的時候上傳失敗,遇到問題牵触,說找不到 POM 文件淮悼。
我去對應的路徑里面找,確實沒有生成揽思。
一開始我的操作是把上面的 artifactory 中的 defaults 的 publishPom 設置為 false 袜腥。這樣能順利 build 的,但是沒有上傳 POM 文件。
導致了后面在 demo 中通過 compile 'cn.test.test:testsdk:3.0.0' 這樣的形式找不到包羹令,必須通過明確的 aar 后綴的 complie 方式才能找到包鲤屡,估計 POM 文件是起到類型配置的作用的。
正確的操作應該執(zhí)行一下 artifactoryPublish 下面的 generatePomFileForAarPublication 就會生成了福侈。
?? 呵呵 沒想到吧
反正我是翻了大量的資料酒来,最后自己發(fā)現(xiàn)的。肪凛。堰汉。看的懂英文多重要伟墙!
上傳上去需要配置的三個參數(shù)
- 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 的格式,是根據(jù)這個規(guī)則生成的拱烁。
GROUP_ID:ARTIFACT_ID:VERSION_NAME
公網(wǎng)映射
上面的流程夕玩,你已經(jīng)可以在你的本地厘惦,在連接上服務器之后,可以愉快的進行構(gòu)建的,可是目標是為了服務 CP萍程,CP 可不在內(nèi)網(wǎng)環(huán)境一姿。
我們希望的最終目標是他們能配置下面的 repo 地址厨喂,就能夠下載到需要的依賴包吴超。
maven { url "http://repo.test.com/gradle/" }
這邊有兩部分操作
- Nginx 做端口轉(zhuǎn)發(fā)80到8081
- 聯(lián)系運維做外網(wǎng)的域名映射
之前一直對 Nginx 是個什么東西半知半解。
比如我們訪問了一個 ** tan 90 ** 的網(wǎng)址剂娄,看到這個界面
下面一行小字 nginx 蠢涝。我所理解的 Nginx 應該是客戶端和服務端中間的一層代理,他可以控制 a1 事件到 b 服務器處理阅懦,a2 事件到 c 服務器處理和二。請教了后臺的同事,nginx 還有很多作用耳胎,如負載均衡等等惯吕。
所以我們的流程如下
2 映射到我們的目標服務器
3 nginx 進行端口的跳轉(zhuǎn) 80 交給 http://192.168.111.11:8081/artifactory/gradle-release-local
配置 Nginx
可以參考這篇文章相當?shù)脑敿?br> http://www.nginx.cn/install
需要以下環(huán)境
- gcc g++ 用來編譯
- gzip 模塊需要 zlib 庫 ( 下載: http://www.zlib.net/ )
- rewrite 模塊需要 pcre 庫 ( 下載: http://www.pcre.org/ )
- ssl 功能需要 openssl 庫 ( 下載: http://www.openssl.org/ )
對應的最新包地址如下,都可以通過 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 的操作了。
把三個都執(zhí)行完之后,開始安裝 Nginx 羽戒。
最新地址
wget http://nginx.org/download/nginx-1.12.0.tar.gz
這里要設置一下 configure 的相關(guān)參數(shù)缤沦,設置為上面的幾個包。
默認都是下載到一個路徑下面易稠,解壓安裝
./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
發(fā)現(xiàn)報錯了:
error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
經(jīng)網(wǎng)上查詢缸废,這是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 地址如果是這個界面就是成功了。
端口轉(zhuǎn)發(fā)
下面就可以衬吆,配置 nginx 進行端口的跳轉(zhuǎn) 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;
}
//通過這里加了代理的跳轉(zhuǎn)
location /gradle/{
proxy_pass http://192.168.111.11:8081/artifactory/gradle-release-local/;
}
}
這里用到了重啟 nginx 的指令
./nginx -s reload
通過上面的配置就能實現(xiàn)跳轉(zhuǎn)功能逊抡。
測試的方式就是訪問
http://192.168.111.11/gradle/
看看是不是和之前是一樣的路徑,成功就是說明轉(zhuǎn)發(fā)成功了零酪。
映射
接下來就是聯(lián)系運維幫你做一下外網(wǎng)的映射冒嫡。就可以通過
http://repo.test.com/gradle/
來訪問你的 maven 庫了。
總結(jié)
通過這篇文章四苇,基本可以從零服務端基礎完整的搭建起一個 maven 倉庫了孝凌。如果只是內(nèi)網(wǎng)或者本地倉庫的話,就不用 nginx 這部分操作了月腋。