Nexus Repository私服数据恢复

Z先森 2021-07-20 PM 556℃ 1条

今天java开发反应jenkins打包有问题,看日志发现maven库有问题,手动访问发现nexus服务挂掉了,结果找了半天服务器没找到,最后翻VCSA上面的任务记录,好家伙,整个虚拟机都被人误删了。下面记录一下应用层面的恢复历程。

新安装nexus

这里为了快速恢复业务,用的是docker

mkdir /app/maven && chown -R 200 /app/maven
docker run -tid -p 8081:8081 --name nexus -v /app/maven:/nexus-data --restart=always  docker.io/sonatype/nexus3

这样业务就起来了,直接访问http://ip:8081 ,确认没问题

恢复仓库

由于整个虚拟机都全部被物理删除了,时间紧迫就没找方法恢复了,理论上是可以还原回来的。这里找到了开发手上的本地maven环境,上面基本有所有用过的私库的包,理论上手动一个个传上去就完事,但是我们的包有好几百个,手动传不现实,网上找资料找到了一个python脚本(脚本来源),可以自动把包一个个传到新的库里面,脚本如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from xml.etree.ElementTree import parse
import os,re

# 要进行处理的目录
rootdir = './.m2'
# 仓库的URL,要指向hosted类型的库
repository = 'http://192.168.1.2:8081/repository/maven-releases/'
# ~/.m2/settings.xml文件中server标识的名字
servertag = 'releases'

# 正则准备匹配的文件名
pomprog = re.compile('.*.pom$')
jarprog = re.compile('.*.jar$')

# pom文件解析以及发布,参数1为pom文件,参数2为jar文件
def mvnupload(pomfile,jarfile):
    groupId = ''
    artifactId = ''
    version = ''
    u = open(pomfile)
    doc = parse(u)

    root = doc.getroot()
    # 解析XML中出现的关键值并暂存。
    for child in root:
        if child.tag == '{http://maven.apache.org/POM/4.0.0}groupId':
            groupId = child.text
        if child.tag == '{http://maven.apache.org/POM/4.0.0}artifactId':
            artifactId = child.text
        if child.tag == '{http://maven.apache.org/POM/4.0.0}version':
            version = child.text
    if groupId != '' and artifactId != '' and version != '':
        # 拼接出上传命令
        cmd = 'mvn deploy:deploy-file -DgroupId='+groupId+' -DartifactId='+artifactId+' -Dversion='+version+' -DgeneratePom=false -Dpackaging=jar -DrepositoryId='+servertag+' -Durl='+repository+' -DpomFile='+pomfile+' -Dfile='+jarfile
        print cmd
        # 执行命令
        os.system(cmd)

# 遍历目录方法,参数为根目录
def traversal(dir):
    pomfile = ''
    jarfile = ''
    flagE = True
    for list in os.listdir(dir):
        path = os.path.join(dir,list)
        if os.path.isfile(path):
            # 当发现pom或jar文件时先进行暂存
            if not pomprog.match(path) is None:
                pomfile = path
            if not jarprog.match(path) is None:
                jarfile = path
            # 当找全两个文件时,进行解析操作
            if pomfile != '' and jarfile != '' and flagE:
                mvnupload( pomfile, jarfile)
                flagE = False
        if os.path.isdir(path):
            traversal(path)

traversal(rootdir)

改改配置,跑脚本就好了,跑完发现大多数的包都回来了,如果觉得不稳妥,给每个开发都跑一下,基本就恢复得差不多了。

标签: none

如无特殊说明,本博所有文章均为博主原创。

评论啦~



唉呀 ~ 仅有一条评论


  1. 柯衍
    柯衍

    滴滴滴~~~

    回复 2021-10-25 09:44