AWS CodeBuild yerel önbellek gerçekten önbelleklenemiyor mu?


12

AWS CodeBuild'in yerel önbelleğini çalıştırmaya çalışıyordum ve hayatım boyunca çalışmak için en temel önbelleği bile alamıyorum. Nihai hedefim Gradle eserlerini burada tartışıldığı gibi önbelleğe almak .

Ama bunu çalıştıramadım, ben daha basit bir test denedim, nerede dizini her derleme artırmak /root/foobir dosya ile önbelleğe çalışın counter.txt. Beklentim, birbiri ardına birkaç dakika içinde sonraki yapıları çalıştırırsam, günlüklerde "2", "3" vb. Ancak gerçek şu ki, sembolik bağlantı kurulmasına rağmen, bir sonraki derleme önceki counter.txtdosyayı asla görmüyor , bu da bana bir şeyin çok bozuk olduğunu gösteriyor.

Herkes yerel önbellek aslında CodeBuild çalıştığını doğrulayabilir misiniz? Özelliğin şu anda bozuk olup olmadığını merak etmeye başlıyorum! Yoksa ne yapması gerektiğini tamamen yanlış anlıyor muyum?

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

CodeBuild çıkışı : (hızlı bir şekilde arka arkaya yürütüldüğünde bile aynı çıktı)

[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:  

CodeBuild projesi 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": []
}

Yanıtlar:


7

Belgeler tam olarak açık değil, ancak AWS CodeBuild Yerel önbellek yalnızca dizinleri önbelleğe alabilir (yazma tarihi itibariyle). AWS CodeBuild buildspec belirtimi, yolun tek tek dosyalar veya joker karakter olmasına izin verdiği için biraz kafa karıştırıcıdır , ancak gerçekte bir dosya belirtmek hata verir.

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

Kullandığınız örnekte önbelleği şu şekilde belirtin:

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

Burada *, foo içindeki tüm dosya ve klasörleri ifade eder, ancak yalnızca klasörler önbelleğe alınır.

Tüm dizinin belirtilmesi gerekir

cache:
  paths:
    - /root/foo/

10

Önbelleği sınırlı bir başarı ile kendim çalıştırmaya çalışıyorum.

Herhangi bir kamu kaynağından değil, ancak bunlar bazı gözlemlerdir:

  • Önbellek yalnızca oluşturma süresi 5 dakikadan fazla olduğunda avilable olur.

  • Yeni derleme aynı derleme ana bilgisayarına başarıyla yerleştirilirse önbellek kullanılabilir.

  • Önbellek, yeni derleme son derlemeden 5-15 dakika sonra çalıştırılıyorsa kullanılabilir. Önbellek, son oluşturma süresine bağlı olarak maksimum 15 dakika kullanılabilir.

  • 5 dakikayı aşan yapılara rağmen, yapı farklı yapı ana bilgisayarlarına yerleştirildiği için önbellek her zaman çalışmayabilir.

  • Ayrıca, önbelleğin yeni derlemeyi 5 dakikadan daha düşük bir hıza çıkarması durumunda, bu derleme önbelleğe alınmayacak ve sonuçta sonraki özlüyor.

CodeBuild mühendislerinin bunu bu şekilde tasarlamak için iyi nedenleri olduğuna inanmama rağmen, yukarıdaki sınırlamalar bu yerel önbellek işlevselliğini bence sınırlı kullanım haline getiriyor.


1
Süper ilginç gözlemler. Paylaşım için teşekkürler!
Patrick Lightbody
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.