docs: adds circleci documentation (#1873)
This pull request updates the npm documentation to add support for CircleCI as a trusted publisher, alongside GitHub Actions and GitLab CI/CD. It provides instructions and configuration details for setting up trusted publishing with CircleCI, clarifies the provenance generation limitations for CircleCI, and updates troubleshooting and reference sections accordingly. --------- Co-authored-by: Di Hei <dhei@github.com>
Michael Smith committed
Mar 4, 2026 at 11:57 UTC
b8fe40fc5a6053b00b3032bca9fc786e1468e8f9
5 files changed
+66
-6
content/nav.yml
+1
-2
@@ -1788,8 +1788,7 @@
1788
description: Manage your authentication tokens
1789
- title: npm trust
1790
url: /cli/v11/commands/npm-trust
1791
- description: Manage trusted publishing relationships between packages and CI/CD
1792
- providers
1791
+ description: Manage trusted publishing relationships between packages and CI/CD providers
1792
- title: npm undeprecate
1793
url: /cli/v11/commands/npm-undeprecate
1794
description: Undeprecate a version of a package
content/packages-and-modules/contributing-packages-to-the-registry/creating-and-publishing-unscoped-public-packages.mdx
+1
-1
@@ -83,7 +83,7 @@ For more information, see the npm documentation on [requiring 2FA for package pu
83
84
<Note>
85
86
- **Note:** If you use GitHub Actions or GitLab CI/CD to publish your packages, consider using [trusted publishing](/trusted-publishers) for enhanced security. Trusted publishing automatically generates provenance information and eliminates the need for access tokens in your CI/CD workflows. For more information, see "[Generating provenance statements][provenance-how-to]."
86
+ **Note:** If you use GitHub Actions, GitLab CI/CD, or CircleCI to publish your packages, consider using [trusted publishing](/trusted-publishers) for enhanced security. Trusted publishing eliminates the need for access tokens in your CI/CD workflows. For GitHub Actions and GitLab CI/CD, it also automatically generates provenance information. For more information, see "[Generating provenance statements][provenance-how-to]."
87
88
</Note>
89
content/packages-and-modules/securing-your-code/trusted-publishers.mdx
+64
-3
@@ -22,6 +22,7 @@ Trusted publishing currently supports:
22
23
- [GitHub Actions](https://github.com/features/actions) (GitHub-hosted runners)
24
- [GitLab CI/CD Pipelines](https://docs.gitlab.com/ci/pipelines/) (GitLab.com shared runners)
25
+- [CircleCI](https://circleci.com/) (CircleCI cloud)
26
27
Self-hosted runners are not currently supported but are planned for future releases.
28
@@ -29,7 +30,7 @@ Self-hosted runners are not currently supported but are planned for future relea
30
31
### Step 1: Add a trusted publisher on npmjs.com
32
32
-Navigate to your package settings on [npmjs.com](https://www.npmjs.com) and find the "**Trusted Publisher**" section. Under "**Select your publisher**", choose your CI/CD provider by clicking either the GitHub Actions or GitLab CI/CD button.
33
+Navigate to your package settings on [npmjs.com](https://www.npmjs.com) and find the "**Trusted Publisher**" section. Under "**Select your publisher**", choose your CI/CD provider by clicking the GitHub Actions, GitLab CI/CD, or CircleCI button.
34
35
<Screenshot src="/packages-and-modules/securing-your-code/trusted-publisher.png" alt="Screenshot showing the Trusted Publisher section with Select your publisher label and provider buttons" />
36
@@ -59,6 +60,18 @@ Configure the following fields:
60
61
<Screenshot src="/packages-and-modules/securing-your-code/trusted-publisher-gitlab.png" alt="Screenshot of GitLab CI/CD trusted publisher configuration form" />
62
63
+#### For CircleCI
64
+
65
+Configure the following fields:
66
+
67
+- **Organization ID** (required): Your CircleCI organization ID (UUID format). You may find it from your CircleCI Organization Settings Overview page.
68
+- **Project ID** (required): Your CircleCI project ID (UUID format). You may find it from your CircleCI Project Settings Overview page.
69
+- **Pipeline definition ID** (required): The pipeline definition ID (UUID format). You may find it from your CircleCI Project Settings under Project Setup page.
70
+- **VCS origin** (required): The VCS origin URL for your project (e.g., `github.com/myorg/myrepo`)
71
+- **Context IDs** (optional): Restrict publishing to jobs using specific CircleCI contexts. You may find them from your CircleCI Organization Settings Contexts.
72
+
73
+<Screenshot src="/packages-and-modules/securing-your-code/trusted-publisher-circleci.png" alt="Screenshot of CircleCI trusted publisher configuration form" />
74
+
75
<Note>
76
77
**Note:** Each package can only have one trusted publisher configured at a time.
@@ -145,6 +158,47 @@ The `id_tokens` configuration tells GitLab to generate an OIDC token for npm. Le
158
159
</Note>
160
161
+#### CircleCI configuration
162
+
163
+Set the `NPM_ID_TOKEN` environment variable with an OIDC token from CircleCI, and npm CLI handles the token exchange automatically. Here's a complete example:
164
+
165
+```yaml
166
+version: 2.1
167
+
168
+jobs:
169
+ publish:
170
+ docker:
171
+ - image: cimg/node:22.14
172
+ steps:
173
+ - checkout
174
+ - run:
175
+ name: Install dependencies
176
+ command: npm ci
177
+ - run:
178
+ name: Run tests
179
+ command: npm test
180
+ - run:
181
+ name: Build
182
+ command: npm run build --if-present
183
+ - run:
184
+ name: Publish to npm with OIDC
185
+ command: |
186
+ export NPM_ID_TOKEN=$(circleci run oidc get --claims '{"aud": "npm:registry.npmjs.org"}')
187
+ npm publish
188
+
189
+workflows:
190
+ publish:
191
+ jobs:
192
+ - publish:
193
+ filters:
194
+ tags:
195
+ only: /^v.*/
196
+ branches:
197
+ ignore: /.*/
198
+```
199
+
200
+The `circleci run oidc get` command retrieves an OIDC token from CircleCI. When `NPM_ID_TOKEN` is set, the npm CLI automatically exchanges it for a short-lived publish token. Learn more in [CircleCI's OIDC documentation](https://circleci.com/docs/openid-connect-tokens/).
201
+
202
### Managing trusted publisher configurations
203
204
You can modify or remove your trusted publisher configuration at any time through your package settings on [npmjs.com](https://npmjs.com) → Packages → YOUR_PACKAGE → Settings → Trusted publishing. Each package can only have one trusted publisher connection at a time, but this connection can be edited or deleted as needed. To change providers (for example, switching from GitHub Actions to GitLab CI/CD), simply edit your existing configuration and select the new provider. The change takes effect immediately for future publishes. To remove trusted publishing entirely and return to token-based authentication, delete the trusted publisher configuration from your package settings.
@@ -177,7 +231,13 @@ This ensures a smooth transition without disrupting your release process.
231
232
## Automatic provenance generation
233
180
-When you publish using trusted publishing, npm automatically generates and publishes [provenance attestations](./generating-provenance-statements) for your package. This happens by default—you don't need to add the `--provenance` flag to your publish command.
234
+When you publish using trusted publishing from GitHub Actions or GitLab CI/CD, npm automatically generates and publishes [provenance attestations](./generating-provenance-statements) for your package. This happens by default—you don't need to add the `--provenance` flag to your publish command.
235
+
236
+<Note>
237
+
238
+**Note:** Provenance generation is not currently supported for CircleCI. Packages published via CircleCI trusted publishing will not include provenance attestations.
239
+
240
+</Note>
241
242
<Screenshot src="/packages-and-modules/securing-your-code/trusted-publisher-provenance.png" alt="Screenshot showing provenance badge/information on a package page" />
243
@@ -264,7 +324,7 @@ Consider implementing these additional security practices:
324
325
## Troubleshooting
326
267
-If you encounter an "Unable to authenticate" error when publishing, first verify that the workflow filename matches exactly what you configured on [npmjs.com](https://npmjs.com), including the `.yml` extension. All fields are case-sensitive and must be exact. Also ensure you're using GitHub-hosted runners or GitLab.com shared runners, as self-hosted runners are not currently supported. For GitHub Actions specifically, check that the `id-token: write` permission is set in your workflow.
327
+If you encounter an "Unable to authenticate" error when publishing, first verify that the workflow filename matches exactly what you configured on [npmjs.com](https://npmjs.com), including the `.yml` extension. All fields are case-sensitive and must be exact. Also ensure you're using GitHub-hosted runners, GitLab.com shared runners, or CircleCI cloud, as self-hosted runners are not currently supported. For GitHub Actions specifically, check that the `id-token: write` permission is set in your workflow. For CircleCI, verify that your Organization ID, Project ID, and Pipeline definition ID match your CircleCI configuration.
328
329
<Note>
330
@@ -292,4 +352,5 @@ We intend to expand trusted publishing support to additional CI/CD providers and
352
- [OpenSSF Trusted Publishers specification](https://repos.openssf.org/trusted-publishers-for-all-package-repositories)
353
- [GitHub Actions OIDC documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
354
- [GitLab CI/CD OIDC documentation](https://docs.gitlab.com/ee/ci/cloud_services/)
355
+- [CircleCI OIDC documentation](https://circleci.com/docs/openid-connect-tokens/)
356
- [API documentation for exchanging OIDC ID token for npm registry token](https://api-docs.npmjs.com/#tag/registry.npmjs.org/operation/exchangeOidcToken)
static/packages-and-modules/securing-your-code/trusted-publisher-circleci.png
Binary files /dev/null and b/static/packages-and-modules/securing-your-code/trusted-publisher-circleci.png differ
static/packages-and-modules/securing-your-code/trusted-publisher.png
Binary files a/static/packages-and-modules/securing-your-code/trusted-publisher.png and b/static/packages-and-modules/securing-your-code/trusted-publisher.png differ