AWS CDK 2.63.2 中的 codebuild 阶段失败并出现“指定的密钥不存在错误”

问题描述 投票:0回答:1

我有以下 CDK 代码,用于创建带有 S3 存储桶、codecommit 和 codepipeline 的 CloudFormation 堆栈。

    assets = s3d.BucketDeployment(
    self,
    "codeassets",
    destination_bucket=pipeline_bucket,
    role=reader_role,
    cache_control=[
s3d.CacheControl.from_string(
    "max-age=0,no-cache,no-store,must-revalidate"
)
    ],
    memory_limit=2048,
    sources=[s3d.Source.asset(assetspath)],
)


q = codecommit.CfnRepository(
    scope=self,
    code={
        "branch_name": "main",
        "s3": {"bucket": pipeline_bucket.bucket_name, "key": "code.zip"},
    },
    id="coderepo",
    repository_name=pipeline.repo,
)
q.node.add_dependency(assets)

p = codepipeline.Pipeline(
    scope=self,
    id=f"{pipeline.name}",
    pipeline_name=f"{pipeline.name}",
    restart_execution_on_update=True,
    artifact_bucket=pipeline_bucket,
)
p.node.add_dependency(q)

即使正确添加了依赖项,每次更新 CloudFormation 堆栈后,CodePipeline 阶段都会失败,并出现以下错误。

[Container] 2023/10/17 10:01:14 Waiting for agent ping
[Container] 2023/10/17 10:01:26 Waiting for DOWNLOAD_SOURCE
NoSuchKey: The specified key does not exist.

status code: 404, request id: 3Z90D1YGC46ZQTXZ, host id: sgsg+kiejfbfbhj+sgrf+/sg= for primary source and source version arn:aws:s3:::pipeline-name-us-east-1-63bd58d0/pipeline-name/Artifact_S/SJKGDS

下面提供的是堆栈更新后弹出错误的阶段之一。

源阶段

    p.add_stage(
        stage_name="Source",
        actions=[
            codepipeline_actions.CodeCommitSourceAction(
                action_name="CodeCommit",
                branch="main",
                output=source_artifact,
                trigger=codepipeline_actions.CodeCommitTrigger.EVENTS,
                repository=codecommit.Repository.from_repository_name(
                    self, "source_glue_repo", repository_name=pipeline.repo
                ),
            )
        ],
    )

p.add_stage(
    stage_name="UnitTests",
    actions=[
        codepipeline_actions.CodeBuildAction(
            action_name="UnitTests",
            input=source_artifact,
            project=build_project_run_tests,
            outputs=[build_artifact_run_tests],
        )
    ],
)

    build_artifact_run_tests = codepipeline.Artifact()

当我检查S3时,我什至找不到文件夹“pipeline-name/Artifact_S/”

但是,当我单击 AWS 控制台中管道页面右上角的“发布更改”按钮时,这些工件文件夹将被创建并且管道执行会成功。

在 CodePipeline 阶段 UnitTests 将其用作输入工件之前,如何确保源输出工件位于 S3 中??

python amazon-s3 aws-cdk aws-codepipeline aws-codebuild
1个回答
0
投票

您上传用于创建 CodeCommit 存储库的资产会在每次更新时覆盖存储库文件。

创建 CodeCommit 存储库后,您无法更改其内容,因此对

code
属性的任何后续更改都将被忽略。相反,每当您的代码资产发生更改时,您的
BucketDeployment
构造都会删除存储桶中的任何现有文件并将其替换为您的资产。将
prune
设置为 false 以禁用此行为。

© www.soinside.com 2019 - 2024. All rights reserved.