包签名¶
警告
包签名插件处于 预览 状态。 有关更多信息,请参见 Conan 稳定性 部分。
此插件必须位于缓存 extensions/plugins/sign/sign.py
文件中,包含 2 个方法。
sign(ref, artifacts_folder, signature_folder, **kwargs)
会为每个要上传到服务器的 recipe 和包执行。ref
是对工件的完整引用,它可以是 recipe 引用或包引用。artifacts_folder
是包含要上传的文件的文件夹,通常是conanfile.py
、conan_package.tgz
、conanmanifest.txt
等。signature_folder
包含应该写入生成文件的文件夹。verify(ref, artifacts_folder, signature_folder, files, **kwargs)
在从服务器安装包时执行,接收与上面相同的参数,应该用于验证签名的完整性或正确性。files
是下载文件的可迭代对象,因为当安装包时,此函数可能会被调用两次:首先,安装 recipe,并且verify()
将使用 recipe 文件调用,即conanfile.py
、conandata.yml
等。此外,当从源码构建包时,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
参数很重要,以避免将来添加新参数而破坏插件,请确保将其添加到你的方法中。