AWS CodeBuild bộ đệm cục bộ không thực sự bộ đệm?


12

Tôi đã cố gắng để bộ đệm cục bộ của AWS CodeBuild hoạt động và trong suốt cuộc đời tôi, tôi không thể có được bộ đệm cơ bản nhất để hoạt động. Mục tiêu cuối cùng của tôi là lưu trữ các tạo phẩm Gradle, như được thảo luận ở đây .

Nhưng vì tôi không thể làm việc đó, tôi đã thử một bài kiểm tra thậm chí đơn giản hơn, trong đó tôi cố gắng lưu trữ thư mục /root/foovới một tệp counter.txtmà tôi tăng mỗi bản dựng. Kỳ vọng của tôi là nếu tôi chạy các bản dựng tiếp theo trong vòng vài phút với nhau, tôi sẽ thấy "2", "3", v.v. trong nhật ký. Nhưng thực tế là mặc dù liên kết tượng trưng được thiết lập, bản dựng tiếp theo không bao giờ nhìn thấy counter.txttệp trước đó , điều này cho tôi thấy một cái gì đó rất bị hỏng.

Bất cứ ai cũng có thể xác nhận rằng bộ nhớ cache cục bộ của họ đang thực sự hoạt động trong CodeBuild? Tôi bắt đầu tự hỏi nếu tính năng này hiện đang bị hỏng! Hay tôi hoàn toàn hiểu sai những gì nó phải làm?

buildspec.yml:

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto8
  build:
    commands:
      - pwd
      - ls -l /root/
      - ls -l /root/foo/
      - ./cache-test.sh
      - ls -l /root/
      - ls -l /root/foo/

cache:
  paths:
    - '/root/foo/*'

cache-test.sh:

#!/bin/bash
if [ -d "/root/foo" ]; then
  C=$(cat /root/foo/count.txt)
  C=$((C + 1))
  echo "*********************************"
  echo "*********************************"
  echo "Incrementing counter to $C"
  echo $C > /root/foo/count.txt
  echo "*********************************"
  echo "*********************************"
else
  mkdir /root/foo
  echo "*********************************"
  echo "*********************************"
  echo "File not found, starting count at 1"
  echo "*********************************"
  echo "*********************************"
  echo 1 > /root/foo/count.txt
fi

Đầu ra CodeBuild : (cùng một đầu ra ngay cả khi được thực hiện liên tiếp nhanh)

[Container] 2019/11/10 22:35:08 Waiting for agent ping 
[Container] 2019/11/10 22:35:10 Waiting for DOWNLOAD_SOURCE 
[Container] 2019/11/10 22:35:10 Phase is DOWNLOAD_SOURCE 
[Container] 2019/11/10 22:35:10 CODEBUILD_SRC_DIR=/codebuild/output/src905503483/src 
[Container] 2019/11/10 22:35:10 YAML location is /codebuild/output/src905503483/src/buildspec.yml 
[Container] 2019/11/10 22:35:10 No commands found for phase name: INSTALL 
[Container] 2019/11/10 22:35:10 Processing environment variables 
[Container] 2019/11/10 22:35:10 Moving to directory /codebuild/output/src905503483/src 
[Container] 2019/11/10 22:35:10 MkdirAll: /codebuild/local-cache/custom/de68c9f22ae028d4e4dfb0d11bbb481053d28b1373db0d6a56ebee0416bf13b2/root/foo 
[Container] 2019/11/10 22:35:10 Symlinking: /root/foo => /codebuild/local-cache/custom/de68c9f22ae028d4e4dfb0d11bbb481053d28b1373db0d6a56ebee0416bf13b2/root/foo 
[Container] 2019/11/10 22:35:10 Registering with agent 
[Container] 2019/11/10 22:35:10 Phases found in YAML: 2 
[Container] 2019/11/10 22:35:10  BUILD: 6 commands 
[Container] 2019/11/10 22:35:10  INSTALL: 0 commands 
[Container] 2019/11/10 22:35:10 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED 
[Container] 2019/11/10 22:35:10 Phase context status code:  Message:  
[Container] 2019/11/10 22:35:11 Entering phase INSTALL 
[Container] 2019/11/10 22:35:11 Running command echo "Installing corretto(OpenJDK) version 8 ..." 
Installing corretto(OpenJDK) version 8 ... 

[Container] 2019/11/10 22:35:11 Running command export JAVA_HOME="$JAVA_8_HOME" 

[Container] 2019/11/10 22:35:11 Running command export JRE_HOME="$JRE_8_HOME" 

[Container] 2019/11/10 22:35:11 Running command export JDK_HOME="$JDK_8_HOME" 

[Container] 2019/11/10 22:35:11 Running command for tool_path in "$JAVA_8_HOME"/bin/* "$JRE_8_HOME"/bin/*; 
 do tool=`basename "$tool_path"`; 
  if [ $tool != 'java-rmi.cgi' ]; 
  then 
   rm -f /usr/bin/$tool /var/lib/alternatives/$tool \ 
    && update-alternatives --install /usr/bin/$tool $tool $tool_path 20000; 
  fi; 
done 

[Container] 2019/11/10 22:35:11 Phase complete: INSTALL State: SUCCEEDED 
[Container] 2019/11/10 22:35:11 Phase context status code:  Message:  
[Container] 2019/11/10 22:35:11 Entering phase PRE_BUILD 
[Container] 2019/11/10 22:35:11 Phase complete: PRE_BUILD State: SUCCEEDED 
[Container] 2019/11/10 22:35:11 Phase context status code:  Message:  
[Container] 2019/11/10 22:35:11 Entering phase BUILD 
[Container] 2019/11/10 22:35:11 Running command pwd 
/codebuild/output/src905503483/src 

[Container] 2019/11/10 22:35:11 Running command ls -l /root/ 
total 4 
lrwxrwxrwx 1 root root 103 Nov 10 22:35 foo -> /codebuild/local-cache/custom/de68c9f22ae028d4e4dfb0d11bbb481053d28b1373db0d6a56ebee0416bf13b2/root/foo 

[Container] 2019/11/10 22:35:11 Running command ls -l /root/foo/ 
total 0 

[Container] 2019/11/10 22:35:11 Running command ./cache-test.sh 
cat: /root/foo/count.txt: No such file or directory 
********************************* 
********************************* 
Incrementing counter to 1 
********************************* 
********************************* 

[Container] 2019/11/10 22:35:11 Running command ls -l /root/ 
total 4 
lrwxrwxrwx 1 root root 103 Nov 10 22:35 foo -> /codebuild/local-cache/custom/de68c9f22ae028d4e4dfb0d11bbb481053d28b1373db0d6a56ebee0416bf13b2/root/foo 

[Container] 2019/11/10 22:35:11 Running command ls -l /root/foo/ 
total 4 
-rw-r--r-- 1 root root 2 Nov 10 22:35 count.txt 

[Container] 2019/11/10 22:35:11 Phase complete: BUILD State: SUCCEEDED 
[Container] 2019/11/10 22:35:11 Phase context status code:  Message:  
[Container] 2019/11/10 22:35:11 Entering phase POST_BUILD 
[Container] 2019/11/10 22:35:11 Phase complete: POST_BUILD State: SUCCEEDED 
[Container] 2019/11/10 22:35:11 Phase context status code:  Message:  

Dự án CodeBuild JSON:

{
    "projects": [
        {
            "name": "test-project",
            "arn": "arn:aws:codebuild:us-east-2:xxx:project/xxx",
            "source": {
                "type": "CODEPIPELINE",
                "insecureSsl": false
            },
            "secondarySourceVersions": [],
            "artifacts": {
                "type": "CODEPIPELINE",
                "name": "test-project",
                "packaging": "NONE",
                "encryptionDisabled": false
            },
            "secondaryArtifacts": [],
            "cache": {
                "type": "LOCAL",
                "modes": [
                    "LOCAL_SOURCE_CACHE",
                    "LOCAL_CUSTOM_CACHE"
                ]
            },
            "environment": {
                "type": "LINUX_CONTAINER",
                "image": "aws/codebuild/amazonlinux2-x86_64-standard:1.0",
                "computeType": "BUILD_GENERAL1_SMALL",
                "environmentVariables": [],
                "privilegedMode": false,
                "imagePullCredentialsType": "CODEBUILD"
            },
            "serviceRole": "arn:aws:iam::xxx:role/service-role/xxx",
            "timeoutInMinutes": 60,
            "queuedTimeoutInMinutes": 480,
            "encryptionKey": "arn:aws:kms:us-east-2:xxx:alias/aws/s3",
            "tags": [],
            "created": 1573364156.631,
            "lastModified": 1573423155.674,
            "badge": {
                "badgeEnabled": false
            },
            "logsConfig": {
                "cloudWatchLogs": {
                    "status": "ENABLED",
                    "groupName": "xxx",
                    "streamName": "xxx"
                },
                "s3Logs": {
                    "status": "DISABLED",
                    "encryptionDisabled": false
                }
            }
        }
    ],
    "projectsNotFound": []
}

Nó xuất hiện Tôi không phải là người duy nhất: forum.aws.amazon.com/thread.jspa?threadID=312569&tstart=0
Patrick Lightbody

Câu trả lời:


7

Tài liệu không chính xác rõ ràng, nhưng AWS CodeBuild Bộ đệm cục bộ chỉ có thể lưu các thư mục bộ đệm (tại thời điểm viết). Điều này hơi khó hiểu vì đặc tả buildspec AWS CodeBuild cho phép đường dẫn là các tệp riêng lẻ hoặc ký tự đại diện , nhưng trong thực tế, việc chỉ định một tệp sẽ gây ra lỗi.

Unable to initialize cache download: only directories can be cached locally: ...

Trong ví dụ của bạn, bạn sử dụng chỉ định bộ đệm như

cache:
  paths:
    - '/root/foo/*'

Trong đó * sẽ đề cập đến tất cả các tệp và thư mục riêng lẻ trong foo nhưng chỉ các thư mục sẽ được lưu trữ.

Chỉ định toàn bộ thư mục sẽ hoạt động

cache:
  paths:
    - /root/foo/

10

Tôi đã cố gắng để làm cho bộ nhớ cache hoạt động với sự thành công hạn chế.

Không phải từ bất kỳ nguồn nào, nhưng đây là một số quan sát:

  • Bộ nhớ cache sẽ chỉ khả dụng nếu thời gian xây dựng quá 5 phút.

  • Bộ nhớ cache có thể được sử dụng nếu bản dựng mới được đặt thành công trên cùng một máy chủ bản dựng.

  • Bộ nhớ cache có thể được sử dụng nếu bản dựng mới đang được chạy trong vòng 5-15 phút của bản dựng cuối cùng. Bộ nhớ cache có thể có sẵn dựa trên thời gian xây dựng cuối cùng với tối đa 15 phút.

  • Mặc dù các bản dựng vượt quá 5 phút, bộ đệm có thể không phải lúc nào cũng hoạt động có thể do bản dựng được đặt trên máy chủ bản dựng khác nhau.

  • Ngoài ra, trong trường hợp bộ đệm tăng tốc bản dựng mới xuống dưới 5 phút, bản dựng đó sẽ không được lưu trong bộ nhớ cache dẫn đến việc bỏ lỡ sau đó.

Mặc dù tôi tin tưởng các kỹ sư của CodeBuild có lý do chính đáng để thiết kế theo cách này, nhưng những hạn chế ở trên cho thấy chức năng bộ nhớ cache cục bộ này được sử dụng hạn chế theo quan điểm của tôi.


1
Quan sát siêu thú vị. Cảm ơn bạn đã chia sẻ!
Patrick Lightbody
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.