排查 AWS CodeBuild 问题
使用本主题中的信息来帮助您识别、诊断和解决问题。要了解如何记录和监控 CodeBuild 构建以排除故障,请参阅日志记录和监控。
主题
来自错误存储库的 Apache Maven 构建参考构件
问题:在将 Maven 与 AWS CodeBuild 提供的 Java 构建环境结合使用时,Maven 会从安全的 Maven 中央存储库(网址为 https://repo1.maven.org/maven2pom.xml 文件明确声明会改用其他位置,也会发生这种情况。
可能的原因:CodeBuild 提供的 Java 构建环境包含一个名为 settings.xml 的文件,该文件预先安装在构建环境的 /root/.m2 目录中。该 settings.xml 文件包含以下声明,这些声明将指示 Maven 始终从安全的 Maven 中央存储库(网址为 https://repo1.maven.org/maven2
<settings> <activeProfiles> <activeProfile>securecentral</activeProfile> </activeProfiles> <profiles> <profile> <id>securecentral</id> <repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>https://repo1.maven.org/maven2</url> <releases> <enabled>true</enabled> </releases> </pluginRepository> </pluginRepositories> </profile> </profiles> </settings>
建议的解决方案:执行以下操作:
-
向源代码中添加
settings.xml文件。 -
在此
settings.xml文件中,使用上述settings.xml格式作为指导,声明您希望 Maven 从哪些存储库中提取构建和插件依赖项。 -
在构建项目的
install阶段,指示 CodeBuild 将您的settings.xml文件复制到构建环境的/root/.m2目录。例如,考虑说明此行为的buildspec.yml文件中的以下代码段。version 0.2 phases: install: commands: - cp ./settings.xml /root/.m2/settings.xml
默认情况下,以根用户身份运行构建命令
问题:AWS CodeBuild 以根用户身份运行您的构建命令。即使您的相关构建映像的 Dockerfile 将 USER 指令设置为另一位用户,也会发生这种情况。
原因:默认情况下,CodeBuild 将以根用户身份运行所有构建命令。
建议的解决方案:无。
当文件名包含非美国英语字符时,构建可能失败
问题:当您运行的构建使用的文件的名称包含非美国英语字符(例如,中文字符)时,构建将失败。
可能的原因:由 AWS CodeBuild 提供的构建环境将其默认区域设置设为 POSIX。POSIX 本地化设置不太兼容 CodeBuild 和包含非美国英语字符的文件名,并可能导致相关的构建失败。
建议的解决方案:将以下命令添加到构建规范文件的 pre_build 部分。这些命令使构建环境使用美国英语 UTF-8 作为其本地化设置,该格式与 CodeBuild 和包含非美国英语字符的文件名更兼容。
对于基于 Ubuntu 的构建环境:
pre_build: commands: - export LC_ALL="en_US.UTF-8" - locale-gen en_US en_US.UTF-8 - dpkg-reconfigure -f noninteractive locales
对于基于 Amazon Linux 的构建环境:
pre_build: commands: - export LC_ALL="en_US.utf8"
当从 Amazon EC2 Parameter Store 获取参数时,构建可能失败
问题:当构建尝试获取存储在 Amazon EC2 Parameter Store 中的一个或多个参数的值时,处于 DOWNLOAD_SOURCE 阶段的构建将失败并返回错误 Parameter does not
exist。
可能的原因:构建项目依赖的服务角色无权调用 ssm:GetParameters 操作,或构建项目使用由 AWS CodeBuild 生成的服务角色并允许调用 ssm:GetParameters 操作,但参数的名称不以 /CodeBuild/ 开头。
建议的解决方案:
-
如果服务角色不是由 CodeBuild 生成的,请将其定义更新为允许 CodeBuild 调用
ssm:GetParameters操作。例如,以下策略语句允许调用ssm:GetParameters操作以获取名称以/CodeBuild/开头的参数: -
如果服务角色是由 CodeBuild 生成的,请将其定义更新为允许 CodeBuild 访问 Amazon EC2 Parameter Store 中名称并非以
/CodeBuild/开头的参数。例如,以下策略语句允许调用ssm:GetParameters操作以获取具有指定名称的参数:
无法在 CodeBuild 控制台中访问分支筛选条件
问题:创建或更新 AWS CodeBuild 项目时,控制台中的分支筛选条件选项不可用。
可能的原因:分支筛选选项已被弃用。它已被 Webhook 筛选条件组取代,后者可以更好地控制在 CodeBuild 中触发新构建的 Webhook 事件。
建议的解决方案:要迁移在引入 Webhook 筛选条件之前创建的分支筛选条件,请使用正则表达式 ^refs/heads/ 创建带 branchName$HEAD_REF 筛选条件的 Webhook 筛选条件组。例如,如果您的分支筛选条件正则表达式是 ^branchName$,那么您放入 HEAD_REF 筛选条件的经过更新的正则表达式是 ^refs/heads/branchName$。有关更多信息,请参阅Bitbucket Webhook 事件和筛选 GitHub Webhook 事件(控制台)。
无法查看构建是成功还是失败
问题:无法查看重试构建是成功还是失败。
可能的原因:未启用报告构建状态的选项。
建议的解决方案:在创建或更新 CodeBuild 项目时,启用报告构建状态。此选项告知 CodeBuild 在触发构建时报告状态。有关更多信息,请参阅《AWS CodeBuild API 参考》中的 reportBuildStatus。
未向源提供商报告构建状态
问题:允许向源提供商(例如 GitHub 或 Bitbucket)报告构建状态后,构建状态未更新。
可能的原因:与源提供商关联的用户不具备访问存储库的权限。
建议的解决方案:为了能够向源提供商报告构建状态,与源提供商关联的用户必须拥有对存储库的写入权限。如果用户没有写入权限,则无法更新构建状态。有关更多信息,请参阅 源提供商访问权限。
无法找到并选择 Windows Server Core 2019 平台的基本映像
问题:无法找到或选择 Windows Server Core 2019 平台的基本映像。
可能的原因:您使用的 AWS 区域不支持此映像。
建议的解决方案:使用以下支持 Windows Server Core 2019 平台基本映像的 AWS 区域之一:
-
美国东部(弗吉尼亚州北部)
-
美国东部(俄亥俄州)
-
美国西部(俄勒冈州)
-
欧洲地区(爱尔兰)
构建规范文件中的前期命令无法被后续命令识别
问题:buildspec 文件中的一个或多个命令的结果无法被同一 buildspec 文件中的后续命令识别。例如,某个命令可能会设置本地环境变量,但稍后运行的命令可能无法获取该本地环境变量的值。
可能的原因:在 buildspec 文件版本 0.1 中,AWS CodeBuild 将在构建环境内的默认 Shell 的单独实例中运行每个命令。这表示各个命令独立于其他所有命令而运行。默认情况下,您无法运行依赖于任何先前命令的状态的单个命令。
建议的解决方案:建议您使用构建规范版本 0.2,它能解决此问题。如果您必须使用构建规范版本 0.1,建议您使用 Shell 命令链接运算符(例如,Linux 中的 &&)将多个命令合并为一个命令。或者,您也可以在源代码中包括一个带有多个命令的 Shell 脚本,然后从 buildspec 文件中的单个命令调用该 Shell 脚本。有关更多信息,请参阅构建环境中的 Shell 和命令和构建环境中的环境变量。
尝试下载缓存时出现错误:“访问被拒绝”
问题:当尝试下载已启用缓存的构建项目上的缓存时,您收到 Access denied 错误。
可能的原因:
-
您刚刚已将缓存配置为您的构建项目的一部分。
-
最近已通过
InvalidateProjectCacheAPI 使缓存失效。 -
正由 CodeBuild 使用的服务角色对包含缓存的 S3 存储桶没有
s3:GetObject和s3:PutObject权限。
建议的解决方案:在首次使用时,在更新缓存配置后立即看到此错误是正常的。如果此错误持续存在,则您应该检查您的服务角色对包含缓存的 S3 存储桶是否具有 s3:GetObject 和 s3:PutObject 权限。有关更多信息,请参阅《Amazon S3 开发人员指南》中的指定 S3 权限。
使用自定义构建映像时出现错误“BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE”
问题:当您尝试运行使用自定义构建映像的构建时,构建将失败并返回错误 BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE。
- 可能的原因:构建映像的整体未压缩大小大于构建环境计算类型的可用磁盘空间。要检查构建映像的大小,请使用 Docker 运行
docker images命令。有关按计算类型分类的可用磁盘空间的列表,请参阅构建环境计算模式和类型。REPOSITORY:TAG -
建议的解决方案:对较大的计算类型使用更多的可用磁盘空间,或者减小自定义构建映像的大小。
- 可能的原因:AWS CodeBuild 不具备从您的 Amazon Elastic Container Registry(Amazon ECR)中拉取构建映像的权限。
-
建议的解决方案:更新 Amazon ECR 的存储库中的权限,以便 CodeBuild 可以将自定义构建映像拉取到构建环境中。有关更多信息,请参阅Amazon ECR 示例。
- 可能的原因:您请求的 Amazon ECR 映像在您的 AWS 账户使用的 AWS 区域中不可用。
-
建议的解决方案:使用与您的 AWS 账户使用的映像位于同一 AWS 区域中的 Amazon ECR 映像。
- 可能的原因:您在无法访问公共互联网的 VPC 中使用私有注册表。CodeBuild 无法从 VPC 中的私有 IP 地址拉取映像。有关更多信息,请参阅 适用于 CodeBuild 的带 AWS Secrets Manager 的私有注册表示例。
-
建议的解决方案:如果您在 VPC 中使用私有注册表,请确保 VPC 具有公共互联网访问权限。
- 可能的原因:如果错误消息包含“toomanyrequests”,并且映像是从 Docker Hub 获取的,则此错误表示已达到 Docker Hub 的拉取限制。
-
建议的解决方案:使用 Docker Hub 私有注册表,或者从 Amazon ECR 获取您的映像。有关使用私有注册表的更多信息,请参阅 适用于 CodeBuild 的带 AWS Secrets Manager 的私有注册表示例。有关使用 Amazon ECR 的更多信息,请参阅适用于 CodeBuild 的 Amazon ECR 示例 。
错误:“构建容器在完成构建前发现了死信。构建容器因内存不足已停止运行,或者 Docker 映像不受支持。错误代码:500”
问题:当您尝试在 AWS CodeBuild 中使用 Microsoft Windows 或 Linux 容器时,PROVISIONING 阶段出现此错误。
可能的原因:
-
CodeBuild 不支持容器操作系统版本。
-
在容器中指定了
HTTP_PROXY和/或HTTPS_PROXY。
建议的解决方案:
-
对于 Microsoft Windows,使用其中容器操作系统版本为 microsoft/windowsservercore:10.0.x(例如,microsoft/windowsservercore:10.0.14393.2125)的 Windows 容器。
-
对于 Linux,请在 Docker 映像中清除
HTTP_PROXY和HTTPS_PROXY设置,或在构建项目中指定 VPC 配置。
错误:运行构建时出现“无法连接到 Docker 进程守护程序”
问题:您的构建失败,并在构建日志中收到了类似于 Cannot connect to the Docker daemon
at unix:/var/run/docker.sock. Is the docker daemon running? 的错误。
可能的原因:您未在特权模式下运行构建。
推荐的解决方案:要修复此错误,必须启用特权模式并按照以下说明更新 buildspec。
要在特权模式下运行构建,请按照以下步骤操作:
-
打开 https://console.aws.amazon.com/codebuild/
上的 CodeBuild 控制台。 -
在导航窗格中选择构建项目,然后选择您的构建项目。
-
从编辑中,选择环境。
-
选择其他配置。
-
在特权中,选择如果要构建 Docker 映像或希望您的构建获得提升的特权,请启用此标志。
-
选择更新环境。
-
选择启动构建来重试您的构建。
您还需要在容器内启动 Docker 进程守护程序。buildspec 的 install 阶段可能看上去与以下示例类似:
phases: install: commands: - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2 & - timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
有关 buildspec 文件中引用的 OverlayFS 存储驱动程序的更多信息,请参阅 Docker 网站上的使用 OverlayFS 存储驱动程序
注意
如果基本操作系统是 Alpine Linux,请在 buildspec.yml 中向 -t 添加 timeout 参数:
- timeout -t 15 sh -c "until docker info; do echo .; sleep 1; done"
要详细了解如何使用 AWS CodeBuild 构建和运行 Docker 映像,请参阅适用于 CodeBuild 的自定义映像示例中的 Docker。
创建或更新构建项目时收到错误:“CodeBuild 无权执行:sts:AssumeRole”
问题:当您尝试创建或更新构建项目时,您会收到错误 Code:InvalidInputException,
Message:CodeBuild is not authorized to perform: sts:AssumeRole on
arn:aws:iam::。account-ID:role/service-role-name
可能的原因:
-
AWS Security Token Service(AWS STS)已在您尝试创建或更新构建项目的 AWS 区域停用。
-
与构建项目相关联的 AWS CodeBuild 服务角色不存在,或没有足够的权限来信任 CodeBuild。
-
与构建项目关联的 AWS CodeBuild 服务角色大小写与实际 IAM 角色不匹配。
建议的解决方案:
-
确保 AWS STS 已经为您尝试创建或更新构建项目的 AWS 区域激活。有关更多信息,请参阅 IAM 用户指南中的在 AWS STS 区域中激活和停用 AWS。
-
确保您的 AWS 账户中存在目标 CodeBuild 服务角色。如果您没有使用控制台,请确保在创建或更新构建项目时没有拼错服务角色的 Amazon 资源名称(ARN)。请注意,IAM 角色区分大小写,因此请检查 IAM 角色的大小写是否正确。
-
确保目标 CodeBuild 服务角色具有足够的权限来信任 CodeBuild。有关更多信息,请参阅 允许 CodeBuild 与其他 AWS 服务进行交互 中的信任关系策略声明。
错误:“调用 GetBucketAcl 时出错:存储桶拥有者已更改,或者服务角色不再拥有调用 s3:GetBucketAcl 的权限”
问题:运行构建时,您收到一个有关 S3 存储桶所有权更改和 GetBucketAcl 权限更改的错误。
可能的原因:您将 s3:GetBucketAcl 和 s3:GetBucketLocation 权限添加到了 IAM 角色。这些权限可保护您项目的 S3 存储桶,并确保只有您可以访问它。添加完这些权限后,S3 存储桶的拥有者会发生更改。
建议的解决方案:确认您是 S3 存储桶的拥有者,然后重新将权限添加到您的 IAM 角色。有关更多信息,请参阅 对 S3 存储桶的安全访问。
运行构建时收到错误:“无法上传构件:arn 无效”
问题:在运行构建时,UPLOAD_ARTIFACTS 构建阶段失败并出现错误 Failed to
upload artifacts: Invalid arn。
可能的原因:您的 S3 输出存储桶(AWS CodeBuild 用于存储其构建输出的存储桶)位于与 CodeBuild 构建项目不同的 AWS 区域。
建议的解决方案:更新构建项目的设置,以指向与该构建项目位于同一 AWS 区域的输出存储桶。
错误:“Git 克隆失败:无法访问 'your-repository-URL':SSL 证书问题:自签名证书”
问题: 当您尝试运行构建项目时,构建失败并出现此错误。
可能的原因:您的源存储库具有一个自签名证书,但您在构建项目的过程中未选择从您的 S3 存储桶安装此证书。
建议的解决方案:
-
编辑您的项目。对于证书,选择从 S3 安装证书。对于证书存储桶,选择存储您的 SSL 证书的 S3 存储桶。对于证书的对象键,键入您的 S3 对象键的名称。
-
编辑您的项目。选择不安全的 SSL,在连接到您的 GitHub Enterprise Server 项目存储库时忽略 SSL 警告。
注意
建议您仅将不安全的 SSL 用于测试。它不应在生产环境中使用。
运行构建时收到错误:“必须使用指定的终端节点来寻址当前尝试访问的存储桶”
问题:在运行构建时,DOWNLOAD_SOURCE 构建阶段失败并出现错误 The bucket you
are attempting to access must be addressed using the specified endpoint. Please send
all future requests to this endpoint。
可能的原因:您预先构建的源代码存储在 S3 存储桶中,而该存储桶位于与 AWS CodeBuild 构建项目不同的 AWS 区域中。
建议的解决方案:更新构建项目的设置,以指向包含预构建的源代码的存储桶。确保该存储桶位于与构建项目相同的 AWS 区域中。
错误:“此构建映像需要至少选择一个运行时版本。”
问题:在运行构建时,DOWNLOAD_SOURCE 构建阶段失败并出现错误 YAML_FILE_ERROR:
This build image requires selecting at least one runtime version。
可能的原因:您的构建使用 1.0 版或更高版本的 Amazon Linux 2(AL2)标准映像或者 2.0 版或更高版本的 Ubuntu 标准映像,并且未在构建规范文件中指定运行时。
建议的解决方案:如果您使用 aws/codebuild/standard:2.0 CodeBuild 托管映像,则必须在 buildspec 文件的 runtime-versions 部分中指定运行时版本。例如,您可以对使用 PHP 的项目使用以下 buildspec 文件:
version: 0.2 phases: install: runtime-versions: php: 7.3 build: commands: - php --version artifacts: files: - README.md
注意
如果您指定 runtime-versions 部分且使用的映像不是 Ubuntu 标准映像 2.0 或更高版本或 Amazon Linux 2 (AL2) 标准映像 1.0 或更高版本,则构建会发出警告“Skipping install of runtimes. Runtime version selection is not supported by this build image”。
有关更多信息,请参阅 Specify runtime versions in the buildspec file。
构建队列中的构建失败时出现错误“QUEUED: INSUFFICIENT_SUBNET”
问题:构建队列中的构建失败,出现类似于 QUEUED: INSUFFICIENT_SUBNET 的错误。
可能的原因:为 VPC 指定的 IPv4 CIDR 块使用了预留 IP 地址。每个子网 CIDR 块中的前四个 IP 地址和最后一个 IP 地址无法供您使用,而且无法分配到一个实例。例如,在具有 CIDR 块 10.0.0.0/24 的子网中,以下五个 IP 地址是保留的:
-
10.0.0.0::网络地址。 -
10.0.0.1:由 AWS 保留,用于 VPC 路由器。 -
10.0.0.2:由 AWS 保留。DNS 服务器的 IP 地址始终为 VPC 网络范围的基址 + 2;但是,我们也保留了每个子网范围基址 + 2 的 IP 地址。对于包含多个 CIDR 块的 VPC,DNS 服务器的 IP 地址位于主要 CIDR 中。有关更多信息,请参阅《Amazon VPC 用户指南》中的 Amazon DNS 服务器。 -
10.0.0.3:由 AWS 保留,供将来使用。 -
10.0.0.255:网络广播地址。我们不支持 VPC 中的广播。该地址是预留的。
建议的解决方案:检查您的 VPC 是否使用了预留 IP 地址。将任何预留的 IP 地址替换为未预留的 IP 地址。有关更多信息,请参阅 Amazon VPC 用户指南 中的 VPC 和子网大小调整。
错误:“无法下载缓存:RequestError:发送请求失败原因:x509:无法加载系统根,并且未提供任何根”
问题: 当您尝试运行构建项目时,构建失败并出现此错误。
可能的原因:您将缓存配置为您的构建项目的一部分并使用包含过期根证书的较旧 Docker 映像。
建议的解决方案:更新 AWS CodeBuild 项目中使用的 Docker 映像。有关更多信息,请参阅 CodeBuild 提供的 Docker 映像。
错误:“无法从 S3 下载证书。AccessDenied”
问题: 当您尝试运行构建项目时,构建失败并出现此错误。
可能的原因:
-
您选择了错误的证书 S3 存储桶。
-
您输入了错误的证书对象键。
建议的解决方案:
-
编辑您的项目。对于证书存储桶,选择存储您的 SSL 证书的 S3 存储桶。
-
编辑您的项目。对于证书的对象键,键入您的 S3 对象键的名称。
错误:“找不到凭证”
问题:在尝试运行 AWS CLI、使用 AWS 开发工具包或调用其他类似组件作为构建的一部分时,您收到与 AWS CLI、AWS 开发工具包或组件直接相关的构建错误。例如,您可能会收到构建错误,如 Unable to locate credentials。
可能的原因:
-
构建环境中的 AWS CLI、AWS 开发工具包或组件的版本与 AWS CodeBuild 不兼容。
-
您将在使用 Docker 的构建环境内运行 Docker 容器,并且此容器在默认情况下无权访问 AWS 凭证。
建议的解决方案:
-
确保您的构建环境具有以下版本或更高版本的 AWS CLI、AWS 开发工具包或组件。
-
AWS CLI:1.10.47
-
AWS适用于 C++ 的 开发工具包:0.2.19
-
AWS适用于 Go 的 开发工具包:1.2.5
-
AWS适用于 Java 的 开发工具包:1.11.16
-
AWS适用于 JavaScript 的 开发工具包:2.4.7
-
AWS适用于 PHP 的 开发工具包:3.18.28
-
适用于 Python(Boto3)的 AWS 开发工具包:1.4.0
-
AWS适用于 Ruby 的 开发工具包:2.3.22
-
Botocore:1.4.37
-
CoreCLR:3.2.6-beta
-
Node.js:2.4.7
-
-
如果您需要在某个构建环境中运行某个 Docker 容器,而该容器需要 AWS 凭证,则必须将此凭证从该构建环境传递到该容器。在您的 buildspec 文件中,包含与以下内容类似的 Docker
run命令。此示例使用aws s3 ls命令列出您的可用 S3 存储桶。-e选项将为容器传递访问 AWS 凭证所需的环境变量。docker run -e AWS_DEFAULT_REGION -e AWS_CONTAINER_CREDENTIALS_RELATIVE_URIyour-image-tagaws s3 ls -
如果您要构建 Docker 映像并且该构建需要 AWS 凭证(例如,从 Amazon S3 下载文件),则必须将凭证从构建环境传递到 Docker 构建过程,如下所示。
-
在您的源代码的用于 Docker 映像的 Dockerfile 中,指定以下
ARG指令。ARG AWS_DEFAULT_REGION ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URI -
在您的 buildspec 文件中,包含与以下内容类似的 Docker
build命令。--build-arg选项将为 Docker 构建过程设置访问 AWS 凭证所需的环境变量。docker build --build-arg AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION --build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI -tyour-image-tag.
-
在代理服务器中运行 CodeBuild 时出现 RequestError 超时错误
问题:您收到类似于以下内容的 RequestError 错误:
-
CloudWatch Logs 中的
RequestError: send request failed caused by: Post https://logs.<your-region>.amazonaws.com/: dial tcp 52.46.158.105:443: i/o timeout。 -
Amazon S3 中的
Error uploading artifacts: RequestError: send request failed caused by: Put https://。your-bucket.s3.your-aws-region.amazonaws.com/*: dial tcp 52.219.96.208:443: connect: connection refused
可能的原因:
-
ssl-bump未正确配置。 -
贵组织的安全策略不允许您使用
ssl_bump。 -
您的 buildspec 文件没有使用
proxy元素指定的代理设置。
建议的解决方案:
-
确保
ssl-bump已正确配置。如果您对代理服务器使用 Squid,请参阅 将 Squid 配置为显式代理服务器。 -
按照以下步骤操作,为 Amazon S3 和 CloudWatch Logs 使用私有端点:
-
在您的私有子网路由表中,删除您添加的、将发往互联网的流量路由到您的代理服务器的规则。有关信息,请参阅《Amazon VPC 用户指南》中的在 VPC 中创建子网。
-
创建私有 Amazon S3 端点和 CloudWatch Logs 端点,然后将其与您的 Amazon VPC 私有子网关联。有关信息,请参阅《Amazon VPC 用户指南》中的 VPC 端点服务。
-
确认已选中 Amazon VPC 中的启用私有 DNS 名称。有关更多信息,请参阅《Amazon VPC User Guide》中的 Creating an interface endpoint。
-
-
如果您不将
ssl-bump用于显式代理服务器,请使用proxy元素将代理配置添加到您的 buildspec 文件。有关更多信息,请参阅 在显式代理服务器中运行 CodeBuild和buildspec 语法。version: 0.2 proxy: upload-artifacts: yes logs: yes phases: build: commands:
bourne shell(sh)必须存在于构建映像中
问题:您使用的构建映像不是由 AWS CodeBuild 提供的,并且您的构建失败并显示消息 Build container found
dead before completing the build。
可能的原因:Bourne Shell (sh) 未包含在您的构建映像中。CodeBuild 需要 sh 才能运行构建命令和脚本。
建议的解决方案:如果您的构建映像中不存在 sh,请确保您在启动使用映像的任何其他构建前包含它。(CodeBuild 已将 sh 包含在其构建映像中。)
警告:“跳过运行时安装。此构建映像不支持运行时版本选择”(在运行构建时出现)
问题:在运行构建时,构建日志包含此警告。
可能的原因:您的构建未使用 1.0 版或更高版本的 Amazon Linux 2(AL2)标准映像或者 2.0 版或更高版本的 Ubuntu 标准映像,并且在 buildspec 文件的 runtime-versions 部分中指定了运行时。
建议的解决方案:确保 buildspec 文件不包含 runtime-versions 部分。仅当使用 Amazon Linux 2(AL2)标准映像或更高版本或者 Ubuntu 标准映像版本 2.0 或更高版本时,才需要 runtime-versions 部分。
打开 CodeBuild 控制台时出现“无法验证 JobWorker 身份”错误
问题:当您打开 CodeBuild 控制台时,会显示“无法验证 JobWorker 身份”错误消息。
可能的原因:用于控制台访问的 IAM 角色的标签以 jobId 作为键。此标签键是为 CodeBuild 保留的,如果存在则会导致此错误。
建议的解决方案:将任何具有 jobId 键的自定义 IAM 角色标签更改为具有其他键,例如 jobIdentifier。
构建启动失败
问题:启动构建时,您会收到构建启动失败错误消息。
可能的原因:已达到并发构建的数量。
建议的解决方案:等到其他构建完成,或者增加项目的并发构建限制,然后重新启动构建。有关更多信息,请参阅 项目配置。
访问本地缓存的构建中的 GitHub 元数据
问题:在某些情况下,缓存构建中的 .git 目录是文本文件,而不是目录。
可能的原因:为构建启用本地源代码缓存后,CodeBuild 会为 .git 目录创建一个 gitlink。这意味着该 .git 目录实际上是一个包含目录路径的文本文件。
建议的解决方案:在所有情况下,都使用以下命令获取 Git 元数据目录。无论 .git 采用何种格式,此命令都将起作用:
git rev-parse --git-dir
AccessDenied:报告组的存储桶所有者与 S3 存储桶的所有者不匹配...
问题:将测试数据上传到 Amazon S3 存储桶时,CodeBuild 无法将测试数据写入存储桶。
可能的原因:
-
为报告组存储桶所有者指定的账户与 Amazon S3 存储桶的所有者不匹配。
-
服务角色不具备写入存储桶的权限。
建议的解决方案:
-
更改报告组存储桶所有者,使其与 Amazon S3 存储桶所有者匹配。
-
修改服务角色来提供写入 Amazon S3 存储桶的权限。
错误:使用 CodeConnections 创建 CodeBuild 项目时出现“Your credentials lack one or more required privilege scopes”
问题:使用 CodeConnections 创建 CodeBuild 项目时,您无权安装 Bitbucket webhook。
可能的原因:
-
您的 Bitbucket 账户可能尚未接受新的权限范围。
建议的解决方案:
-
要接受新的权限,您应该已经收到由 Bitbucket
notifications-noreply@bitbucket.org发送的标题为需要采取行动 - AWS CodeStar 的范围已更改的任何电子邮件。该电子邮件包含一个链接,用于向 webhook 授予对现有 CodeConnections Bitbucket 应用程序安装的权限。 -
如果您找不到该电子邮件,则可以通过导航到
https://bitbucket.org/site/addons/reauthorize?account=或<workspace-name>&addon_key=aws-codestarhttps://bitbucket.org/site/addons/reauthorize?addon_key=aws-codestar,并选择要向 webhook 授予相关权限的工作区来授予权限。
错误:使用 Ubuntu 安装命令构建时出现“Sorry, no terminal at all requested - can't get input”
问题:如果您正在运行 GPU 容器有特权的构建,则可能要按照以下过程amazonlinux 和 ubuntu 精选映像中使用 nvidia-container-toolkit 预安装和配置 docker。按照此过程操作将导致使用 Ubuntu 安装命令进行构建时失败,并出现以下错误:
Running command curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor --no-tty -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg gpg: Sorry, no terminal at all requested - can't get input curl: (23) Failed writing body
可能的原因:gpg 键已存在于同一位置。
建议的解决方案:映像中已安装了 nvidia-container-toolkit。如果您看到这个错误,则可以跳过安装并在 buildspec 中重启 docker 进程。