8

Python 是我的首选语言,但 Lambda 支持的任何语言都可以。-- 所有 AWS 架构 --

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

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

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

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

感谢您的帮助!

4

3 回答 3

5

最新版本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
于 2017-09-19T09:55:47.957 回答
1

看起来LambCI完全符合您的要求。

在此处输入图像描述

于 2017-04-16T05:54:28.323 回答
1

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

于 2017-04-17T15:35:57.793 回答