AWS CodeBuild แคชท้องถิ่นล้มเหลวในการแคชจริง?


12

ฉันพยายามรับแคชในพื้นที่ของ AWS CodeBuild และเพื่อชีวิตของฉันฉันไม่สามารถรับแคชพื้นฐานที่สุดในการทำงานได้ เป้าหมายสูงสุดของผมคือการแคชสิ่งประดิษฐ์ Gradle ตามที่กล่าวไว้ที่นี่

แต่เนื่องจากฉันไม่สามารถทำงานได้ฉันจึงลองทำการทดสอบที่เรียบง่ายยิ่งขึ้นซึ่งฉันพยายามแคชไดเรกทอรี/root/fooด้วยไฟล์counter.txtที่ฉันเพิ่มแต่ละการสร้าง ความคาดหวังของฉันคือถ้าฉันเรียกใช้งานบิลด์ที่ตามมาภายในไม่กี่นาทีจากกันฉันจะเห็น "2", "3" ฯลฯ ในบันทึก แต่ความจริงก็คือแม้ว่าจะมีการสร้าง symlink ขึ้น แต่โครงสร้างต่อไปก็ไม่เคยเห็นcounter.txtไฟล์ก่อนหน้าซึ่งแสดงให้ฉันเห็นว่ามีบางอย่างเสียไป

ทุกคนสามารถยืนยันได้ว่าแคชโลคัลของพวกเขาใช้งานได้จริงใน CodeBuild? ฉันเริ่มสงสัยว่าคุณลักษณะนี้ใช้งานไม่ได้หรือไม่! หรือฉันเข้าใจผิดโดยสิ้นเชิงว่าควรทำอย่างไร?

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 : (เอาท์พุทเดียวกันแม้เมื่อดำเนินการอย่างต่อเนื่องอย่างรวดเร็ว)

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

ดูเหมือนว่าฉันไม่ใช่คนเดียว: forums.aws.amazon.com/thread.jspa?threadID=312569&tstart=0
Patrick Lightbody

คำตอบ:


7

เอกสารไม่ชัดเจน แต่แคช AWS CodeBuild Local สามารถแคชไดเรกทอรีเท่านั้น (ณ เวลาที่เขียน) สิ่งนี้ค่อนข้างสับสนเล็กน้อยเนื่องจากข้อกำหนดคุณสมบัติ AWS CodeBuild buildspec ทำให้พา ธ เป็นไฟล์เดี่ยวหรือไวด์การ์ดแต่ในความเป็นจริงการระบุไฟล์จะทำให้เกิดข้อผิดพลาด

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

ในตัวอย่างของคุณคุณใช้ระบุแคชเป็น

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

โดยที่ * จะอ้างถึงแต่ละไฟล์และโฟลเดอร์ทั้งหมดภายใน foo แต่จะมีการแคชโฟลเดอร์เท่านั้น

การระบุไดเรกทอรีทั้งหมดควรใช้งานได้

cache:
  paths:
    - /root/foo/

10

ฉันพยายามทำให้แคชทำงานด้วยตนเองด้วยความสำเร็จที่ จำกัด

ไม่ได้มาจากแหล่งข้อมูลสาธารณะ แต่เป็นข้อสังเกตบางประการ:

  • แคชจะสามารถใช้งานได้หากเวลาสร้างนานกว่า 5 นาที

  • สามารถใช้แคชได้หากวางบิลใหม่สำเร็จบนโฮสต์บิลด์เดียวกัน

  • สามารถใช้แคชได้หากมีการเรียกใช้งานบิลด์ใหม่ภายใน 5-15 นาทีของการสร้างครั้งล่าสุด แคชอาจยังคงใช้งานได้ตามเวลาสร้างครั้งสุดท้ายด้วยสูงสุด 15 นาที

  • แม้จะมีการสร้างเกิน 5 นาทีแคชอาจไม่ทำงานเนื่องจากการวางอยู่บนโฮสต์การสร้างที่แตกต่างกัน

  • นอกจากนี้ในกรณีที่แคชเพิ่มความเร็วการสร้างใหม่ให้ต่ำกว่า 5 นาทีบิลด์นั้นจะไม่ถูกแคชทำให้พลาดในครั้งต่อไป

ในขณะที่ฉันเชื่อว่าวิศวกร CodeBuild มีเหตุผลที่ดีในการออกแบบด้วยวิธีนี้ข้อ จำกัด ข้างต้นทำให้ฟังก์ชั่นแคชภายในเครื่องนี้มีข้อ จำกัด ในการใช้งาน


1
ข้อสังเกตที่น่าสนใจสุด ๆ ขอบคุณสำหรับการแชร์!
Patrick Lightbody
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.