Sha*_*awn 6 python amazon-s3 amazon-web-services aws-lambda aws-codecommit
Python是我的首选语言,但Lambda支持的任何语言都可以. - 所有AWS架构 -
我在S3中有Prod,Beta和Gamma分支以及相应的文件夹.我正在寻找一种方法让Lambda响应CodeCommit触发器并基于触发它的分支,克隆repo并将文件放在适当的S3文件夹中.
我试图利用GitPython,但它不起作用,因为Lambda没有在基础Lambda AMI上安装Git,而GitPython依赖它.
我还浏览了Boto3文档,只有监管任务可用; 它无法返回项目文件.
感谢您的帮助!
的最新版本boto3 codecommit包括方法get_differences和get_blob. 您可以使用这两种方法获取 codecommit 存储库的所有内容(至少,如果您对保留 .git 历史记录不感兴趣)。
下面的脚本获取 master 分支的所有内容并将其添加到 tar 文件中。之后,您可以随意将其上传到 s3。您可以将其作为 lambda 函数运行,该函数可以在您推送到代码提交时调用。
这适用于当前的lambda python 3.6 环境。
botocore==1.5.89
boto3==1.4.4
import boto3
import pathlib
import tarfile
import io
import sys
def get_differences(repository_name, branch="master"):
response = codecommit.get_differences(
repositoryName=repository_name,
afterCommitSpecifier=branch,
)
differences = []
while "nextToken" in response:
response = codecommit.get_differences(
repositoryName=repository_name,
afterCommitSpecifier=branch,
nextToken=response["nextToken"]
)
differences += response.get("differences", [])
else:
differences += response["differences"]
return differences
if __name__ == "__main__":
repository_name = sys.argv[1]
codecommit = boto3.client("codecommit")
repository_path = pathlib.Path(repository_name)
buf = io.BytesIO()
with tarfile.open(None, mode="w:gz", fileobj=buf) as tar:
for difference in get_differences(repository_name):
blobid = difference["afterBlob"]["blobId"]
path = difference["afterBlob"]["path"]
mode = difference["afterBlob"]["mode"] # noqa
blob = codecommit.get_blob(
repositoryName=repository_name, blobId=blobid)
tarinfo = tarfile.TarInfo(str(repository_path / path))
tarinfo.size = len(blob["content"])
tar.addfile(tarinfo, io.BytesIO(blob["content"]))
tarobject = buf.getvalue()
# save to s3
Run Code Online (Sandbox Code Playgroud)