Copy packages between repositories
You can copy package versions from one repository to another in CodeArtifact. This can be helpful for scenarios such as package promotion workflows or sharing package versions between teams or projects. The source and destination repositories must be in the same domain to copy package versions.
Required IAM permissions to copy packages
To copy package versions in CodeArtifact, the calling user must have the required IAM permissions and the resource-based policy attached to the source and destination repositories must have the required permissions. For more information about resource-based permissions policies and CodeArtifact repositories, see Repository policies.
The user calling copy-package-versions
must have the ReadFromRepository
permission on the source repository and the CopyPackageVersions
permission on the destination repository.
The source repository must have the ReadFromRepository
permission and the destination repository must have the CopyPackageVersions
permission assigned to the IAM account or user copying packages. The following policies are example
repository policies to be added to the source repository or destination repository with the put-repository-permissions-policy
command. Replace 111122223333
with the ID of the
account calling copy-package-versions
.
Note
Calling put-repository-permissions-policy
will replace the current repository policy if one exists. You can use the get-repository-permissions-policy
command to see if a policy exists, for more information see Read a policy. If a
policy does exist, you may want to add these permissions to it instead of replacing it.
Example source repository permissions policy
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
111122223333
:root" }, "Resource": "*" } ] }
Example destination repository permissions policy
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:CopyPackageVersions" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
111122223333
:root" }, "Resource": "*" } ] }
Copy package versions
Use the copy-package-versions
command in CodeArtifact to copy one or more package
versions from a source repository to a destination repository in the same domain. The following example
will copy versions 6.0.2 and 4.0.0 of an npm package named my-package
from the my_repo
repository to the repo-2
repository.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
--source-repositorymy_repo
\ --destination-repositoryrepo-2
--packagemy-package
--format npm \ --versions6.0.2 4.0.0
You can copy multiple versions of the same package name in a single operation. To copy versions of different
package names, you must call copy-package-versions
for each one.
The previous command will produce the following output, assuming both versions could be copied successfully.
{ "successfulVersions": { "6.0.2": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, "4.0.0": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" } }, "failedVersions": {} }
Copy a package from upstream repositories
Normally, copy-package-versions
only looks in the repository specified by
the --source-repository
option for versions to copy. However, you can copy
versions from both the source repository and its upstream repositories by using the
--include-from-upstream
option. If you use the CodeArtifact SDK, call the
CopyPackageVersions
API with the includeFromUpstream
parameter set to true.
For more information, see Working with upstream repositories in CodeArtifact.
Copy a scoped npm package
To copy an npm package version in a scope, use the --namespace
option to
specify the scope. For example, to copy the package @types/react
, use --namespace types
. The @
symbol must be omitted when using --namespace
.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
--source-repositoryrepo-1
\ --destination-repositoryrepo-2
--format npm --namespacetypes
\ --packagereact
--versions0.12.2
Copy Maven package versions
To copy Maven package versions between repositories, specify the package to copy
by passing the Maven group ID with the --namespace
option and the Maven artifactID with
the --name
option. For example, to copy a single version of com.google.guava:guava
:
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
\ --source-repositorymy_repo
--destination-repositoryrepo-2
--format maven --namespacecom.google.guava
\ --packageguava
--versions27.1-jre
If the package version is copied successfully, the output will be similar to the following.
{ "successfulVersions": { "27.1-jre": { "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" } }, "failedVersions": {} }
Versions that do not exist in the source repository
If you specify a version that does not exist in the source repository, the copy will fail.
If some versions exist in the source repository and some do not, all versions will fail to copy.
In the following example, version 0.2.0 of the array-unique
npm package is present in the source
repository, but version 5.6.7 is not:
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
\ --source-repositorymy_repo
--destination-repositoryrepo-2
--format npm \ --packagearray-unique
--versions0.2.0 5.6.7
The output in this scenario will be similar to the following.
{ "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" } } }
The SKIPPED
error code is used to indicate that the version was not copied to the destination
repository because another version was not able to be copied.
Versions that already exist in the destination repository
When a package version is copied to a repository where it already exists, CodeArtifact compares its package assets and package version level metadata in the two repositories.
If the package version assets and metadata are identical in the source and destination
repositories, a copy is not performed but the operation is considered successful. This means
that copy-package-versions
is idempotent. When this occurs, the version that
was already present in both the source and destination repositories will not be listed in
the output of copy-package-versions
.
In the following example, two versions of the npm package array-unique
are present in the source
repository repo-1
. Version 0.2.1 is also present in the destination repository dest-repo
and
version 0.2.0 is not.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
\ --source-repositorymy_repo
--destination-repositoryrepo-2
--format npm --packagearray-unique
\ --versions0.2.1 0.2.0
The output in this scenario will be similar to the following.
{ "successfulVersions": { "0.2.0": { "revision": "Yad+B1QcBq2kdEVrx1E1vSfHJVh8Pr61hBUkoWPGWX0=", "status": "Published" } }, "failedVersions": {} }
Version 0.2.0 is listed in successfulVersions
because it was successfully copied from the source to
destination repository. Version 0.2.1 is not shown in the output as it was already present in the destination repository.
If the package version assets or metadata differ in the source and destination
repositories, the copy operation will fail. You can use the --allow-overwrite
parameter to force an overwrite.
If some versions exist in the destination repository and some do not, all versions will fail to copy.
In the following example, version 0.3.2 of the array-unique
npm package is present in both the source and
destination repositories, but the contents of the package version are different. Version 0.2.1 is present
in the source repository but not the destination.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
\ --source-repositorymy_repo
--destination-repositoryrepo-2
--format npm --packagearray-unique
\ --versions0.3.2 0.2.1
The output in this scenario will be similar to the following.
{ "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" } } }
Version 0.2.1 is marked as SKIPPED
because it was not copied to the
destination repository. Is was not copied because the copy of version 0.3.2 failed because
it was already present in the destination repository, but not identical in the source and destination repositories.
Specifying a package version revision
A package version revision is a string that specifies a specific set of assets and metadata for
a package version. You can specify a package version revision to copy package versions that
are in a specific state. To specify a package version revision, use the --version-revisions
parameter to pass one or more comma-separated package version and the package version revision pairs to the
copy-package-versions
command.
Note
You must specify the --versions
or the --version-revisions
parameter with copy-package-versions
. You cannot specify both.
The following example will only copy version 0.3.2 of the package my-package
if it is present in the source repository with package version revision REVISION-1-SAMPLE-6C81EFF7DA55CC
.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
--source-repositoryrepo-1
\ --destination-repositoryrepo-2
--format npm --namespacemy-namespace
\ --packagemy-package
--version-revisions0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC
The following example copies two versions of package my-package
, 0.3.2 and 0.3.13. The copy will only
succeed if in the source repository version 0.3.2 of my-package
has revision REVISION-1-SAMPLE-6C81EFF7DA55CC
and version 0.3.13 has revision REVISION-2-SAMPLE-55C752BEE772FC
.
aws codeartifact copy-package-versions --domain
my_domain
--domain-owner111122223333
--source-repositoryrepo-1
\ --destination-repositoryrepo-2
--format npm --namespacemy-namespace
\ --packagemy-package
--version-revisions0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC
,0.3.13=REVISION-2-SAMPLE-55C752BEE772FC
To find the revisions of a package version, use the describe-package-version
or the
list-package-versions
command.
For more information, see Package version revision and CopyPackageVersion in the CodeArtifact API Reference.
Copy npm packages
For more information about copy-package-versions
behavior with npm
packages, see npm tags and the CopyPackageVersions
API.