资讯详情

资讯详情

本地库导入Nexus:Maven/npm/Docker镜像批量迁移实操指南

我最早接触Nexus是因为一个挺现实的问题某公司的项目代码评审完发现团队成员各自本地都攒了一堆依赖包和构建产物要么扔在磁盘某个角落吃灰要么散落在各人电脑里换台机器就得重新找。后来统一把本地库导入到Nexus才真正把这些“离线资产”盘活成团队共享的基础设施。如果你也在维护私有制品库或者正打算把本地Maven库、npm包、Docker镜像这类东西迁移到Nexus上这篇内容就是为你准备的。我会从方案选型、操作细节到坑点排查把整套流程拆开讲透。1. 内容整体设计与思路拆解1.1 先想清楚你的“本地库”到底指的是什么很多人一听“本地库导入到Nexus”第一反应就是“把文件夹复制过去”。但实际上“本地库”这个词在不同技术栈里完全是不同的东西导入方式也天差地别。我见过不少人在这一步走弯路就是因为没搞清楚自己手里的到底是个什么格式。如果你在Java生态里待过最常见的“本地库”就是Maven本地仓库通常是~/.m2/repository这个目录。这里面的包按groupId、artifactId、version三级目录组织每个构件下面会有jar、pom、sources.jar、javadoc.jar等文件同时附带有_remote.repositories、maven-metadata-*这类元数据文件。这个目录的本质是Maven下载缓存它既可以当作离线仓库来用也可以作为批量导入Nexus的原始素材。如果你在Node生态里本地库则表现为node_modules目录但它不适合直接导入Nexus。更合理的做法是把npm包本身打成本地tarball或者把项目打包成npm pack产物后上传到Nexus的npm代理仓库。再比如你维护的Docker镜像本地库可能表现为docker images列表里的镜像要导入Nexus需要重新打tag、push不能直接把镜像文件拷进去。还有一种情况你手头有一堆自研工具包、第三方离线安装包、驱动文件类型五花八门Nexus里对应的则是raw仓库。raw仓库不解析具体格式单纯存文件走HTTP上传就行。所以第一步不是急着写脚本而是先盘清楚自己的资产类型。我建议你用一个表格列清楚内容类型、数量、源头位置、目标仓库格式。这样后面选择导入方式时才有依据否则很可能出现“文件传上去了但Nexus识别不了POM依赖关系”的尴尬。1.2 导入方案选型curl、UI上传、还是API批量脚本明确了资产类型之后就要面对第二个问题用什么方式导入。Nexus官方提供了三种不同的路径各有各的适用场景。第一种是直接在Nexus Web界面里手工上传。打开仓库浏览页点击Upload按钮填完坐标信息、选择文件、提交。这个方式适合偶尔传一两个包或者临时应急验证。优点是直观、零脚本成本缺点是速度极慢而且每传一个包都要手动填写一堆元数据。你要是手里有几百个包手都会点断。第二种是用curl直接调用Nexus的REST API上传。这种方式本质上是把Web页面的上传动作做成HTTP请求灵活性比UI高很多可以写脚本循环。curl方式的好处是通用不管目标仓库是Maven、npm还是raw都能处理。但坏处是Nexus的REST API对不同类型的仓库支持的字段要求不一样比如Maven仓库需要group、artifact、version这些坐标参数npm仓库要处理package.json的内容你得先研究API文档。第三种是用Nexus自带的脚本化能力比如Groovy脚本配合REST API。这种方式适合那种布局复杂、逻辑嵌套的批量导入场景比如需要先解析POM、递归处理依赖或者需要按一定规则自动创建仓库、自动分组。它的门槛稍高但一次写好后可以反复执行后续增量导入也不用重新造轮子。从我的经验看场景不同、选型也不同。手里只传几个包直接UI一次性迁移几百上千个Maven构件用mvn deploy或者curl脚本要自动化常态化维护走Groovy脚本加API的组合方案。所谓“最优方案”其实是在你的维护成本和执行频率之间取一个平衡点。1.3 为什么大家都推荐先建raw仓库做中转有一个操作我特别建议执行就是先建一个raw仓库做中转区。无论你最终要导入的是Maven格式还是npm格式先在一个raw仓库里把原始文件管理起来都会让整个过程更可控。原因有几个。第一raw仓库不校验内容格式任何文件都能放进来最适合当“暂存区”。你可以先把所有待导入的本地包统一丢进去确认文件完整性再分门别类正式导入到对应格式的仓库。第二raw仓库可以很好地支持后续断点续传。万一批量导入中途失败你能清楚地知道哪些文件已经处理过哪些还在中转区没动。第三raw仓库按目录组织天然适合人工检查目录层级清晰命名一目了然比一锅烩在一堆二进制文件里强得多。当然中转区只是锦上添花不是必须的。如果你的包本来就在本地目录里组织得很规矩比如repository/com/example/xxx/1.0.0/*.jar那也可以省掉raw仓库直接用脚本从本地目录导入目标仓库。但我个人习惯是保留中转区因为一旦批量导入出问题排查成本会低很多。2. 核心细节解析与实操要点2.1 Maven本地仓库的导入关键在POM和坐标Maven仓库算是Nexus里最主流的仓库格式导入逻辑也最容易理解Nexus里一个Maven构件必须由groupId、artifactId、version三个坐标定位且仓库里的目录结构必须严格按照groupId路径/artifactId/version/来组织。本地~/.m2/repository里其实已经是这个结构所以理论上你只需要把对应文件传到Nexus仓库根目录的对应路径下即可。但这里有几个细节特别容易被忽视。第一_remote.repositories文件是Maven本地仓库的“来源标记”记录了这个构件是从哪个远程仓库下载的。它对于Nexus没有任何意义上传时一定要过滤掉否则Nexus会把它当作普通的仓库文件解析某些情况下会干扰元数据校验。过滤条件可以写死文件名也可以在脚本里对*_remote.repositories模式做排除。第二POM文件必须和JAR文件放在同一层目录且文件名要和坐标保持一致。比如com.example:demo:1.0.0对应com/example/demo/1.0.0/demo-1.0.0.pom。如果POM缺失Nexus虽然能存储构件但Maven消费者在解析依赖树时会失败尤其是遇到传递性依赖时上游引用的依赖完全没法拉取。第三不要漏掉sources和javadoc这类附件。很多人迁移时只传主JAR结果IDE里无法查看源码、无法跳转用户体验很受影响。如果有条件尽可能把-sources.jar、-javadoc.jar、-tests.jar一并传上去。实操上你可以直接在命令行用curl按目录递归上传。这里有一个小坑curl的上传URL路径里必须包含完整坐标路径而且Nexus要求maven-metadata.xml这类文件不能通过普通上传方式直接覆盖否则会导致元数据冲突。我后面的批量脚本会带你避开这个问题。2.2 npm包导入Nexus必须摸清package.json和tarball的关系如果你要在Nexus里维护npm仓库情况比Maven仓库复杂一些。Nexus的npm仓库本质上是一个符合npm registry协议的HTTP服务它要求包通过npm publish或者REST API上传且包内容必须是一个正规的npm tarball也就是npm pack打出来的.tgz文件。因此如果你本地的node_modules里有某个包想导入Nexus不能直接把整个目录搬上去。正确做法是找到这个包的原始发布包或者重新打包再上传。还有一个极易踩坑的地方包的package.json里的name和version必须和tarball内容一致。Nexus创建npm包记录时会解析tarball内部的package.json如果解析失败上传会被直接拒绝。从本地导入的场景看我推荐两条路。一条是如果你本地有.tgz包直接用curl以multipart方式上传到Nexus npm仓库的REST端点。另一条是如果只有node_modules里的目录那么先在本地npm pack成.tgz再走上传流程。还有一点npm仓库的批量导入往往还会涉及处理dist-tags和versions元数据。如果包的某个版本之前已经存在再上传同版本会报409 Conflict。所以批量导入前最好先拉取仓库已有版本列表对比一下哪些版本是缺失的、需要上传哪些已经存在、可以跳过。这一步对于重复迁移场景尤其重要。2.3 Docker镜像导入Nexustag和仓库地址才是重头戏Docker镜像导入Nexus和上面两种方式都不太一样。Nexus的Docker仓库是一个符合OCI Distribution Spec的registry消费者通过docker pull命令访问。导入镜像的核心操作就两步先把本地镜像打上Nexus仓库地址的tag然后执行docker push。很多人在这里第一次翻车原因是没搞清楚Nexus的Docker仓库分为三种proxy、hosted、group。你要导入的是自有镜像应当使用hosted类型仓库。而且hosted仓库的HTTP端口和HTTPS端口是独立配置的默认情况下生产环境建议走HTTPS因为Docker客户端对HTTP registry有一套严格的白名单限制如果你用的是HTTP端口必须在Docker daemon配置里显式加上insecure-registries才能push成功。镜像tag的定义也很讲究。假设你的Nexus地址是nexus.internal:8082仓库名是docker-hosted那么本地镜像myapp:1.0.0要打成的tag是nexus.internal:8082/myapp:1.0.0也就是说“仓库地址/镜像名:版本”三段式。如果镜像有多个tag比如latest和1.0.0每个tag都要单独打、单独push。批量导入Docker镜像时建议先导出镜像清单。可以用docker images --format把名称和tag拉到文本里然后逐行循环执行docker tag和docker push。脚本执行前留意一下网络带宽因为镜像一般体积较大批量push非常吃网络资源。2.4 raw仓库的通用导入姿势最后说raw。raw仓库是Nexus里最宽容的存在它不校验格式、不解析元数据只需要文件路径。你甚至可以把Nexus当成一个带权限控制的轻量文件服务器来用。对于混合类型、历史遗留、格式不统一的“本地库”raw仓库往往是最务实的归宿。导入raw仓库的姿势很简单用curl PUT把文件放到你想要的路径上。注意路径是否以/开头这是很多curl初学者困惑的地方。在Nexus的REST API里raw仓库的上传路径通常写作/repository/仓库名/文件路径要把repository这个前缀保留。文件路径里可以包含目录层级Nexus会根据路径自动创建目录结构。raw仓库的优势是灵活但也有劣势Nexus无法针对raw内容做依赖解析、版本解析也做不了构建工具的自动拉取。所以raw仓库适合归档不适合作为团队日常构建的主力仓库。如果要让项目引用raw里的文件通常只能通过HTTP URL直接访问没有办法像Maven那样享受坐标定位。3. 实操过程与核心环节实现3.1 实操前准备先盘点资产再设计仓库布局进入实际操作前我强烈建议你先完成资产盘点并用表格把信息记录下来。表格字段大致如下资产类型数量来源位置目标仓库类型目标仓库名备注Maven构件362/home/user/.m2/repositorymaven2 hostedmaven-releases含12个snapshot版本npm包48/opt/packages/npmnpm hostednpm-hosted部分包需本地packDocker镜像15docker imagesdocker hosteddocker-hosted无私有镜像离线安装包203/data/offline-binsraw hostedraw-assets需按类型分类这个阶段可以顺便确定仓库命名规范。我见过太多人直接把仓库名起成maven1、test之类的名字最后自己都分不清该往哪个仓库传。建议按“格式-用途”的规则命名比如maven-releases、maven-snapshots、npm-hosted、docker-staging。如果团队规模大还可以再加-dev、-prod后缀区分环境。仓库布局设计时还要考虑权限。Nexus的权限模型是“仓库角色”如果导入操作是管理员统一执行的那无所谓。但如果后续要让不同团队使用不同仓库就应该这时候把仓库规划好避免日后上线再重新迁移。3.2 从零搭建Nexus初始化仓库、创建用户角色Nexus的安装这里不展开默认你已经有一个可用的Nexus实例。但有几个初始化配置项值得提一下因为它们直接关系后续导入。首先是管理员密码。Nexus初次启动后管理员密码会存在admin.password文件里路径在sonatype-work/nexus3/下。成功登录后第一件事就是改密码别拖着。然后是仓库创建。你既可以通过Web界面点击Create Repository也可以通过API批量创建。我建议用API因为可以脚本化、可追踪。创建仓库时Maven仓库注意选择maven2格式、hosted类型并勾选“Version Policy”为Release还是Snapshot。Docker仓库需要额外指定HTTP/HTTPS端口这个端口要和Nexus对外暴露的端口一致否则客户端访问不到。用户和角色的创建也建议走API或脚本。你需要一个具备“nx-repository-admin--”权限的账号来执行导入但别直接用管理员账号避免误操作。创建一个专用运维账号授予指定仓库的“edit”、“read”、“browse”权限刚好够用就好。3.3 批量导入Maven构件三段式思路与脚本模板Maven批量导入是我认为最值得抄作业的部分。整体思路可以分成三步扫描本地仓库、过滤元数据文件、按坐标路径上传。脚本语言用Bash或者Python都可以。我个人偏好Python因为文件扫描和路径解析更灵活而且错误处理更可控。下面这个脚本可以直接修改使用假设你本地仓库在/home/user/.m2/repository目标仓库是maven-releasesNexus地址是nexus.internal:8081。import os import subprocess import sys NEXUS_URL http://nexus.internal:8081 REPO_NAME maven-releases LOCAL_REPO os.path.expanduser(~/.m2/repository) AUTH (deploy-user, deploy-password) EXCLUDE_FILES {_remote.repositories, *.lastUpdated, *.repositories} def should_exclude(name): for pattern in EXCLUDE_FILES: if pattern.startswith(*): if name.endswith(pattern[1:]): return True elif name pattern: return True return False def upload_file(file_path): rel_path os.path.relpath(file_path, LOCAL_REPO) url f{NEXUS_URL}/repository/{REPO_NAME}/{rel_path} result subprocess.run( [curl, -sS, -u, f{AUTH[0]}:{AUTH[1]}, --upload-file, file_path, url], capture_outputTrue, textTrue ) return result.returncode 0 def main(): uploaded 0 failed [] for root, dirs, files in os.walk(LOCAL_REPO): for file_name in files: if should_exclude(file_name): continue file_path os.path.join(root, file_name) if not upload_file(file_path): failed.append(file_path) else: uploaded 1 print(fUploaded: {uploaded}, failed: {len(failed)}) for f in failed: print(fFAILED: {f}) if __name__ __main__: main()这个脚本的逻辑很直白遍历本地仓库目录对每个文件直接PUT到Nexus对应路径。因为Nexus的Maven仓库支持按坐标路径存取所以rel_path就是URL路径的一部分。脚本执行时注意几点。第一务必先跑几个文件做验证确认URL拼接正确、POM文件能被Nexus正确解析。第二把失败列表输出到日志文件导入结束后统一排查。第三如果构件数量在几千以上建议加并发控制否则全部串行上传会非常慢。你可以在Python里用concurrent.futures.ThreadPoolExecutor控制10个并发上传速度提升会很明显。3.4 用curl完成npm与raw仓库的单包上传Maven构件之外npm和raw的导入也可以用脚本来做但步骤稍显不同。npm包上传推荐使用curl的-F方式把tarball以form表单字段传上去。命令像这样curl -sS \ -u deploy-user:deploy-password \ -F package./mypackage-1.0.0.tgz \ http://nexus.internal:8081/repository/npm-hosted/执行成功后Nexus会根据tarball里的package.json创建对应的包版本记录。如果你想调整包的dist-tag可以用npm CLI直接操作npm dist-tag add mypackage1.0.0 latest --registryhttp://nexus.internal:8081/repository/npm-hosted/注意npm仓库的认证方式是Bearer token不是基础认证。如果你的Nexus开启了认证直接用-u user:pass也许能过但更稳妥的方式是先用自己的账号在Nexus里生成一个npm Bearer Token再用Authorization: Bearer头上传。raw仓库的上传就简单多了curl命令直接把文件PUT到目标路径curl -sS \ -u deploy-user:deploy-password \ --upload-file ./localfile.bin \ http://nexus.internal:8081/repository/raw-assets/tools/localfile.binraw仓库的目录层级完全由你控制建议按“分类/子分类/文件名”的规则来。传完之后通过browse页面检查一下路径是否符合预期。3.5 Docker镜像批量推送tag、push、校验一条龙Docker镜像的批量推送流程我会先写一份镜像清单文件比如image-list.txt每一行是本地镜像名:tag。然后循环处理。#!/bin/bash NEXUS_HOSTnexus.internal:8082 DOCKER_REPOdocker-hosted AUTH_USERdeploy-user AUTH_PASSdeploy-password while read IMAGE; do if [ -z $IMAGE ]; then continue fi TARGET${NEXUS_HOST}/${DOCKER_REPO}/${IMAGE} echo Processing ${IMAGE} docker tag ${IMAGE} ${TARGET} echo ${AUTH_PASS} | docker login ${NEXUS_HOST} -u ${AUTH_USER} --password-stdin docker push ${TARGET} if [ $? -ne 0 ]; then echo Push failed for ${IMAGE} fi done image-list.txt这里有个容易出错的点如果本地镜像名本身已经带了仓库前缀比如myregistry.local/myapp:1.0.0那么打tag时要注意层级。你可以先docker images看清楚完整镜像名再决定TARGET长什么样。Docker push结束后一定要做一次校验。你可以用docker pull试试从Nexus拉取也可以直接curl访问Nexus的API接口查一下仓库里的镜像列表。有些Nexus版本在UI上能看到镜像的manifest摘要如果看不到很可能是push过程中manifest丢失。3.6 增量式导入与断点续传的脚本设计大批量导入有一个常见痛点网络波动、认证过期、磁盘异常跑到一半挂了。重跑一遍全量太浪费时间所以设计脚本时最好自带“跳过已存在”的逻辑。Maven仓库场景下判断一个构件是否已存在有个简单办法。因为Nexus的REST API提供了查询构件详情的接口你可以先GET一下目标URL的*.pom文件是否存在如果HTTP 200说明这个构件已经传过了跳过即可。CHECK_URLhttp://nexus.internal:8081/repository/${REPO_NAME}/com/example/demo/1.0.0/demo-1.0.0.pom if curl -sS -u ${USER}:${PASS} -I ${CHECK_URL} | grep -q 200 OK; then echo exists, skip else # upload the whole component fi在npm场景下判断是否已存在可以查询registry的metadata接口比如GET /repository/npm-hosted/mypackage看返回的versions里是否已经有对应版本。这种“先查再传”的模式比单纯无脑上传靠谱得多尤其适合增量场景。比如这次迁移一批过一阵子又发现几个漏掉的直接再跑一次脚本已经存在的会自动跳过不会重复浪费时间。4. 常见问题与排查技巧实录4.1 问题速查表现象可能原因处理方式curl上传Maven构件后Nexus列表里看不到路径不对或缺POM检查URL路径是否包含完整坐标补传POMnpm上传返回401认证方式不对改用Bearer Token不用基础认证docker push失败提示access denied镜像tag里仓库名不对确认tag包含Nexus地址和仓库名整体前缀Maven构建时无法解析传递性依赖父POM或依赖POM缺失批量校验POM文件完整性补传上传snapshot版本时经常覆盖旧版snapshot策略未配置在建仓时把snapshot版本策略设为“Allow redeploy”或单独建snapshot仓库curl上传大文件时中断网络不稳定增加--retry参数或者调用REST API的续传能力raw仓库上传后浏览器下载中文文件名乱码编码问题文件名尽量避免中文或上传前统一转义重复执行脚本导致版本冲突库里已有相同版本先做存在性检查版本已存在时跳过或改用新版本号4.2 curl上传Maven文件后404问题多半出在URL路径这个是我见过频率最高的报错。明明本地文件存在curl没报错但Nexus里刷新后什么也看不到。排查之后发现绝大多数情况是URL路径少了/repository/前缀或者坐标路径不完整。你上传一个demo-1.0.0.jarURL应该长这样http://nexus.internal:8081/repository/maven-releases/com/example/demo/1.0.0/demo-1.0.0.jar如果写成了http://nexus.internal:8081/repository/com/example/demo/1.0.0/demo-1.0.0.jar就会404。少了仓库名这一层Nexus会认为你请求的路径本身就不存在。另外还要注意上传Maven插件相关的构件时路径里可能还有maven-plugin之类的目录层级一定要以本地仓库的实际目录为准不要自己臆想路径。我把这个规则总结成一条经验本地路径就是URL路径你本地的相对路径长什么样传到Nexus上就是什么样。4.3 docker push提示insecure registry现实中怎么处理本地Docker仓库走HTTP时几乎100%会遇到这个提示。Docker客户端默认拒绝非HTTPS的registry除非显式声明insecure-registries。有两条路可以走。一条是修改Docker daemon配置文件在/etc/docker/daemon.json里增加{ insecure-registries: [nexus.internal:8082] }然后重启Docker服务。注意这个配置对所有镜像仓库都生效如果你同时使用多个HTTP仓库要都列进去。另一条是给Nexus配置HTTPS证书。如果你有内部CA签发的证书把它配置到Nexus的jetty或反向代理层Docker客户端就能正常走HTTPS。生产环境我更推荐这条路毕竟HTTP传输镜像内容等于明文镜像层数据的安全性没有保障。4.4 “传上去的包消费方却下载不下来”的排查思路包上传成功但在项目里引用时下载不下来这是另一个高频问题。第一步先在浏览器或curl里直接访问目标构件的URL确认文件确实存在。如果存在问题基本不在仓库本身而在消费者一侧。第二步检查消费者的仓库配置。比如Maven项目里settings.xml中的mirror是否指向Nexus地址repository的URL是否写错了仓库名认证信息是否齐全。npm项目则要确认.npmrc的registry地址和token是否配置正确。第三步如果是Nexus group仓库作为统一入口那么还要检查group仓库里是否包含了目标hosted仓库。很多人建了group仓库但忘了把真正的hosted仓库加进去结果请求打到group上自然404。image.png4.5 批量导入速率太低如何安全提速批量导入大量小文件时串行上传的效率确实难以接受。我在一次迁移里用单线程上传800多个Maven构件花了将近20分钟后来改成10个并发线程时间一下子缩到4分钟。提速工具主要有两个方向一个是用Python的ThreadPoolExecutor控制并发数另一个是用xargs -P配合curl实现并行。下面是一个简单的xargs版本find /home/user/.m2/repository -type f \ ! -name _remote.repositories \ ! -name *.lastUpdated \ | xargs -P 10 -I {} curl -sS -u user:pass \ --upload-file {} \ http://nexus.internal:8081/repository/maven-releases/$(basename {})注意这里我用basename会丢失目录层级实际使用时建议替换成相对路径。正确做法是把文件列表先存成文本然后循环里用sed或awk生成相对路径。提速也要克制并发数不要开太高。Nexus底层依赖数据库和文件系统过高的并发会导致数据库连接池被打满甚至出现延迟和超时。我测试下来10到20个并发是比较稳定的区间再高容易出幺蛾子。4.6 我踩过的一个隐蔽坑POM里的parent依赖没一起传有一回导入完一批构件某项目的构建在本地Maven仓库里正常切换到Nexus后就一直报“找不到parent POM”。排查了半天发现原因是那批构件里有相当一部分是子模块它们的POM里声明了parent指向另一个构件但parent构件不在导入清单里。本地仓库因为有历史缓存所有依赖都在切换源以后缺失的parent就立刻暴露了。这种问题在批量导入时非常隐蔽因为上传时你只看得到单个文件POM内部的依赖关系是隐性的。要解决它最好在导入前做一个本地依赖图分析用Maven的dependency:tree或者脚本解析所有POM把parent和dependency列表提取出来再做一次差量补齐。或者简单粗暴一点既然本地~/.m2/repository里什么都有那就干脆全量导入不要做任何筛选。全量导入虽然耗时但至少不会出现依赖缺漏。5. 一些常规操作里没有写的实用经验导入这件事做到最后拼的往往不是技术而是流程和习惯。我执行过几次本地库导入Nexus之后有几个固定的习惯想分享给你。第一个习惯是执行前先做一次全量清单快照。不管是用脚本扫描目录还是手工列数据先把所有待导入文件的路径、大小、数量记录下来。这个快照既可以用作执行后的比对也能在导入失败时帮你快速定位哪些文件还没处理。我一般会把结果存成一个CSV传完一批就对比标记一批。第二个习惯是导入日志一定要留。Nexus操作虽然不复杂但一旦出错日志就是第一手排查依据。写脚本时给自己留好日志接口每成功一个文件就追加一行记录失败的文件记录完整错误信息。不要图省事只在屏幕打印因为终端滚动几千行之后前面发生了什么你根本看不回来。第三个习惯是先做小批量的“试运行”。比如先挑10个不同格式、不同目录的构件跑一遍流程确认Nexus解析正常、消费者拉取正常再正式全量跑。这个步骤看起来拖时间但相比全量导入后发现问题、再回滚重来性价比高太多。还有一个容易被忽视的点Nexus仓库的存储路径默认在sonatype-work/nexus3/blobs下如果一次性导入的数据量特别大要注意磁盘空间。我见过磁盘写满导致Nexus服务直接挂掉的案例而且挂了之后数据库损坏的恢复成本相当高。所以导入前查一下磁盘余量别只顾着跑脚本。最后再分享一个小技巧。如果你们团队日后会频繁导入新包可以把常用的导入脚本集中放到一个目录并且用参数化配置处理仓库名、用户名、路径这些变量。这样新成员接手时不用重新研究API照着脚本改两个参数就能跑。我自己的脚本目录里就常备着maven_import.py、npm_import.sh、docker_push.sh每个脚本都有标准的参数说明和日志路径。后续维护Nexus的人一定会感谢你当时的这个决定。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →