如何使用Lambda将AWS CodeCommit推送到S3?

9

我偏爱Python,但Lambda支持的任何语言都可以。

我有Prod、Beta和Gamma分支以及对应的S3文件夹。我正在寻找一种方法,让Lambda响应CodeCommit触发器,并根据触发它的分支克隆存储库并将文件放置在适当的S3文件夹中。

  • S3://Example-Folder/Application/Prod
  • S3://Example-Folder/Application/Beta
  • S3://Example-Folder/Application/Gamma

我尝试使用GitPython,但它不起作用,因为Lambda AMI基础中没有安装Git,而GitPython依赖于它。

我还查看了Boto3文档,只有监护任务可用;它无法返回项目文件。

感谢您的帮助!

3个回答

6

latest版本的boto3 codecommit包含了get_differencesget_blob方法。 使用这两种方法可以获取一个codecommit存储库的所有内容(至少,如果您不关心保留.git历史记录)。

下面的脚本获取主分支的所有内容并将其添加到tar文件中。然后,您可以根据需要将其上传到s3。 您可以将其作为lambda函数运行,并在推送到codecommit时调用它。

此代码适用于当前的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

抱歉,get_differences 中的 afterCommitSpecifier='master' 应该替换为 afterCommitSpecifier=branch,对吗? - RomaValcer
我喜欢复制粘贴后一切都能正常工作的感觉。 - Nestor Colt

1
看起来LambCI正好符合您的需求。

enter image description here


1
很不幸,目前CodeCommit没有API可用于将存储库上传到S3存储桶。但是,如果您愿意尝试使用CodePipeline,您可以配置AWS CodePipeline以使用AWS CodeCommit存储库中的分支作为代码的源阶段。这样,在CodePipeline中选择跟踪分支进行更改时,该分支末端存储库的归档将传递到您的CodePipelie存储桶中。有关CodePipeline的更多信息,请参见以下链接:http://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接