AWS CodeBuild lokaler Cache kann nicht tatsächlich zwischengespeichert werden?


12

Ich habe versucht, den lokalen Cache von AWS CodeBuild zum Laufen zu bringen, und für mein ganzes Leben kann ich nicht einmal den grundlegendsten Cache zum Laufen bringen. Mein ultimatives Ziel ist es, Gradle-Artefakte zwischenzuspeichern, wie hier beschrieben .

Aber weil ich das nicht zum Laufen bringen konnte, habe ich einen noch einfacheren Test versucht, bei dem ich versuche, das Verzeichnis /root/foomit einer Datei zwischenzuspeichern counter.txt, die ich bei jedem Build inkrementiere. Ich gehe davon aus, dass in den Protokollen "2", "3" usw. angezeigt wird, wenn nachfolgende Builds innerhalb weniger Minuten ausgeführt werden. Die Realität ist jedoch, dass trotz der Herstellung des Symlinks beim nächsten Build die vorherige counter.txtDatei nie angezeigt wird , was darauf hindeutet, dass etwas sehr kaputt ist.

Kann jemand bestätigen, dass sein lokaler Cache tatsächlich in CodeBuild funktioniert? Ich frage mich, ob die Funktion derzeit defekt ist! Oder verstehe ich völlig falsch, was es tun soll?

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-Ausgabe : (gleiche Ausgabe, auch wenn sie schnell hintereinander ausgeführt wird)

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

Antworten:


7

Die Dokumentation ist nicht genau klar, aber der lokale AWS CodeBuild-Cache kann nur Verzeichnisse zwischenspeichern (zum Zeitpunkt des Schreibens). Dies ist etwas verwirrend, da die AWS CodeBuild-Buildspezifikationsspezifikation zulässt, dass der Pfad einzelne Dateien oder ein Platzhalter ist. In Wirklichkeit führt die Angabe einer Datei jedoch zu einem Fehler.

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

In Ihrem Beispiel verwenden Sie den Cache als

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

Wobei * sich auf alle einzelnen Dateien und Ordner in foo bezieht, aber nur Ordner zwischengespeichert werden.

Die Angabe des gesamten Verzeichnisses sollte funktionieren

cache:
  paths:
    - /root/foo/

10

Ich habe versucht, den Cache selbst mit begrenztem Erfolg zum Laufen zu bringen.

Nicht aus einer öffentlichen Quelle, aber dies sind einige Beobachtungen:

  • Der Cache ist nur verfügbar, wenn die Erstellungszeit mehr als 5 Minuten beträgt.

  • Der Cache kann verwendet werden, wenn der neue Build erfolgreich auf demselben Build-Host platziert wurde.

  • Der Cache kann verwendet werden, wenn der neue Build innerhalb von 5 bis 15 Minuten nach dem letzten Build ausgeführt wird. Der Cache kann basierend auf der letzten Erstellungszeit mit maximal 15 Minuten verfügbar bleiben.

  • Trotz Builds, die länger als 5 Minuten dauern, funktioniert der Cache möglicherweise nicht immer, da der Build auf einem anderen Build-Host platziert wird.

  • Wenn der Cache den neuen Build auf unter 5 Minuten beschleunigt, wird dieser Build nicht zwischengespeichert, was zu einem nachfolgenden Fehlschlag führt.

Obwohl ich darauf vertraue, dass die CodeBuild-Ingenieure gute Gründe hatten, es auf diese Weise zu entwerfen, machen die oben genannten Einschränkungen diese lokale Cache-Funktionalität meiner Meinung nach nur eingeschränkt nutzbar.


1
Super interessante Beobachtungen. Ich danke Ihnen für das Teilen!
Patrick Lightbody
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.