通过 python api 或 REST 调用访问 Jenkins S3Publisher 工件?

Access Jenkins S3Publisher artifacts via python api or REST call?

我们如何访问 S3Publisher artifacts via REST or python lib like jenkinsapi

我想,我可以做这样的事情,但我需要处理身份验证,而所有其他 jenkinsapi 调用已经包含身份验证。

from jenkinsapi.build import Build

def get_build_url(self, build: Build):
    """url for build page"""
    return build.get_result_url().split(str(build.get_number()))[0]

def get_s3_artifact(self, build: Build, artifact_name:str):
    url = "{}/s3/download/{}".format(self.get_build_url(build))
    wget.download(url)

我们可以使用标准流程通过 python 请求库下载文件,因为 jenkinsapi 使用请求。

假设 self._server 是 jenkinsapi.jenkins.Jenkins.Jenkins class 的实例。我们可以构建一个 url 来匹配我们期望通过 build/s3 下面的链接下载工件的内容。然后我们使用请求获取 url 内容并将其写入文件。

def get_s3_artifact(self, build: Build, artifact_name:str, output_dir: Path) -> Path:
    output_file = output_dir / artifact_name
    if output_file.exists():
        raise FileExistsError('[ERROR] {}:get_s3_artifact - cannot overwrite {}'.format(self.__class__,
                                                                                        output_file.absolute()))
    output_dir.mkdir(exist_ok=True, parents=True)

    url = "{}{}/s3/download/{}".format(self.get_build_url(build), str(build.get_number()), artifact_name)
    r = self._server.requester.get_url(url, stream=True)
    with output_file.open('wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

    return output_file