mirror of
https://github.com/hanzoai/next.js.git
synced 2026-10-30 14:46:38 +00:00
<!-- Thanks for opening a PR! Your contribution is much appreciated. To make sure your PR is handled as smoothly as possible we request that you follow the checklist sections below. Choose the right checklist for the change(s) that you're making: ## For Contributors ### Improving Documentation - Run `pnpm prettier-fix` to fix formatting issues before opening the PR. - Read the Docs Contribution Guide to ensure your contribution follows the docs guidelines: https://nextjs.org/docs/community/contribution-guide ### Adding or Updating Examples - The "examples guidelines" are followed from our contributing doc https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md - Make sure the linting passes by running `pnpm build && pnpm lint`. See https://github.com/vercel/next.js/blob/canary/contributing/repository/linting.md ### Fixing a bug - Related issues linked using `fixes #number` - Tests added. See: https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs - Errors have a helpful link attached, see https://github.com/vercel/next.js/blob/canary/contributing.md ### Adding a feature - Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. (A discussion must be opened, see https://github.com/vercel/next.js/discussions/new?category=ideas) - Related issues/discussions are linked using `fixes #number` - e2e tests added (https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs) - Documentation added - Telemetry added. In case of a feature if it's used or not. - Errors have a helpful link attached, see https://github.com/vercel/next.js/blob/canary/contributing.md ## For Maintainers - Minimal description (aim for explaining to someone not on the team to understand the PR) - When linking to a Slack thread, you might want to share details of the conclusion - Link both the Linear (Fixes NEXT-xxx) and the GitHub issues - Add review comments if necessary to explain to the reviewer the logic behind a change ### What? ### Why? ### How? Closes NEXT- Fixes # --> GitHub is [planning to upgrade to Node 20](https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/). Versions prior to actions/cache v3 use an outdated version of node, so we will upgrade to actions/cache v4, where [Node 20 is the default](https://github.com/actions/cache/releases/tag/v4.0.0). Co-authored-by: JJ Kasper <[email protected]>
169 lines
4.7 KiB
Plaintext
169 lines
4.7 KiB
Plaintext
---
|
|
title: Continuous Integration (CI) Build Caching
|
|
description: Learn how to configure CI to cache Next.js builds
|
|
---
|
|
|
|
To improve build performance, Next.js saves a cache to `.next/cache` that is shared between builds.
|
|
|
|
To take advantage of this cache in Continuous Integration (CI) environments, your CI workflow will need to be configured to correctly persist the cache between builds.
|
|
|
|
> If your CI is not configured to persist `.next/cache` between builds, you may see a [No Cache Detected](/docs/messages/no-cache) error.
|
|
|
|
Here are some example cache configurations for common CI providers:
|
|
|
|
## Vercel
|
|
|
|
Next.js caching is automatically configured for you. There's no action required on your part.
|
|
|
|
## CircleCI
|
|
|
|
Edit your `save_cache` step in `.circleci/config.yml` to include `.next/cache`:
|
|
|
|
```yaml
|
|
steps:
|
|
- save_cache:
|
|
key: dependency-cache-{{ checksum "yarn.lock" }}
|
|
paths:
|
|
- ./node_modules
|
|
- ./.next/cache
|
|
```
|
|
|
|
If you do not have a `save_cache` key, please follow CircleCI's [documentation on setting up build caching](https://circleci.com/docs/2.0/caching/).
|
|
|
|
## Travis CI
|
|
|
|
Add or merge the following into your `.travis.yml`:
|
|
|
|
```yaml
|
|
cache:
|
|
directories:
|
|
- $HOME/.cache/yarn
|
|
- node_modules
|
|
- .next/cache
|
|
```
|
|
|
|
## GitLab CI
|
|
|
|
Add or merge the following into your `.gitlab-ci.yml`:
|
|
|
|
```yaml
|
|
cache:
|
|
key: ${CI_COMMIT_REF_SLUG}
|
|
paths:
|
|
- node_modules/
|
|
- .next/cache/
|
|
```
|
|
|
|
## Netlify CI
|
|
|
|
Use [Netlify Plugins](https://www.netlify.com/products/build/plugins/) with [`@netlify/plugin-nextjs`](https://www.npmjs.com/package/@netlify/plugin-nextjs).
|
|
|
|
## AWS CodeBuild
|
|
|
|
Add (or merge in) the following to your `buildspec.yml`:
|
|
|
|
```yaml
|
|
cache:
|
|
paths:
|
|
- 'node_modules/**/*' # Cache `node_modules` for faster `yarn` or `npm i`
|
|
- '.next/cache/**/*' # Cache Next.js for faster application rebuilds
|
|
```
|
|
|
|
## GitHub Actions
|
|
|
|
Using GitHub's [actions/cache](https://github.com/actions/cache), add the following step in your workflow file:
|
|
|
|
```yaml
|
|
uses: actions/cache@v4
|
|
with:
|
|
# See here for caching with `yarn` https://github.com/actions/cache/blob/main/examples.md#node---yarn or you can leverage caching with actions/setup-node https://github.com/actions/setup-node
|
|
path: |
|
|
~/.npm
|
|
${{ github.workspace }}/.next/cache
|
|
# Generate a new cache whenever packages or source files change.
|
|
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
|
|
# If source files changed but packages didn't, rebuild from a prior cache.
|
|
restore-keys: |
|
|
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
|
|
```
|
|
|
|
## Bitbucket Pipelines
|
|
|
|
Add or merge the following into your `bitbucket-pipelines.yml` at the top level (same level as `pipelines`):
|
|
|
|
```yaml
|
|
definitions:
|
|
caches:
|
|
nextcache: .next/cache
|
|
```
|
|
|
|
Then reference it in the `caches` section of your pipeline's `step`:
|
|
|
|
```yaml
|
|
- step:
|
|
name: your_step_name
|
|
caches:
|
|
- node
|
|
- nextcache
|
|
```
|
|
|
|
## Heroku
|
|
|
|
Using Heroku's [custom cache](https://devcenter.heroku.com/articles/nodejs-support#custom-caching), add a `cacheDirectories` array in your top-level package.json:
|
|
|
|
```javascript
|
|
"cacheDirectories": [".next/cache"]
|
|
```
|
|
|
|
## Azure Pipelines
|
|
|
|
Using Azure Pipelines' [Cache task](https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/cache), add the following task to your pipeline yaml file somewhere prior to the task that executes `next build`:
|
|
|
|
```yaml
|
|
- task: Cache@2
|
|
displayName: 'Cache .next/cache'
|
|
inputs:
|
|
key: next | $(Agent.OS) | yarn.lock
|
|
path: '$(System.DefaultWorkingDirectory)/.next/cache'
|
|
```
|
|
|
|
## Jenkins (Pipeline)
|
|
|
|
Using Jenkins' [Job Cacher](https://www.jenkins.io/doc/pipeline/steps/jobcacher/) plugin, add the following build step to your `Jenkinsfile` where you would normally run `next build` or `npm install`:
|
|
|
|
```yaml
|
|
stage("Restore npm packages") {
|
|
steps {
|
|
// Writes lock-file to cache based on the GIT_COMMIT hash
|
|
writeFile file: "next-lock.cache", text: "$GIT_COMMIT"
|
|
|
|
cache(caches: [
|
|
arbitraryFileCache(
|
|
path: "node_modules",
|
|
includes: "**/*",
|
|
cacheValidityDecidingFile: "package-lock.json"
|
|
)
|
|
]) {
|
|
sh "npm install"
|
|
}
|
|
}
|
|
}
|
|
stage("Build") {
|
|
steps {
|
|
// Writes lock-file to cache based on the GIT_COMMIT hash
|
|
writeFile file: "next-lock.cache", text: "$GIT_COMMIT"
|
|
|
|
cache(caches: [
|
|
arbitraryFileCache(
|
|
path: ".next/cache",
|
|
includes: "**/*",
|
|
cacheValidityDecidingFile: "next-lock.cache"
|
|
)
|
|
]) {
|
|
// aka `next build`
|
|
sh "npm run build"
|
|
}
|
|
}
|
|
}
|
|
```
|