我有以下 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 中??
您上传用于创建 CodeCommit 存储库的资产会在每次更新时覆盖存储库文件。
创建 CodeCommit 存储库后,您无法更改其内容,因此对
code
属性的任何后续更改都将被忽略。相反,每当您的代码资产发生更改时,您的 BucketDeployment
构造都会删除存储桶中的任何现有文件并将其替换为您的资产。将 prune
设置为 false 以禁用此行为。