在存储库之间复制程序包 - CodeArtifact

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在存储库之间复制程序包

您可以在中将软件包版本从一个存储库复制到另一个存储库 CodeArtifact。这对于程序包提升工作流或在团队或项目之间共享程序包版本等场景很有用。要复制程序包版本,源存储库和目标存储库必须位于同一个域中。

复制程序包所需的 IAM 权限

要在中复制软件包版本 CodeArtifact,调用用户必须具有所需的 IAM 权限,并且附加到源存储库和目标存储库的基于资源的策略必须具有所需的权限。有关基于资源的权限策略和 CodeArtifact 存储库的更多信息,请参阅 存储库策略

调用 copy-package-versions 的用户必须具有源存储库的 ReadFromRepository 权限和目标存储库的 CopyPackageVersions 权限。

源存储库必须具有 ReadFromRepository 权限,目标存储库必须具有 CopyPackageVersions 权限,这些权限分配给 IAM 账户或复制程序包的用户。以下策略是使用 put-repository-permissions-policy 命令添加到源存储库或目标存储库的示例存储库策略。将 111122223333 替换为调用 copy-package-versions 的账户的 ID。

注意

调用 put-repository-permissions-policy 会替换当前存储库策略(如果存在策略)。您可以使用 get-repository-permissions-policy 命令来查看是否存在策略,有关更多信息,请参阅读取策略。如果存在策略,则可能需要向策略中添加这些权限,而不是替换策略。

示例源存储库权限策略

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Resource": "*" } ] }

示例目标存储库权限策略

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:CopyPackageVersions" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Resource": "*" } ] }

复制程序包版本

使用中的copy-package-versions命令 CodeArtifact 将一个或多个软件包版本从源存储库复制到同一域中的目标存储库。以下示例会将名为 my-package 的 npm 程序包的 6.0.2 和 4.0.0 版本从 my_repo 存储库复制到 repo-2 存储库。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository my_repo \ --destination-repository repo-2 --package my-package --format npm \ --versions 6.0.2 4.0.0

您可以在单个操作中复制同一程序包名称的多个版本。要复制不同程序包名称的版本,必须为每个版本调用 copy-package-versions

假设可以成功复制两个版本,则上述命令会生成以下输出。

{ "successfulVersions": { "6.0.2": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, "4.0.0": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" } }, "failedVersions": {} }

从上游存储库复制程序包

通常,copy-package-versions 仅在 --source-repository 选项指定的存储库中查找要复制的版本。但是,您可以使用 --include-from-upstream 选项从源存储库及其上游存储库中复制版本。如果您使用 CodeArtifact 软件开发工具包,请在includeFromUpstream参数设置为 true 的情况下调用 CopyPackageVersions API。有关更多信息,请参阅 在中使用上游存储库 CodeArtifact

复制限定范围的 npm 程序包

要复制作用域中的 npm 程序包版本,请使用 --namespace 选项指定作用域。例如,要复制程序包 @types/react,请使用 --namespace types。使用 --namespace 时必须省略 @ 符号。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \ --destination-repository repo-2 --format npm --namespace types \ --package react --versions 0.12.2

复制 Maven 程序包版本

要在存储库之间复制 Maven 程序包版本,请通过使用 --namespace 选项来传递 Maven 组 ID 并使用 --name 选项来传递 Maven artifactID,从而指定要复制的程序包。例如,要复制 com.google.guava:guava 的单个版本:

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \ --source-repository my_repo --destination-repository repo-2 --format maven --namespace com.google.guava \ --package guava --versions 27.1-jre

如果成功复制了程序包版本,则输出将类似于以下内容。

{ "successfulVersions": { "27.1-jre": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" } }, "failedVersions": {} }

源存储库中不存在的版本

如果您指定的版本在源存储库中不存在,则复制会失败。如果源存储库中存在某些版本,而有些版本不存在,则所有版本都将无法复制。在以下示例中,源存储库中存在 array-unique npm 程序包的版本 0.2.0,但不存在版本 5.6.7:

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \ --source-repository my_repo --destination-repository repo-2 --format npm \ --package array-unique --versions 0.2.0 5.6.7

此场景中的输出将类似于以下内容。

{ "successfulVersions": {}, "failedVersions": { "0.2.0": { "errorCode": "SKIPPED", "errorMessage": "Version 0.2.0 was skipped" }, "5.6.7": { "errorCode": "NOT_FOUND", "errorMessage": "Could not find version 5.6.7" } } }

SKIPPED 错误代码用于表示因为无法复制另一个版本,所以未将该版本复制到目标存储库。

目标存储库中已存在的版本

将软件包版本复制到已存在的存储库时,会 CodeArtifact比较两个存储库中的软件包资产和软件包版本级别的元数据。

如果源存储库和目标存储库中的程序包版本资产和元数据相同,则不会执行复制,而是认为该操作已成功。这意味着 copy-package-versions 是幂等的。发生这种情况时,源存储库和目标存储库中已经存在的版本将不会在 copy-package-versions 的输出中列出。

在以下示例中,源存储库 repo-1 中存在 npm 程序包 array-unique 的两个版本。目标存储库 dest-repo 中也存在版本 0.2.1,但不存在版本 0.2.0。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \ --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \ --versions 0.2.1 0.2.0

此场景中的输出将类似于以下内容。

{ "successfulVersions": { "0.2.0": { "revision": "Yad+B1QcBq2kdEVrx1E1vSfHJVh8Pr61hBUkoWPGWX0=", "status": "Published" } }, "failedVersions": {} }

因为版本 0.2.0 已成功地从源存储库复制到目标存储库,所以在 successfulVersions 中列出该版本。因为目标存储库中已经存在版本 0.2.1,所以在输出中未显示该版本。

如果源存储库和目标存储库中的程序包版本资产或元数据不同,则复制操作会失败。您可以使用 --allow-overwrite 参数来强制覆盖。

如果目标存储库中存在某些版本,而有些版本不存在,则所有版本都将无法复制。在以下示例中,源存储库和目标存储库中都存在 array-unique npm 程序包的版本 0.3.2,但程序包版本的内容不同。源存储库中存在版本 0.2.1,但目标存储库中不存在该版本。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \ --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \ --versions 0.3.2 0.2.1

此场景中的输出将类似于以下内容。

{ "successfulVersions": {}, "failedVersions": { "0.2.1": { "errorCode": "SKIPPED", "errorMessage": "Version 0.2.1 was skipped" }, "0.3.2": { "errorCode": "ALREADY_EXISTS", "errorMessage": "Version 0.3.2 already exists" } } }

因为版本 0.2.1 未复制到目标存储库,所以该版本标记为 SKIPPED。因为目标存储库中已经存在版本 0.3.2,但该版本在源存储库和目标存储库中不完全相同,所以该版本复制失败,没有复制该版本。

指定程序包版本修订

程序包版本修订是一个字符串,它为程序包版本指定一组特定的资产和元数据。您可以指定程序包版本修订,用来复制处于特定状态的程序包版本。要指定程序包版本修订,请使用 --version-revisions 参数将一个或多个逗号分隔的程序包版本和程序包版本修订对传递给 copy-package-versions 命令。

注意

必须使用 copy-package-versions 指定 --versions--version-revisions 参数。不能同时指定两者。

仅在源存储库中存在程序包 my-package 的版本 0.3.2,且程序包版本修订为 REVISION-1-SAMPLE-6C81EFF7DA55CC 时,以下示例才会复制该版本。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \ --destination-repository repo-2 --format npm --namespace my-namespace \ --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC

以下示例复制程序包 my-package 的两个版本,即 0.3.2 和 0.3.13。仅当在源存储库中,my-package 的版本 0.3.2 具有修订 REVISION-1-SAMPLE-6C81EFF7DA55CC,且版本 0.3.13 具有修订 REVISION-2-SAMPLE-55C752BEE772FC 时,复制才会成功。

aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \ --destination-repository repo-2 --format npm --namespace my-namespace \ --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC,0.3.13=REVISION-2-SAMPLE-55C752BEE772FC

要查找程序包版本的修订,请使用 describe-package-versionlist-package-versions 命令。

有关更多信息,请参阅 CodeArtifact API 参考CopyPackageVersion中的程序包版本修订和。

复制 npm 程序包

有关 npm 包copy-package-versions行为的更多信息,请参阅 npm 标签和 API。 CopyPackageVersions