庫(kù)安裝與配置實(shí)戰(zhàn)指南)
1. 項(xiàng)目概述為什么我們需要一個(gè)專業(yè)的制品倉(cāng)庫(kù)如果你是一名開發(fā)者尤其是經(jīng)歷過團(tuán)隊(duì)協(xié)作、持續(xù)集成CI/CD或者微服務(wù)架構(gòu)的開發(fā)者那么你一定對(duì)“依賴管理”和“制品管理”這兩個(gè)詞深有感觸。想象一下你的團(tuán)隊(duì)有十個(gè)微服務(wù)每個(gè)服務(wù)都依賴幾十個(gè)第三方庫(kù)同時(shí)每個(gè)服務(wù)編譯后又會(huì)生成自己的Jar包、Docker鏡像。這些依賴從哪里來編譯好的包又存到哪里去如果每個(gè)人都從互聯(lián)網(wǎng)直接下載依賴速度慢不說一旦某個(gè)公共倉(cāng)庫(kù)比如Maven Central宕機(jī)整個(gè)團(tuán)隊(duì)的開發(fā)就可能陷入停滯。更別提那些內(nèi)部開發(fā)的、不能公開的私有組件了。這就是JFrog Artifactory要解決的核心問題它是一款企業(yè)級(jí)的通用制品倉(cāng)庫(kù)管理工具。你可以把它理解為一個(gè)超級(jí)智能的“圖書館”兼“倉(cāng)庫(kù)管理員”。它不僅能代理和緩存來自互聯(lián)網(wǎng)上各種公共倉(cāng)庫(kù)如Maven、npm、Docker Hub、PyPI等的組件還能作為私有倉(cāng)庫(kù)安全地存儲(chǔ)和管理你們團(tuán)隊(duì)自己產(chǎn)生的所有構(gòu)建產(chǎn)物Artifacts。它統(tǒng)一了這些資源的入口提供了細(xì)粒度的權(quán)限控制、安全掃描、元數(shù)據(jù)管理和高可用部署能力。今天這篇“入門篇”我們就來手把手完成Artifactory最基本、也是最關(guān)鍵的一步環(huán)境安裝。我會(huì)以一個(gè)最常見的場(chǎng)景——在Linux服務(wù)器上安裝Artifactory OSS開源版為例把每一步的操作意圖、背后原理以及我踩過的坑都講清楚。無論你是運(yùn)維工程師準(zhǔn)備搭建基礎(chǔ)服務(wù)還是開發(fā)人員想在自己的測(cè)試環(huán)境里搞一個(gè)來玩玩這篇指南都能讓你少走很多彎路。2. 環(huán)境準(zhǔn)備與規(guī)劃兵馬未動(dòng)糧草先行在真正執(zhí)行安裝命令之前充分的準(zhǔn)備工作能避免至少80%的后續(xù)問題。Artifactory對(duì)運(yùn)行環(huán)境有一定要求盲目安裝很容易遇到各種兼容性和性能瓶頸。2.1 系統(tǒng)要求與資源評(píng)估首先我們得看看我們的“戰(zhàn)場(chǎng)”——服務(wù)器是否符合要求。操作系統(tǒng)Artifactory官方支持主流的Linux發(fā)行版如RHEL/CentOS 7、Ubuntu 18.04、Windows Server以及MacOS主要用于開發(fā)測(cè)試。對(duì)于生產(chǎn)環(huán)境Linux是首選尤其是RHEL/CentOS或Ubuntu LTS版本因?yàn)樗鼈冇虚L(zhǎng)期穩(wěn)定的內(nèi)核和庫(kù)文件支持。本文將以CentOS 7.9為例進(jìn)行演示其他Linux發(fā)行版的命令大同小異。硬件資源這是最容易出問題的地方。很多人用一臺(tái)1核2G的虛擬機(jī)就想跑Artifactory結(jié)果發(fā)現(xiàn)奇慢無比甚至頻繁崩潰。CPU至少2核。如果作為團(tuán)隊(duì)使用超過10人或需要處理大量Docker鏡像拉取推送建議4核或以上。Artifactory的索引、計(jì)算校驗(yàn)和、執(zhí)行垃圾回收等操作都比較吃CPU。內(nèi)存這是重中之重。最低4GB強(qiáng)烈建議8GB起步。Artifactory本身是基于Java的應(yīng)用程序JVM堆內(nèi)存默認(rèn)配置就比較大。此外它內(nèi)部使用Elasticsearch7.x版本后內(nèi)置進(jìn)行元數(shù)據(jù)索引和搜索這也是個(gè)內(nèi)存大戶。內(nèi)存不足會(huì)導(dǎo)致GC頻繁服務(wù)響應(yīng)緩慢甚至Elasticsearch節(jié)點(diǎn)脫離集群。磁盤需要考慮容量、性能和類型。容量這取決于你要存儲(chǔ)多少制品。一個(gè)簡(jiǎn)單的估算方法是日均構(gòu)建次數(shù) * 平均制品大小 * 保留天數(shù)。對(duì)于初期測(cè)試100GB可能夠用但生產(chǎn)環(huán)境通常需要TB級(jí)別并且要預(yù)留30%以上的增長(zhǎng)空間。性能強(qiáng)烈推薦使用SSD。機(jī)械硬盤的IOPS每秒讀寫次數(shù)很可能成為瓶頸尤其是在并發(fā)上傳/下載較多時(shí)。Artifactory需要頻繁讀寫文件并更新數(shù)據(jù)庫(kù)索引。類型最好將Artifactory的數(shù)據(jù)目錄默認(rèn)是$JFROG_HOME/artifactory/var掛載到獨(dú)立的、容量大的存儲(chǔ)卷上方便日后擴(kuò)容和備份。網(wǎng)絡(luò)確保服務(wù)器有穩(wěn)定的網(wǎng)絡(luò)連接能夠訪問外網(wǎng)以下載必要的依賴和更新。如果處于內(nèi)網(wǎng)需要提前配置好代理或準(zhǔn)備好離線的安裝包和依賴庫(kù)。注意在虛擬化或云環(huán)境中要特別注意磁盤的IOPS配額和網(wǎng)絡(luò)帶寬。云廠商的“突發(fā)性能”磁盤在耗盡積分后性能會(huì)驟降可能直接拖垮Artifactory服務(wù)。2.2 依賴軟件檢查與安裝Artifactory的運(yùn)行依賴于Java環(huán)境。雖然最新的安裝包可能會(huì)捆綁某個(gè)版本的JRE但事先準(zhǔn)備好一個(gè)兼容的JDK總是更穩(wěn)妥的做法。檢查現(xiàn)有Javajava -version如果顯示類似“openjdk version 1.8.0_352”的信息說明已安裝。Artifactory 7.x 需要Java 11 或 Java 8具體版本請(qǐng)查閱官方文檔。建議使用OpenJDK 11或更高版本以獲得更好的性能和支持。安裝OpenJDK 11如果未安裝# 對(duì)于CentOS/RHEL sudo yum install -y java-11-openjdk-devel # 對(duì)于Ubuntu/Debian sudo apt update sudo apt install -y openjdk-11-jdk驗(yàn)證安裝并設(shè)置JAVA_HOMEjava -version # 查找Java安裝路徑 sudo update-alternatives --config java # 記下路徑例如 /usr/lib/jvm/java-11-openjdk-11.0.xx.x.x-x.el7_9.x86_64/bin/java # 將其設(shè)置到環(huán)境變量編輯 ~/.bashrc 或 /etc/profile echo export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.xx.x.x-x.el7_9.x86_64 ~/.bashrc echo export PATH$JAVA_HOME/bin:$PATH ~/.bashrc source ~/.bashrc echo $JAVA_HOME2.3 防火墻與SELinux配置為了避免安裝后無法訪問需要提前處理好系統(tǒng)的安全策略。防火墻Artifactory的Web UI默認(rèn)使用端口8081社區(qū)版或8082專業(yè)版。如果你打算將其作為Docker Registry使用還需要開放8082端口v1/v2 API或5000-5002端口獨(dú)立Docker Registry服務(wù)。# CentOS 7 使用firewalld sudo firewall-cmd --permanent --add-port8081/tcp sudo firewall-cmd --permanent --add-port8082/tcp sudo firewall-cmd --reload sudo firewall-cmd --list-ports # 確認(rèn)端口已開放 # Ubuntu 使用ufw sudo ufw allow 8081/tcp sudo ufw allow 8082/tcp sudo ufw reloadSELinux在CentOS/RHEL上SELinux可能會(huì)阻止Artifactory訪問其數(shù)據(jù)目錄。對(duì)于測(cè)試環(huán)境可以先將其設(shè)置為寬容模式或禁用。# 查看當(dāng)前狀態(tài) getenforce # 顯示 Enforcing, Permissive 或 Disabled # 臨時(shí)設(shè)置為寬容模式重啟失效 sudo setenforce 0 # 永久修改編輯 /etc/selinux/config將 SELINUXenforcing 改為 SELINUXpermissive # 然后重啟服務(wù)器對(duì)于生產(chǎn)環(huán)境更推薦的做法是配置正確的SELinux上下文策略而不是直接關(guān)閉。3. 安裝過程詳解三種主流方式的選擇與實(shí)操Artifactory提供了多種安裝方式以適應(yīng)不同的運(yùn)維習(xí)慣和環(huán)境需求。這里我們?cè)敿?xì)講解最常見的三種使用RPM/DEB包安裝、使用Docker安裝、以及使用歸檔文件ZIP/TAR安裝。3.1 方式一使用RPM/DEB包安裝推薦用于Linux生產(chǎn)環(huán)境這是Linux服務(wù)器上最經(jīng)典、最易于管理的方式。安裝包會(huì)幫你處理好服務(wù)注冊(cè)、日志輪轉(zhuǎn)、依賴目錄創(chuàng)建等瑣事。步驟1下載安裝包訪問JFrog官方下載中心找到Artifactory OSS (Open Source)版本。你可以通過wget直接下載。# 以 CentOS 7 和 Artifactory OSS 7.x 為例 wget https://releases.jfrog.io/artifactory/artifactory-rpms/artifactory-rpms.repo -O /etc/yum.repos.d/artifactory-rpms.repo # 或者直接下載最新RPM包 wget https://releases.jfrog.io/artifactory/artifactory-pro/org/artifactory/pro/jfrog-artifactory-pro/[最新版本]/jfrog-artifactory-pro-[最新版本].rpm # 對(duì)于OSS版請(qǐng)確認(rèn)下載鏈接是 oss 版本步驟2安裝RPM包# 如果你添加了repo可以直接yum安裝 sudo yum install -y jfrog-artifactory-oss # 或者使用下載的本地rpm文件 sudo yum install -y ./jfrog-artifactory-oss-*.rpm安裝過程會(huì)自動(dòng)創(chuàng)建jfrog用戶和用戶組以及/opt/jfrog目錄作為主目錄。步驟3管理服務(wù)安裝完成后Artifactory會(huì)作為一個(gè)systemd服務(wù)被注冊(cè)。# 啟動(dòng)服務(wù) sudo systemctl start artifactory # 設(shè)置開機(jī)自啟 sudo systemctl enable artifactory # 查看服務(wù)狀態(tài) sudo systemctl status artifactory # 查看實(shí)時(shí)日志 sudo tail -f /var/opt/jfrog/artifactory/logs/artifactory.log實(shí)操心得數(shù)據(jù)目錄RPM安裝后數(shù)據(jù)默認(rèn)在/var/opt/jfrog/artifactory。在首次啟動(dòng)前你應(yīng)該確認(rèn)這個(gè)目錄所在的磁盤有足夠空間并且IO性能良好。如果需要遷移最好是在首次啟動(dòng)前修改$JFROG_HOME/artifactory/var的軟鏈接而不是啟動(dòng)后移動(dòng)數(shù)據(jù)。配置文件主配置文件位于/var/opt/jfrog/artifactory/etc/artifactory/artifactory.system.properties。大部分高級(jí)配置都在這里進(jìn)行但初期不建議修改。3.2 方式二使用Docker安裝推薦用于快速測(cè)試和容器化部署Docker方式極度簡(jiǎn)化了安裝過程非常適合快速搭建測(cè)試環(huán)境也符合當(dāng)下容器化部署的趨勢(shì)。步驟1拉取鏡像Docker Hub上提供了官方鏡像。OSS版鏡像標(biāo)簽為releases-docker.jfrog.io/jfrog/artifactory-oss:latest。# 拉取最新OSS版鏡像 docker pull releases-docker.jfrog.io/jfrog/artifactory-oss:latest步驟2運(yùn)行容器關(guān)鍵點(diǎn)在于數(shù)據(jù)持久化。必須將容器內(nèi)的數(shù)據(jù)卷映射到宿主機(jī)否則容器重啟后所有數(shù)據(jù)都會(huì)丟失。# 創(chuàng)建宿主機(jī)數(shù)據(jù)目錄 mkdir -p ~/artifactory/var # 運(yùn)行容器 docker run -d \ --name artifactory \ -p 8081:8081 \ -p 8082:8082 \ -v ~/artifactory/var:/var/opt/jfrog/artifactory \ releases-docker.jfrog.io/jfrog/artifactory-oss:latest參數(shù)解釋-d: 后臺(tái)運(yùn)行。--name: 給容器起個(gè)名字。-p 8081:8081: 將宿主機(jī)的8081端口映射到容器的8081端口Web UI。-p 8082:8082: 映射8082端口Artifactory API和Docker Registry。-v ...: 這是最重要的一步。將宿主機(jī)的~/artifactory/var目錄掛載到容器內(nèi)的數(shù)據(jù)目錄實(shí)現(xiàn)數(shù)據(jù)持久化。步驟3訪問與驗(yàn)證等待幾十秒后在瀏覽器訪問http://你的服務(wù)器IP:8081。你應(yīng)該能看到Artifactory的初始化界面。注意事項(xiàng)權(quán)限問題如果宿主機(jī)上的數(shù)據(jù)目錄如~/artifactory/var權(quán)限過嚴(yán)可能導(dǎo)致容器內(nèi)進(jìn)程無法寫入。一個(gè)簡(jiǎn)單的辦法是在運(yùn)行前將目錄權(quán)限設(shè)為777僅限測(cè)試環(huán)境chmod 777 ~/artifactory/var。生產(chǎn)環(huán)境應(yīng)配置正確的用戶和組映射使用-u參數(shù)。資源限制在docker run命令中可以考慮使用-m和--cpus參數(shù)為容器分配內(nèi)存和CPU限制防止容器占用過多宿主機(jī)資源。使用Docker Compose對(duì)于更復(fù)雜的配置如需要綁定其他端口、設(shè)置環(huán)境變量等推薦使用docker-compose.yml文件來管理這樣配置更清晰、可重復(fù)。3.3 方式三使用ZIP/TAR歸檔安裝最靈活適用于所有系統(tǒng)這種方式給你最大的控制權(quán)適合需要深度定制安裝路徑或運(yùn)行在非標(biāo)準(zhǔn)環(huán)境的場(chǎng)景。步驟1下載并解壓# 下載ZIP包以Linux 64位為例 wget https://releases.jfrog.io/artifactory/artifactory-pro/org/artifactory/pro/jfrog-artifactory-pro/[最新版本]/jfrog-artifactory-pro-[最新版本]-linux.tar.gz # 創(chuàng)建安裝目錄并解壓 sudo mkdir -p /opt/jfrog sudo tar -xzvf jfrog-artifactory-pro-*.tar.gz -C /opt/jfrog --strip-components1解壓后/opt/jfrog目錄下就是Artifactory的全部文件。步驟2配置環(huán)境變量編輯用戶配置文件如~/.bashrc或/etc/profile添加JFrog主目錄路徑。echo export JFROG_HOME/opt/jfrog ~/.bashrc source ~/.bashrc步驟3啟動(dòng)與停止進(jìn)入安裝目錄的app/bin子目錄執(zhí)行啟動(dòng)腳本。cd $JFROG_HOME/artifactory/app/bin # 啟動(dòng) ./artifactoryctl start # 停止 ./artifactoryctl stop # 查看狀態(tài) ./artifactoryctl status注意事項(xiàng)服務(wù)化管理這種方式不會(huì)自動(dòng)注冊(cè)為系統(tǒng)服務(wù)。你需要自己編寫systemd service文件或使用nohup等方式來管理進(jìn)程這對(duì)于生產(chǎn)環(huán)境是必須的。所有路徑可自定義你可以將解壓目錄放在任何位置只需正確設(shè)置JFROG_HOME環(huán)境變量即可。4. 安裝后初始配置與驗(yàn)證無論采用哪種方式安裝成功啟動(dòng)后都需要進(jìn)行一些初始配置才能正常使用。4.1 首次訪問與引導(dǎo)配置訪問Web界面打開瀏覽器輸入http://你的服務(wù)器IP地址:8081。你會(huì)看到Artifactory的歡迎頁面。設(shè)置管理員密碼第一次訪問會(huì)強(qiáng)制要求你為默認(rèn)的admin用戶設(shè)置一個(gè)新密碼。請(qǐng)務(wù)必設(shè)置一個(gè)強(qiáng)密碼并妥善保管。配置許可證僅限Pro/Enterprise版如果你是安裝的OSS版跳過此步。如果是試用或已有專業(yè)版在此處粘貼你的許可證密鑰。配置倉(cāng)庫(kù)代理系統(tǒng)會(huì)引導(dǎo)你配置一些遠(yuǎn)程倉(cāng)庫(kù)的代理如Maven Central, npm Registry等。你可以直接使用默認(rèn)的配置它會(huì)為你創(chuàng)建好這些遠(yuǎn)程倉(cāng)庫(kù)和對(duì)應(yīng)的虛擬倉(cāng)庫(kù)Virtual Repository后期可以隨時(shí)修改。4.2 關(guān)鍵后臺(tái)配置檢查完成前端引導(dǎo)后有幾個(gè)后臺(tái)配置點(diǎn)需要確認(rèn)它們關(guān)系到Artifactory的穩(wěn)定性和性能。檢查數(shù)據(jù)目錄與存儲(chǔ)配置 登錄后進(jìn)入Admin - Artifactory - Storage。這里顯示了當(dāng)前存儲(chǔ)摘要和默認(rèn)的文件存儲(chǔ)類型。對(duì)于單機(jī)測(cè)試默認(rèn)的filesystem類型使用本地磁盤即可。但你需要確認(rèn)Binary Store的路徑默認(rèn)在$JFROG_HOME/artifactory/var下所在磁盤空間充足。調(diào)整JVM堆內(nèi)存設(shè)置重要 Artifactory的性能非常依賴JVM堆內(nèi)存。默認(rèn)配置可能不適合你的機(jī)器。配置文件位于$JFROG_HOME/artifactory/var/etc/artifactory/artifactory.system.properties但更推薦通過Web界面修改。 進(jìn)入Admin - Artifactory - System YAML。在編輯器中找到或添加以下配置shared: extraJavaOpts: -Xms4g -Xmx4g -Xss256k -XX:UseG1GC-Xms4g -Xmx4g設(shè)置JVM堆內(nèi)存初始值和最大值為4GB。請(qǐng)根據(jù)你的機(jī)器總內(nèi)存來調(diào)整建議設(shè)置為機(jī)器總內(nèi)存的50%-70%但不要超過32GB超過后JVM性能提升有限且GC停頓會(huì)變長(zhǎng)。例如8GB內(nèi)存的機(jī)器可以設(shè)為-Xms4g -Xmx4g。-XX:UseG1GC使用G1垃圾收集器在大多數(shù)現(xiàn)代應(yīng)用下比舊的Parallel GC有更好的性能表現(xiàn)。 修改后保存并重啟Artifactory服務(wù)使配置生效。配置反向代理可選但推薦 你很可能不想讓用戶通過http://ip:8081這種形式訪問。通常我們會(huì)用Nginx或Apache作為反向代理綁定域名、配置SSL證書HTTPS。 一個(gè)簡(jiǎn)單的Nginx配置示例 (/etc/nginx/conf.d/artifactory.conf)server { listen 80; server_name artifactory.your-company.com; # 你的域名 return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name artifactory.your-company.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100M; # 允許上傳大文件如Docker鏡像 } }配置后重啟Nginx用戶就可以通過https://artifactory.your-company.com安全地訪問了。5. 基礎(chǔ)使用與核心概念速成安裝配置好后我們快速過一下最基本的使用方法幫你理解Artifactory的核心邏輯。5.1 倉(cāng)庫(kù)類型理解存儲(chǔ)的邏輯Artifactory里有幾種關(guān)鍵的倉(cāng)庫(kù)類型理解它們的關(guān)系至關(guān)重要本地倉(cāng)庫(kù)Local Repository真正在Artifactory服務(wù)器硬盤上存儲(chǔ)制品的倉(cāng)庫(kù)。你上傳的私有包、從遠(yuǎn)程倉(cāng)庫(kù)緩存下來的包都存在這里。遠(yuǎn)程倉(cāng)庫(kù)Remote Repository這其實(shí)是一個(gè)“代理配置”。它指向一個(gè)外部的公共倉(cāng)庫(kù)比如Maven Central (https://repo.maven.apache.org/maven2)。當(dāng)Artifactory收到一個(gè)本地不存在的構(gòu)件請(qǐng)求時(shí)它會(huì)去這個(gè)遠(yuǎn)程地址拉取并緩存到對(duì)應(yīng)的本地倉(cāng)庫(kù)中。虛擬倉(cāng)庫(kù)Virtual Repository這是一個(gè)“聚合視圖”。它可以把多個(gè)本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)通過它們的本地緩存聚合起來對(duì)外提供一個(gè)統(tǒng)一的訪問地址??蛻舳巳鏜aven、npm只需要配置這個(gè)虛擬倉(cāng)庫(kù)的地址即可。一個(gè)典型的工作流你的Maven項(xiàng)目配置了虛擬倉(cāng)庫(kù)A的地址。當(dāng)需要依賴com.google.guava:guava:31.1-jre時(shí)請(qǐng)求發(fā)到虛擬倉(cāng)庫(kù)A。A發(fā)現(xiàn)這個(gè)包在它聚合的某個(gè)本地倉(cāng)庫(kù)B里就直接返回。如果沒有它會(huì)去本地倉(cāng)庫(kù)B對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)C指向Maven Central去下載緩存到B再返回給你。下次請(qǐng)求時(shí)就直接從本地緩存B讀取速度飛快。5.2 第一個(gè)實(shí)操通過Maven上傳和下載構(gòu)件讓我們用一個(gè)最簡(jiǎn)單的Java庫(kù)項(xiàng)目來體驗(yàn)Artifactory的完整流程。步驟1在Artifactory中創(chuàng)建本地倉(cāng)庫(kù)登錄Admin界面進(jìn)入Repositories - Local。點(diǎn)擊Add Repository 選擇Maven。填寫Repository Key例如my-maven-local。其他設(shè)置可以先保持默認(rèn)點(diǎn)擊“Save Finish”。步驟2配置Maven的settings.xml在你的Maven配置文件通常是~/.m2/settings.xml中添加服務(wù)器認(rèn)證和鏡像配置。settings servers server idmy-artifactory/id !-- 這個(gè)id需要和mirror及distributionManagement中的id對(duì)應(yīng) -- usernameadmin/username password你的admin密碼/password /server /servers mirrors mirror idmy-artifactory/id nameMy Artifactory Mirror/name urlhttp://你的服務(wù)器IP:8081/artifactory/my-maven-virtual//url !-- 指向虛擬倉(cāng)庫(kù) -- mirrorOf*/mirrorOf !-- 匹配所有倉(cāng)庫(kù)所有請(qǐng)求都走Artifactory -- /mirror /mirrors /settings注意這里url指向的是一個(gè)虛擬倉(cāng)庫(kù)。你需要先在Artifactory中創(chuàng)建一個(gè)Maven虛擬倉(cāng)庫(kù)例如my-maven-virtual并將my-maven-local和remote-repos比如內(nèi)置的jcenter-cache聚合進(jìn)去。步驟3在項(xiàng)目中配置上傳發(fā)布在項(xiàng)目的pom.xml中添加distributionManagement節(jié)點(diǎn)指定構(gòu)件上傳到哪里。project ... distributionManagement repository idmy-artifactory/id nameMy Releases Repository/name urlhttp://你的服務(wù)器IP:8081/artifactory/my-maven-local/url !-- 直接指向本地倉(cāng)庫(kù) -- /repository snapshotRepository idmy-artifactory/id nameMy Snapshots Repository/name urlhttp://你的服務(wù)器IP:8081/artifactory/my-maven-local/url /snapshotRepository /distributionManagement /project步驟4執(zhí)行構(gòu)建與部署在項(xiàng)目根目錄下執(zhí)行# 清理、編譯、打包、上傳到Artifactory mvn clean deploy如果一切順利Maven會(huì)將生成的Jar包及其pom文件上傳到Artifactory的my-maven-local倉(cāng)庫(kù)中。你可以在Artifactory的Web界面中瀏覽這個(gè)倉(cāng)庫(kù)看到你上傳的構(gòu)件。步驟5在另一個(gè)項(xiàng)目中引用在另一個(gè)項(xiàng)目的pom.xml中像引用普通依賴一樣添加你剛剛上傳的庫(kù)的坐標(biāo)groupId, artifactId, version。由于Maven配置了鏡像它會(huì)自動(dòng)從你的Artifactory虛擬倉(cāng)庫(kù)中下載這個(gè)依賴。6. 常見問題排查與維護(hù)技巧即使按照步驟操作也難免會(huì)遇到問題。這里記錄了一些我親自踩過的坑和解決方案。6.1 安裝啟動(dòng)類問題問題1服務(wù)啟動(dòng)失敗日志顯示“Permission denied”現(xiàn)象使用systemctl啟動(dòng)artifactory服務(wù)失敗查看日志/var/opt/jfrog/artifactory/logs/artifactory.log發(fā)現(xiàn)大量權(quán)限錯(cuò)誤。原因最常見的原因是數(shù)據(jù)目錄/var/opt/jfrog/artifactory或其子目錄的屬主/權(quán)限不對(duì)。RPM安裝默認(rèn)會(huì)用jfrog用戶運(yùn)行服務(wù)。解決# 遞歸地將數(shù)據(jù)目錄的所有權(quán)改為jfrog用戶和組 sudo chown -R jfrog:jfrog /var/opt/jfrog/artifactory # 重啟服務(wù) sudo systemctl restart artifactory問題2Docker容器啟動(dòng)后無法訪問8081端口現(xiàn)象docker ps顯示容器正在運(yùn)行但curl localhost:8081無響應(yīng)。原因端口映射錯(cuò)誤或沖突。宿主機(jī)8081端口可能已被占用。容器內(nèi)Artifactory啟動(dòng)較慢需要等待幾十秒。防火墻或安全組未開放8081端口。解決# 檢查端口占用 sudo netstat -tlnp | grep 8081 # 如果被占用修改docker run的-p參數(shù)例如 -p 8085:8081 # 查看容器日志等待啟動(dòng)完成 docker logs -f artifactory # 檢查防火墻 sudo firewall-cmd --list-ports問題3Web界面訪問緩慢或經(jīng)常超時(shí)現(xiàn)象頁面加載慢上傳下載大文件容易失敗。原因JVM堆內(nèi)存不足這是首要懷疑對(duì)象。內(nèi)存不足導(dǎo)致頻繁Full GC整個(gè)應(yīng)用都會(huì)卡頓。數(shù)據(jù)庫(kù)Derby/H2瓶頸OSS版默認(rèn)使用嵌入式Derby數(shù)據(jù)庫(kù)在數(shù)據(jù)量較大或并發(fā)高時(shí)性能很差。磁盤IO瓶頸存儲(chǔ)目錄在機(jī)械硬盤上或者云磁盤性能耗盡。解決按照4.2節(jié)的方法增加-Xmx參數(shù)例如從2g增加到4g或8g然后重啟。對(duì)于生產(chǎn)環(huán)境強(qiáng)烈建議將OSS版升級(jí)為專業(yè)版并使用外部PostgreSQL或MySQL數(shù)據(jù)庫(kù)。這是提升Artifactory性能和穩(wěn)定性的最關(guān)鍵一步。將數(shù)據(jù)目錄遷移到SSD磁盤。使用iostat命令監(jiān)控磁盤使用率。6.2 配置與使用類問題問題4Maven構(gòu)建時(shí)提示“401 Unauthorized”現(xiàn)象執(zhí)行mvn deploy時(shí)失敗提示認(rèn)證失敗。原因Maven的settings.xml中配置的username和password與Artifactory中的用戶不匹配或者該用戶沒有目標(biāo)倉(cāng)庫(kù)的“Deploy/Cache”權(quán)限。解決登錄Artifactory Web界面確認(rèn)你使用的用戶如admin密碼是否正確。進(jìn)入Admin - Security - Permissions查看該用戶或所屬用戶組對(duì)目標(biāo)倉(cāng)庫(kù)如my-maven-local的權(quán)限。至少需要“Read”和“Deploy/Cache”權(quán)限。在Maven命令行嘗試使用-U參數(shù)強(qiáng)制更新快照有時(shí)本地緩存的舊令牌會(huì)導(dǎo)致問題。問題5Docker客戶端無法推送鏡像到Artifactory現(xiàn)象docker push artifactory.your-company.com/my-image:tag失敗提示“no basic auth credentials”。原因Docker客戶端沒有登錄到你的Artifactory Docker倉(cāng)庫(kù)。解決# 首先登錄。Artifactory的Docker倉(cāng)庫(kù)地址就是你的虛擬倉(cāng)庫(kù)地址。 docker login artifactory.your-company.com # 輸入你的Artifactory用戶名和密碼 # 然后重新打標(biāo)簽并推送 docker tag my-image:tag artifactory.your-company.com/my-image:tag docker push artifactory.your-company.com/my-image:tag更深層原因Artifactory的Docker倉(cāng)庫(kù)支持“Repository Path”和“Subdomain”兩種訪問模式。默認(rèn)可能是Repository Path模式http://artifactory-server/artifactory/api/docker/repo-key。你需要根據(jù)Web界面中Docker倉(cāng)庫(kù)的說明來配置客戶端的insecure-registries或域名解析。6.3 維護(hù)與優(yōu)化建議定期備份備份不僅僅是$JFROG_HOME/artifactory/var下的數(shù)據(jù)文件。系統(tǒng)配置、元數(shù)據(jù)數(shù)據(jù)庫(kù)對(duì)于專業(yè)版是外部數(shù)據(jù)庫(kù)同樣重要。Artifactory提供了原生的備份API和插件可以設(shè)置定時(shí)任務(wù)進(jìn)行全量/增量備份到遠(yuǎn)程存儲(chǔ)。監(jiān)控與日志關(guān)注artifactory.log和request.log??梢耘渲萌罩揪酆瞎ぞ呷鏓LK棧進(jìn)行集中管理。監(jiān)控關(guān)鍵指標(biāo)存儲(chǔ)空間使用率、JVM堆內(nèi)存使用率、GC時(shí)間、API響應(yīng)時(shí)間。清理過期數(shù)據(jù)Artifactory不會(huì)自動(dòng)刪除舊的快照SNAPSHOT版本或釋放被覆蓋構(gòu)件的空間。需要定期使用“清理未使用的緩存”功能或設(shè)置“存儲(chǔ)配額”和“保留策略”來自動(dòng)清理。升級(jí)策略在升級(jí)前務(wù)必閱讀官方升級(jí)指南并完整備份。測(cè)試環(huán)境的升級(jí)演練是必須的。通常的升級(jí)路徑是備份 - 停止服務(wù) - 升級(jí)安裝包/鏡像 - 啟動(dòng)服務(wù) - 運(yùn)行升級(jí)腳本如果需要- 驗(yàn)證。