包签名

警告

包签名插件目前处于预览阶段。更多信息请参阅 Conan 稳定性 部分。

此插件必须位于缓存的 extensions/plugins/sign/sign.py 文件中,包含 2 个方法:

  • sign(ref, artifacts_folder, signature_folder, **kwargs) 方法会在上传到服务器的每个 recipe 和 package 上执行。ref 是工件的完整引用,可以是 recipe 引用或 package 引用。artifacts_folder 是包含待上传文件的文件夹,通常是 conanfile.pyconan_package.tgzconanmanifest.txt 等。signature_folder 是生成文件应写入的文件夹。

  • verify(ref, artifacts_folder, signature_folder, files, **kwargs) 方法在从服务器安装 package 时执行,接收与上面相同的参数,并用于验证签名的完整性或正确性。files 是已下载文件的可迭代对象,因为在安装 package 时,此函数可能会被调用两次:首先,安装 recipe,然后调用 verify() 并传入 recipe 文件,即 conanfile.pyconandata.yml 等。此外,当从源代码构建 package 时,recipe 导出的 conan_sources.tgz 文件也可能被下载,此时 verify() 函数会再次被调用,这次 files 参数将只包含 conan_sources.tgz

例如,一个包签名器会在包上传时将工件文件名放入名为 signature.asc 的文件中,并在下载的 signature.asc 中断言下载的工件存在。

import os

def sign(ref, artifacts_folder, signature_folder, **kwargs):
    print("Signing ref: ", ref)
    print("Signing folder: ", artifacts_folder)
    files = []
    for f in sorted(os.listdir(artifacts_folder)):
        if os.path.isfile(os.path.join(artifacts_folder, f)):
            files.append(f)
    signature = os.path.join(signature_folder, "signature.asc")
    open(signature, "w").write("\n".join(files))

def verify(ref, artifacts_folder, signature_folder, files, **kwargs):
    print("Verifying ref: ", ref)
    print("Verifying folder: ", artifacts_folder)
    signature = os.path.join(signature_folder, "signature.asc")
    contents = open(signature).read()
    print("verifying contents", contents)
    for f in files:
        print("VERIFYING ", f)
        if os.path.isfile(os.path.join(artifacts_folder, f)):
            assert f in contents

请注意,**kwargs 参数很重要,可以避免未来添加新参数导致插件失效,请务必将其添加到您的方法中。