代码之家  ›  专栏  ›  技术社区  ›  Michael K.

Gitlab:如何使用带有S3的自动缩放运行程序处理大于5GB的缓存

  •  0
  • Michael K.  · 技术社区  · 6 年前

    我将yocto项目配置为使用自动缩放的gitlab运行程序在AWS上运行,现在我注意到随着项目的增长,缓存每次都无法上载。

    Uploading cache.zip to https://build-yocto.s3.amazonaws.com/project/default 
    WARNING: Retrying...                               
    Uploading cache.zip to https://build-yocto.s3.amazonaws.com/project/default 
    FATAL: Received: 400 Bad Request                   
    Failed to create cache
    

    高速缓存包含sstate高速缓存目录以加快重建速度,这在一开始很有吸引力,但现在失败了,因为(至少这是我的结论)sstate目录已增长到>10GB。

    我看到S3有多部分上传的选项,但是找不到gitlab runner的任何选项来启用它。

    这个问题有什么解决办法吗?比如预处理sstate缓存和上传多个缓存?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Michael K.    6 年前

    Gitlab目前不支持多部分上传到S3,因此它只能处理高达5GB的缓存。但是检查一下 this issue/feature proposal 在继续阅读之前先讨论这个话题!

    所以我给自己建了一个肮脏的解决方案但是 小心点!任何在该运行程序上运行构建的人都可以简单地将AWS AccessKey/SecretKey打印到构建日志中!

    基本上,我只是从S3复制了缓存的拉入和推送,并在构建作业之前和之后手动执行。

    在gitlab runner config.toml中,我在 [[runners]] 章节:

    environment = ["AWS_ACCESS_KEY_ID=<AccessKey>", "AWS_SECRET_ACCESS_KEY=<SecretKey>", "AWS_DEFAULT_REGION=<region>", "AWS_DEFAULT_OUTPUT=<json,text or table>"]
    

    在我的Dockerfile中,我需要添加这些包:

    # Install AWS CLI and tools
    RUN apt-get install -y awscli tar pigz
    

    下载脚本:

    #!/bin/bash
    mkdir <path to cache>
    aws s3 cp s3://<bucket name>/cache - | pigz -dc | tar -xf - -C <path to cache>
    

    上载脚本:

    #!/bin/bash
    tar cf - -C <path to cache> . | pigz | aws s3 cp - s3://<bucket name>/cache --expected-size 7516192768
    

    --expected-size 是缓存的近似大小。这是必需的 aws cp s3 需要选择缓存部分的大小,如果选择的大小对于上载来说太小,则将超过多部分上载部分的最大限制。我的示例使用7GB。

    我的 .gitlab-ci.yaml 现在看起来是这样的:

    build:
      script:
        - ./download_cache.sh
        - ./build.sh
        - ./upload_cache.sh