关于python:从nexus上查询api最新版本号的脚本

4次阅读

共计 3017 个字符,预计需要花费 8 分钟才能阅读完成。

代码上线前,往往要降级 api 的版本号。但每次都去 nexus 上手动查问最新的版本号,也是挺麻烦的。

仍然是为了更高效的摸鱼,写了一个 python 脚本,用于查问指定 api 的最大版本号。

# 引入第三方库 requests
import requests

import re
import math
import json


ARTIFACT_ID = 'one-api'
GROUP_ID = 'com.one'

NEXUS_URL = 'http://repo.one.com/service/extdirect'
NEXUS_COOKIE = 'onetwothree'


def main():
    # 从 nexus 获取指定我的项目的所有版本号
    version_list = __get_version_list(ARTIFACT_ID, GROUP_ID, NEXUS_URL, NEXUS_COOKIE)

    # 计算出最大的版本号
    max_version = __get_max_version(version_list)
    print('最新的版本号 >>>' + max_version)


# 从汇合中,查找出最大的版本号
def __get_max_version(version_list):
    # 初始值设为 0.0.0
    # 数据格式为 ('残缺的版本号',主版本号, 次版本号, 小版本号)
    max_version_tup = ('0.0.0', 0, 0, 0)

    for current_version in version_list:
        # 对于形如 1.1.0-SNAPSHOT 的版本号,转换成 1.1.0
        temp_version = re.sub('-.*', '', current_version)
        num_list = temp_version.split('.')
        current_version_tup = [current_version, int(num_list[0]), int(num_list[1]), int(num_list[2])]

        # 与上一次记录的最大版本号比拟,取二者最大值,作为最新的最大版本号
        max_version_tup = __get_max_version_tup(max_version_tup, current_version_tup)

    return max_version_tup[0]


# 比拟两个版本号,返回其中的最大者
def __get_max_version_tup(tup_a, tup_b):
    # 顺次比拟 3 个版本号
    if tup_a[1] > tup_b[1]:
        return tup_a
    if tup_a[1] < tup_b[1]:
        return tup_b

    if tup_a[2] > tup_b[2]:
        return tup_a
    if tup_a[2] < tup_b[2]:
        return tup_b

    if tup_a[3] > tup_b[3]:
        return tup_a
    if tup_a[3] < tup_b[3]:
        return tup_b

    return tup_a


# 查问指定我的项目的所有版本号
def __get_version_list(artifact_id, group_id, url, cookie):
    # 设置分页查问的参数
    page_index = 1
    page_size = 300
    request_dist = __build_request_dist(artifact_id, group_id, page_index, page_size)
    response = __post_json(request_dist, url, cookie)

    # 获取版本号的总数量、版本号列表
    total = __get_total(response)
    version_list = []
    # 从响应参数中,提取出所有版本号,并追加至数组
    __fill_version(version_list, response)

    # 计算残余的循环次数
    # 即,向上取整(总数 / 页大小)-1
    circulation_num = math.ceil(total / page_size) - 1

    while circulation_num > 0:
        # 循环分页查问版本号
        circulation_num -= 1
        page_index += 1
        request_dist = __build_request_dist(artifact_id, group_id, page_index, page_size)
        response = __post_json(request_dist, url, cookie)

        # 从响应参数中,提取出所有版本号,并追加至数组
        __fill_version(version_list, response)

    return version_list


# 获取版本号的总数量
def __get_total(response):
    response = json.loads(response)
    result = response["result"]
    total = result["total"]
    return total


# 从响应参数中,提取出所有版本号,并追加至数组
def __fill_version(version_list, response):
    response = json.loads(response)
    result = response["result"]
    data = result["data"]
    for i in data:
        version_list.append(i['version'])
    return version_list


# 构建申请参数
def __build_request_dist(artifact_id, group_id, page_index, page_size):
    # 设置起始值
    start = (page_index - 1) * page_size

    # 查问参数
    request_dist = {
        'action': 'coreui_Search',
        'method': 'read',
        'data': [
            {
                'page': page_index,
                'start': start,
                'limit': page_size,
                'filter': [
                    # 以 maven 的格局搜寻
                    {
                        'property': 'format',
                        'value': 'maven2'
                    },
                    {
                        'property': 'attributes.maven2.artifactId',
                        'value': artifact_id
                    },
                    {
                        'property': 'attributes.maven2.groupId',
                        'value': group_id
                    },
                    # 只查问 release 版本
                    {
                        'property': 'repository_name',
                        'value': 'maven-releases'
                    }
                ]
            }
        ],
        'type': 'rpc',
        'tid': 14
    }
    return request_dist


# json 格局的 post 申请
def __post_json(request_dist, url, cookie):
    # 将数据转为 JSON 格局
    data_json = json.dumps(request_dist)

    headers = {'Cookie': cookie, 'content-type': 'application/json', 'charset': 'utf-8'}
    response = requests.post(url, data=data_json.encode('utf-8'), headers=headers)
    return response.text


if __name__ == '__main__':
    main()
正文完
 0