Как можно автоматически загружать файлы codecommit на s3? - PullRequest
0 голосов
/ 31 мая 2018

Приведенный ниже код дает мне только байты, которые изменены, но не весь файл.Что касается части s3, то создается zip-файл, но его размер равен нулю, тогда как фактический размер будет около 70-80 байтов.Мне нужен метод, где все файлы в хранилище будут помещены в s3, когда происходит событие push.по крайней мере, скажите мне, как получить все файлы из хранилища, когда даже происходит push.

Заранее спасибо!

import boto3
import pathlib
import tarfile
import io
import sys
import os


codecommit = boto3.client("codecommit")

def get_differences(repository_name, branch="master"):
    response = codecommit.get_differences(
        repositoryName=repository_name,
        afterCommitSpecifier='master',
    )
    differences = []
    while "nextToken" in response:
        response = codecommit.get_differences(
            repositoryName=repository_name,
            afterCommitSpecifier='master',
            nextToken=response["nextToken"]
        )
        differences += response.get("differences", [])
    else:
        differences += response["differences"]
    return differences

def main(event,context):
    repository_name = event['Records'][0]['eventSourceARN'].split(':')[5]
    repository_path = pathlib.Path(repository_name)
    buf = io.BytesIO()
    with tarfile.open(None, "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
s3 = boto3.client('s3')
s3.filename = str(repository_name)
s3.bucket = 'csharp-codes-codecommit' 
response = s3.put_object(Bucket=s3.bucket,Key= '/tmp/'+str(repository_path))

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Пожалуйста, прочтите документацию для S3-клиента boto3 метод put_object () .

Вы не указали Body (поэтому ваш объект S3 будет создан с 0 байтами), и вынеправильно указали Key (ключ должен включать как путь, так и имя файла, а не только путь, который вы написали).

0 голосов
/ 01 июня 2018

Из вашего кода не похоже, что ваш s3.put_object() вызов присоединяет ваш tar-файл.

Другое решение - это бессерверные примеры для CodeCommit, расположенные здесь . последний будет создавать zip-архив после каждого нажатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...