GitHub Packages: Migrate npm Packages Between GitHub Instances
Migrating npm packages stored in GitHub Packages from one instance to another
Overview
I have been working with more customers who are migrating GitHub instances and want to be able to migrate GitHub Packages. There is not an easy lift-and-shift approach to migrate GitHub Packages between instances; each ecosystem is independent. To go along with my NuGet solution, I also scripted out the npm package migration. Take a look and let me know what you think!
See my other GitHub Package –> GitHub Package migration posts:
The script
The script can be found in my github-misc-scripts repo here:
Running the script
Prerequisites
gh cli
installed- Set the source GitHub PAT env var:
export GH_SOURCE_PAT=ghp_abc
(must have at leastread:packages
,read:org
scope) - Set the target GitHub PAT env var:
export GH_TARGET_PAT=ghp_xyz
(must have at leastwrite:packages
,read:org
scope)
Notes:
- This script assumes that the target org’s repo name is the same as the source
- If the repo doesn’t exist, the package will still import but won’t be mapped to a repo
Usage
You can call the script via:
1
2
3
4
5
6
./migrate-npm-packages-between-github-instances.sh \
<source-org> \
<source-host> \
<target-org> \
<target-host> \
| tee output.log
The
| tee output.log
will print the output to the console and also save it to a file. You can refer back to the log file later and search for errors.
Example
An example of this in practice:
1
2
3
4
5
6
7
8
9
export GH_SOURCE_PAT=ghp_abc
export GH_TARGET_PAT=ghp_xyz
./migrate-npm-packages-between-github-instances.sh \
joshjohanning-org \
github.com \
joshjohanning-org-packages \
github.com \
| tee output.log
Notes
- This script assumes that the target org’s repo name is the same as the source
- If the repo doesn’t exist, the package will still import but won’t be mapped to a repo
- This script uses RegEx to find/replace source org with target org in the package’s
package.json
(see the GitHub docs for more info) - To clean up the working directory when done, run this one-liner:
1
rm -rf ./temp
Improvement Ideas
- Add a source folder input instead of relying on current directory (just using
./temp
) - Map between repositories where the target repo is named differently than the source repo (likely this isn’t needed since if repo doesn’t exist, packages will still be pushed, the package just won’t be linked to a repository)
- Update script because of GitHub Packages GraphQL deprecation
Summary
Drop a comment here or an issue or PR on my github-misc-scripts repo if you have any feedback or suggestions! Happy packaging! 📦