AWS CodeBuild cache lokal gagal untuk benar-benar cache?

12

Saya telah mencoba untuk mendapatkan cache lokal AWS CodeBuild untuk bekerja dan untuk kehidupan saya, saya bahkan tidak bisa mendapatkan cache yang paling dasar untuk bekerja. Tujuan utama saya adalah untuk men-cache artefak Gradle, seperti yang dibahas di sini .

Tetapi karena saya tidak bisa menjalankannya, saya mencoba tes yang lebih sederhana, di mana saya mencoba untuk men-cache direktori /root/foodengan file counter.txtyang saya tambahkan setiap build. Harapan saya adalah bahwa jika saya menjalankan pembangunan berikutnya dalam beberapa menit satu sama lain, saya akan melihat "2", "3", dll di log. Tetapi kenyataannya adalah bahwa meskipun symlink sedang dibangun, build berikutnya tidak pernah melihat counter.txtfile sebelumnya , yang menunjukkan kepada saya ada sesuatu yang sangat rusak.

Adakah yang bisa mengkonfirmasi bahwa cache lokal mereka benar-benar berfungsi di CodeBuild? Saya mulai bertanya-tanya apakah fitur tersebut saat ini rusak! Atau apakah saya benar-benar salah paham tentang apa yang seharusnya dilakukan?

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

Output CodeBuild : (output yang sama bahkan ketika dieksekusi dalam suksesi cepat)

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

Proyek JSON CodeBuild:

{
    "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
sumber
Tampaknya saya bukan satu-satunya: forums.aws.amazon.com/thread.jspa?threadID=312569&tstart=0
Patrick Lightbody

Jawaban:

7

Dokumentasi tidak benar-benar jelas, tetapi AWS CodeBuild Cache lokal hanya dapat men- cache direktori (pada saat penulisan). Ini sedikit membingungkan karena spesifikasi buildspec AWS CodeBuild memungkinkan path menjadi file individual atau wildcard , tetapi dalam kenyataannya menentukan file akan menghasilkan kesalahan.

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

Dalam contoh Anda, Anda menggunakan tentukan cache sebagai

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

Di mana * akan merujuk ke semua file dan folder di dalam foo tetapi hanya folder yang akan di-cache.

Menentukan seluruh direktori harus berfungsi

cache:
  paths:
    - /root/foo/
devaj
sumber
10

Saya telah mencoba membuat cache berfungsi sendiri dengan keberhasilan terbatas.

Bukan dari sumber publik, tetapi ini beberapa pengamatan:

  • Cache hanya akan tersedia jika waktu pembuatan lebih dari 5 menit.

  • Cache dapat digunakan jika build baru berhasil ditempatkan pada host host yang sama.

  • Cache dapat digunakan jika build baru dijalankan dalam 5-15 menit dari build terakhir. Cache dapat tetap tersedia berdasarkan waktu pembuatan terakhir dengan maksimal 15 menit.

  • Meskipun build melebihi 5 menit, cache mungkin tidak selalu berfungsi mungkin karena build ditempatkan pada host build yang berbeda.

  • Selain itu, dalam kasus di mana cache mempercepat build baru di bawah 5 menit, build itu tidak akan di-cache sehingga menghasilkan miss berikutnya.

Sementara saya percaya para insinyur CodeBuild memiliki alasan yang bagus untuk mendesainnya dengan cara ini, keterbatasan di atas menjadikan fungsionalitas cache lokal ini dari penggunaan terbatas menurut saya.

shariqmaws
sumber
1
Pengamatan super menarik. Terima kasih sudah berbagi!
Patrick Lightbody