AWS Lokalna pamięć podręczna CodeBuild nie może faktycznie buforować?

12

Próbowałem uruchomić lokalną pamięć podręczną AWS CodeBuild do pracy i przez całe życie nie mogę uzyskać nawet najbardziej podstawowej pamięci podręcznej do pracy. Moim ostatecznym celem jest buforowanie artefaktów Gradle, jak omówiono tutaj .

Ale ponieważ nie mogłem tego uruchomić, próbowałem jeszcze prostszego testu, w którym próbuję buforować katalog /root/fooza pomocą pliku, counter.txtktóry zwiększam przy każdej kompilacji. Oczekuję, że jeśli uruchomię kolejne kompilacje w ciągu kilku minut od siebie, w dziennikach pojawią się „2”, „3” itd. Ale rzeczywistość jest taka, że ​​pomimo ustanowienia dowiązania symbolicznego, następna kompilacja nigdy nie widzi poprzedniego counter.txtpliku, co sugeruje mi, że coś jest bardzo zepsute.

Czy ktoś może potwierdzić, że ich lokalna pamięć podręczna faktycznie działa w CodeBuild? Zaczynam się zastanawiać, czy funkcja jest obecnie zepsuta! Czy też całkowicie nie rozumiem, co powinien zrobić?

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

Wyjście CodeBuild : (to samo wyjście, nawet jeśli jest wykonywane szybko)

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

Projekt 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": []
}
Patrick Lightbody
źródło
Wygląda na to, że nie jestem jedyny: forums.aws.amazon.com/thread.jspa?threadID=312569&tstart=0
Patrick Lightbody

Odpowiedzi:

7

Dokumentacja nie jest do końca jasna, ale lokalna pamięć podręczna CodeSBuild AWS może buforować tylko katalogi (w momencie pisania). Jest to nieco mylące, ponieważ specyfikacja buildspec AWS CodeBuild zezwala na ścieżkę na pojedyncze pliki lub symbol wieloznaczny , ale w rzeczywistości określenie pliku spowoduje błąd.

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

W twoim przykładzie używasz bufora jako

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

Gdzie * odnosi się do wszystkich pojedynczych plików i folderów w foo, ale tylko foldery będą buforowane.

Określenie całego katalogu powinno działać

cache:
  paths:
    - /root/foo/
devaj
źródło
10

Próbowałem sprawić, by pamięć podręczna działała sama z ograniczonym sukcesem.

Nie z żadnego publicznego źródła, ale są to pewne spostrzeżenia:

  • Pamięć podręczna będzie dostępna tylko wtedy, gdy czas kompilacji jest dłuższy niż 5 minut.

  • Można użyć pamięci podręcznej, jeśli nowa kompilacja zostanie pomyślnie umieszczona na tym samym hoście kompilacji.

  • Można użyć pamięci podręcznej, jeśli nowa kompilacja jest uruchamiana w ciągu 5-15 minut od ostatniej kompilacji. Pamięć podręczna może pozostać dostępna na podstawie ostatniego czasu kompilacji, maksymalnie przez 15 minut.

  • Pomimo kompilacji przekraczających 5 minut pamięć podręczna może nie zawsze działać, prawdopodobnie z powodu umieszczenia kompilacji na innym hoście kompilacji.

  • Ponadto w przypadku, gdy pamięć podręczna przyspiesza nową kompilację do mniej niż 5 minut, kompilacja ta nie zostanie buforowana, co spowoduje kolejne pominięcie.

Chociaż ufam, że inżynierowie CodeBuild mieli dobre powody, aby zaprojektować go w ten sposób, powyższe ograniczenia sprawiają, że ta funkcja lokalnej pamięci podręcznej ma ograniczone zastosowanie.

shariqmaws
źródło
1
Super ciekawe obserwacje. Dziękuję za podzielenie się!
Patrick Lightbody