Python是我的首选语言,但Lambda支持的任何语言都可以。 - 所有AWS架构 -
我在S3中有Prod,Beta和Gamma分支以及相应的文件夹。我正在寻找一种方法让Lambda响应CodeCommit触发器并基于触发它的分支,克隆repo并将文件放在适当的S3文件夹中。
我试图利用GitPython,但它不起作用,因为Lambda没有在基础Lambda AMI上安装Git,而GitPython依赖它。
我还浏览了Boto3文档,只有监管任务可用;它无法返回项目文件。
感谢您的帮助!
latest版本的boto3 codecommit
包括get_differences
和get_blob
方法。您可以使用这两种方法获取codecommit存储库的所有内容(至少,如果您对保留.git历史记录不感兴趣)。
下面的脚本获取主分支的所有内容并将其添加到tar文件中。之后你可以把它上传到s3。您可以将其作为lambda函数运行,可以在推送到codecommit时调用它。
这适用于当前的lambda python 3.6 environment。 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
看起来像LambCI确实你想要的。
不幸的是,目前CodeCommit没有用于将存储库上传到S3存储桶的API。但是,如果您愿意尝试使用CodePipeline,则可以将AWS CodePipeline配置为使用AWS CodeCommit存储库中的分支作为代码的源阶段。这样,当您在CodePipeline中对所选跟踪分支进行更改时,该分支顶端的存储库存档将传递到您的CodePipelie存储桶。有关CodePipeline的更多信息,请参阅以下链接:http://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html