Я пытался заставить работать локальный кеш AWS CodeBuild, и на всю жизнь я не могу заставить работать даже самый простой кеш. Моя конечная цель - кэшировать артефакты Gradle, как обсуждалось здесь .
Но поскольку я не мог заставить это работать, я попробовал еще более простой тест, где я пытаюсь кэшировать каталог /root/foo
с файлом, counter.txt
который я увеличиваю при каждой сборке. Я ожидаю, что если я буду запускать последующие сборки в течение нескольких минут, я буду видеть «2», «3» и т. Д. В журналах. Но реальность такова, что, несмотря на создание символической ссылки, следующая сборка никогда не увидит предыдущий 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": []
}
источник
Ответы:
Документация не совсем ясна, но локальный кеш AWS CodeBuild может кэшировать только каталоги (на момент написания). Это немного сбивает с толку, потому что спецификация спецификации сборки AWS CodeBuild позволяет указывать путь к отдельным файлам или подстановочному знаку , но в действительности указание файла приведет к ошибке.
В вашем примере вы используете указать кеш как
Где * относится ко всем отдельным файлам и папкам внутри foo, но кэшируются только папки.
Указание всего каталога должно работать
источник
Я пытался заставить кеш работать сам с ограниченным успехом.
Не из какого-либо публичного источника, но вот некоторые наблюдения:
Кэш будет доступен только если время сборки больше 5 минут.
Кэш может использоваться, если новая сборка успешно размещена на том же хосте сборки.
Кэш можно использовать, если новая сборка выполняется в течение 5-15 минут после последней сборки. Кэш-память может оставаться доступной в зависимости от времени последней сборки, максимум 15 минут.
Несмотря на то, что сборка длится более 5 минут, кэш может не всегда работать, вероятно, из-за того, что сборка размещается на другом хосте сборки.
Кроме того, в случае, когда кэш ускоряет новую сборку до уровня ниже 5 минут, эта сборка не будет кэшироваться, что приведет к последующему пропуску.
Хотя я полагаю, что у инженеров CodeBuild были веские причины для его разработки таким образом, вышеуказанные ограничения, по моему мнению, ограничивают функциональность локального кэша.
источник