美文网首页
使用Java代码删除Nexus已上传的组件

使用Java代码删除Nexus已上传的组件

作者: neko_11 | 来源:发表于2021-07-06 16:06 被阅读0次

    背景

    Nexus是一个强大的Maven仓库管理器。项目迭代中,会产生很多版本的maven组件上传至Nexus私服。对于不需要的组件,需要删除。如果在页面上逐个删除对于组件众多、版本众多的项目来说无疑是灾难

    Nexus提供的API

    页面访问 {nexus_host}/service/rest/swagger.json ,可以看到Nexus提供的所有API

    image.png

    截图并不是所有的接口,可以自己访问接口查看返回的json

    image.png

    接口详情中包含接口的描述、参数、响应状态码等

    需要使用的接口

    根据我的需求,我需要使用两个接口,组件查询接口与组件删除接口,如下图所示:

    组件查询:


    image.png

    组件删除:


    image.png

    详细代码

    依赖

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.76</version>
            </dependency>
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
            </dependency>
    

    Entity

    public class Checksum {
    
        private String sha1;
        private String md5;
    
        public String getSha1() {
            return sha1;
        }
    
        public Checksum setSha1(String sha1) {
            this.sha1 = sha1;
            return this;
        }
    
        public String getMd5() {
            return md5;
        }
    
        public Checksum setMd5(String md5) {
            this.md5 = md5;
            return this;
        }
    }
    
    public class Asset {
    
        private String downloadUrl;
        private String path;
        private String id;
        private String repository;
        private String format;
        private Checksum checksum;
    
        public String getDownloadUrl() {
            return downloadUrl;
        }
    
        public Asset setDownloadUrl(String downloadUrl) {
            this.downloadUrl = downloadUrl;
            return this;
        }
    
        public String getPath() {
            return path;
        }
    
        public Asset setPath(String path) {
            this.path = path;
            return this;
        }
    
        public String getId() {
            return id;
        }
    
        public Asset setId(String id) {
            this.id = id;
            return this;
        }
    
        public String getRepository() {
            return repository;
        }
    
        public Asset setRepository(String repository) {
            this.repository = repository;
            return this;
        }
    
        public String getFormat() {
            return format;
        }
    
        public Asset setFormat(String format) {
            this.format = format;
            return this;
        }
    
        public Checksum getChecksum() {
            return checksum;
        }
    
        public Asset setChecksum(Checksum checksum) {
            this.checksum = checksum;
            return this;
        }
    }
    
    public class Module {
    
        private String id;
        private String repository;
        private String format;
        private String group;
        private String name;
        private String version;
    
        private List<Asset> assets;
    
        public String getId() {
            return id;
        }
    
        public Module setId(String id) {
            this.id = id;
            return this;
        }
    
        public String getRepository() {
            return repository;
        }
    
        public Module setRepository(String repository) {
            this.repository = repository;
            return this;
        }
    
        public String getFormat() {
            return format;
        }
    
        public Module setFormat(String format) {
            this.format = format;
            return this;
        }
    
        public String getGroup() {
            return group;
        }
    
        public Module setGroup(String group) {
            this.group = group;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public Module setName(String name) {
            this.name = name;
            return this;
        }
    
        public String getVersion() {
            return version;
        }
    
        public Module setVersion(String version) {
            this.version = version;
            return this;
        }
    
        public List<Asset> getAssets() {
            return assets;
        }
    
        public Module setAssets(List<Asset> assets) {
            this.assets = assets;
            return this;
        }
    }
    
    public class Service {
        
        private String groupId;
        private String artifactId;
    
        public String getGroupId() {
            return groupId;
        }
    
        public Service setGroupId(String groupId) {
            this.groupId = groupId;
            return this;
        }
    
        public String getArtifactId() {
            return artifactId;
        }
    
        public Service setArtifactId(String artifactId) {
            this.artifactId = artifactId;
            return this;
        }
    }
    

    主要代码

    public class Clean {
    
        private static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build();
        private static final Logger LOGGER = LoggerFactory.getLogger(Clean.class);
    
        private static final String NEXUS_HOST = "http://nexus.demo.com";
        // 账户需要有查询和删除权限
        private static final String NEXUS_USERNAME = "admin";
        private static final String NEXUS_PASSWORD = "admin";
        private static final String NEXUS_REPOSITORY = "demo-release";
    
        public static void main(String[] args) {
            // 需要删除的组件坐标信息
            List<Service> serviceList = new ArrayList<>();
            serviceList.add(new Service().setGroupId("org.demo").setArtifactId("demo-service"));
            // 需要删除的组件版本
            List<String> versionList = new ArrayList<>();
            versionList.add("0.1.0.RELEASE");
    
            for(Service service : serviceList) {
                List<Module> moduleList = new ArrayList<>();
                search(NEXUS_HOST, NEXUS_USERNAME, NEXUS_PASSWORD, NEXUS_REPOSITORY, service.getGroupId(), service.getArtifactId(), null, moduleList);
                for (Module module : moduleList) {
                    if (versionList.contains(module.getVersion())) {
                        // 版本匹配执行删除
                        delete(NEXUS_HOST, NEXUS_USERNAME, NEXUS_PASSWORD, module);
                    }
                }
            }
        }
    
        private static void search(String host, String username, String password, String repository, String groupId, String artifactId, String token, List<Module> list) {
            String url = String.format("%s/service/rest/v1/search?repository=%s&group=%s&name=%s", host, repository, groupId, artifactId);
            if (StringUtils.hasText(token)) {
                // 拼接上次查询返回的continuationToken,查询下一页
                url = url + "&continuationToken=" + token;
            }
            Request request = new Request.Builder()
                    .addHeader("Authorization", getToken(username, password))
                    .addHeader("Connection", "keep-alive")
                    .url(url)
                    .get()
                    .build();
            Call call = HTTP_CLIENT.newCall(request);
            try (Response response = call.execute()) {
                if (response.code() == 200 && response.body() != null) {
                    JSONObject jsonObject = JSONObject.parseObject(response.body().string());
                    List<Module> result = jsonObject.getObject("items", new TypeReference<List<Module>>() {
                    });
                    if (CollectionUtils.isEmpty(result)) {
                        return;
                    }
                    list.addAll(result);
                    String conToken = jsonObject.getString("continuationToken");
                    if (!StringUtils.hasText(conToken) || "null".equals(conToken)) {
                        return;
                    }
                    // 携带continuationToken递归查询下一页
                    search(host, username, password, repository, groupId, artifactId, conToken, list);
                } else {
                    LOGGER.error("组件搜索出错,http响应:{}", response.body());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void delete(String host, String username, String password, Module module) {
            LOGGER.info("执行删除: {}", module.getVersion());
            String url = String.format("%s/service/rest/v1/components/%s", host, module.getId());
            Request request = new Request.Builder()
                    .addHeader("Authorization", getToken(username, password))
                    .addHeader("Connection", "keep-alive")
                    .url(url)
                    .delete()
                    .build();
            Call call = HTTP_CLIENT.newCall(request);
            try (Response response = call.execute()) {
                if (response.code() == 204) {
                    LOGGER.info("删除成功!");
                } else {
                    LOGGER.error("删除失败! 状态码:{}", response.code());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static String getToken(String name, String password) {
            String authString = name + ":" + password;
            byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes(StandardCharsets.UTF_8));
            return "Basic " + new String(authEncBytes);
        }
    }
    

    参考

    Nexus官方文档

    相关文章

      网友评论

          本文标题:使用Java代码删除Nexus已上传的组件

          本文链接:https://www.haomeiwen.com/subject/kvygultx.html