import requests import requests_cache import sys from dataclasses import dataclass import pprint import os @dataclass class Artifact: downloadUrl: str contentType: str extension: str groupId: str artifactId: str version: str classifier: str def filter_artifacts(results) -> list[Artifact]: items: list[Artifact] = [] pp = pprint.PrettyPrinter(indent=4) for item in results: if 'maven2' in item and item['contentType'] in ['application/java-archive', 'application/xml']: download_url = item['downloadUrl'].strip() content_type = item['contentType'].strip() extension = item['maven2']['extension'].strip() group_id = item['maven2']['groupId'].strip() artifact_id = item['maven2']['artifactId'].strip() version = item['maven2']['version'].strip() classifier = item['maven2']['classifier'].strip() if 'classifier' in item['maven2'] else '' pp.pprint(f''' downloadUrl: {download_url} contentType: {content_type} extension: {extension} groupId: {group_id} artifactId: {artifact_id} version: {version} classifier: {classifier} ''') items.append( Artifact(downloadUrl=download_url, contentType=content_type, extension=extension, groupId=group_id, artifactId=artifact_id, version=version, classifier=classifier) ) return items def download_from_url(url: str) -> str: res = requests.get(url, stream=True) file_name = url.split("/")[-1] with open(file_name, 'wb') as f: for chunk in res.iter_content(chunk_size=1024): if chunk: f.write(chunk) return file_name def main(args): pp = pprint.PrettyPrinter(indent=4) green_nexus_url = 'https://artifacts.apollo.stream' blue_nexus_url = 'https://artifacts-new.apollo.stream' nexus_username = os.env.get('NEXUS_USERNAME') nexus_password = os.env.get('NEXUS_PASSWORD') pp.pprint('Init caching') requests_cache.install_cache(cache_name='nexus_cache', backend='sqlite', expire_after=86400) for repository in ['maven-releases']: pp.pprint(f'Getting assets from {repository} repository') green_url = f'{green_nexus_url}/service/rest/v1/assets?repository={repository}' res = requests.get(green_url).json() items: list[Artifact] = filter_artifacts(res['items']) while res['continuationToken']: res = requests.get(f'{green_url}&continuationToken={res["continuationToken"]}').json() items.extend(filter_artifacts(res['items'])) for artifact in items: pp.pprint(f'Downloading artifact from {artifact.downloadUrl}') file_name = download_from_url(artifact.downloadUrl) pp.pprint(f'{file_name} has been downloaded') blue_url = f'{blue_nexus_url}/service/rest/v1/components?repository={repository}' files = { 'maven2.groupId': (None, artifact.groupId), 'maven2.artifactId': (None, artifact.artifactId), 'maven2.version': (None, artifact.version), 'maven2.asset1': (file_name, open(file_name, 'rb'), artifact.contentType), 'maven2.asset1.extension': (None, artifact.extension), 'maven2.asset1.classifier': (None, artifact.classifier), 'maven2.generate-pom': (None, 'false') } pp.pprint(f'Uploading file "{file_name}"') pp.pprint(files) r = requests.post(blue_url, files=files, auth=(nexus_username, nexus_password)) pp.pprint(f'"{file_name}" - status code: {r.status_code}') pp.pprint(r.text) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))