instruction: How do you create a custom composite action in GitHub Actions?
output: GitHub - actions/setup-node: Set up your GitHub Actions workflow with a specific version of node.js Skip to content Navigation Menu Toggle navigation Sign in Appearance settings Product GitHub Copilot Write better code with AI GitHub Spark New Build and deploy intelligent apps GitHub Models New Manage and compare prompts GitHub Advanced Security Find and fix vulnerabilities Actions Automate any workflow Codespaces Instant dev environments Issues Plan and track work Code Review Manage code changes Discussions Collaborate outside of code Code Search Find more, search less Explore Why GitHub All features Documentation GitHub Skills Blog Solutions By company size Enterprises Small and medium teams Startups Nonprofits By use case DevSecOps DevOps CI/CD View all use cases By industry Healthcare Financial services Manufacturing Government View all industries View all solutions Resources Topics AI DevOps Security Software Development View all Explore Learning Pathways Events &amp; Webinars Ebooks &amp; Whitepapers Customer Stories Partners Executive Insights Open Source GitHub Sponsors Fund open source developers The ReadME Project GitHub community articles Repositories Topics Trending Collections Enterprise Enterprise platform AI-powered developer platform Available add-ons GitHub Advanced Security Enterprise-grade security features Copilot for business Enterprise-grade AI features Premium Support Enterprise-grade 24/7 support Pricing Search or jump to... Search code, repositories, users, issues, pull requests... --> Search Clear Search syntax tips Provide feedback --> We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly --> Name Query To see all available qualifiers, see our documentation . Cancel Create saved search Sign in Sign up Appearance settings Resetting focus You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} actions / setup-node Public Notifications You must be signed in to change notification settings Fork 1.5k Star 4.3k Set up your GitHub Actions workflow with a specific version of node.js License MIT license 4.3k stars 1.5k forks Branches Tags Activity Star Notifications You must be signed in to change notification settings Code Issues 51 Pull requests 40 Actions Projects 0 Security Uh oh! There was an error while loading. Please reload this page . Insights Additional navigation options Code Issues Pull requests Actions Projects Security Insights actions/setup-node Use this GitHub action with your project Add this Action to an existing workflow or create a new one View on Marketplace main Branches Tags Go to file Code Open more actions menu Folders and files Name Name Last commit message Last commit date Latest commit History 438 Commits .github .github .licenses/ npm .licenses/ npm .vscode .vscode __tests__ __tests__ dist dist docs docs externals externals src src .eslintignore .eslintignore .eslintrc.js .eslintrc.js .gitattributes .gitattributes .gitignore .gitignore .licensed.yml .licensed.yml .prettierignore .prettierignore .prettierrc.js .prettierrc.js CODEOWNERS CODEOWNERS CODE_OF_CONDUCT.md CODE_OF_CONDUCT.md LICENSE LICENSE README.md README.md action.yml action.yml jest.config.js jest.config.js package-lock.json package-lock.json package.json package.json tsconfig.json tsconfig.json View all files Repository files navigation README Code of conduct MIT license Security setup-node This action provides the following functionality for GitHub Actions users: Optionally downloading and caching distribution of the requested Node.js version, and adding it to the PATH Optionally caching npm/yarn/pnpm dependencies Registering problem matchers for error output Configuring authentication for GPR or npm Usage See action.yml - uses : actions/setup-node@v4 with : # Version Spec of the version to use in SemVer notation. # It also admits such aliases as lts/*, latest, nightly and canary builds # Examples: 12.x, 10.15.1, &gt;=10.15.0, lts/Hydrogen, 16-nightly, latest, node node-version : ' ' # File containing the version Spec of the version to use. Examples: package.json, .nvmrc, .node-version, .tool-versions. # If node-version and node-version-file are both provided the action will use version from node-version. node-version-file : ' ' # Set this option if you want the action to check for the latest available version # that satisfies the version spec. # It will only get affect for lts Nodejs versions (12.x, &gt;=10.15.0, lts/Hydrogen). # Default: false check-latest : false # Target architecture for Node to use. Examples: x86, x64. Will use system architecture by default. # Default: ''. The action use system architecture by default architecture : ' ' # Used to pull node distributions from https://github.com/actions/node-versions. # Since there's a default, this is typically not supplied by the user. # When running this action on github.com, the default value is sufficient. # When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting. # # We recommend using a service account with the least permissions necessary. Also # when generating a new PAT, select the least scopes necessary. # # [Learn more about creating and using encrypted secrets](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) # # Default: ${{ github.server_url == 'https://github.com' &amp;&amp; github.token || '' }} token : ' ' # Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm. # Package manager should be pre-installed # Default: '' cache : ' ' # Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. # It will generate hash from the target file for primary key. It works only If cache is specified. # Supports wildcards or a list of file names for caching multiple dependencies. # Default: '' cache-dependency-path : ' ' # Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, # and set up auth to read in from env.NODE_AUTH_TOKEN. # Default: '' registry-url : ' ' # Optional scope for authenticating against scoped registries. # Will fall back to the repository owner when using the GitHub Packages registry (https://npm.pkg.github.com/). # Default: '' scope : ' ' # Set always-auth option in npmrc file. # Default: '' always-auth : ' ' # Optional mirror to download binaries from. # Artifacts need to match the official Node.js # Example: # V8 Canaray Build: &lt;mirror_url&gt;/download/v8-canary # RC Build: &lt;mirror_url&gt;/download/rc # Official: Build &lt;mirror_url&gt;/dist # Nightly build: &lt;mirror_url&gt;/download/nightly # Default: '' mirror : ' ' # Optional mirror token. # The token will be used as a bearer token in the Authorization header # Default: '' mirror-token : ' ' Basic: steps : - uses : actions/checkout@v4 - uses : actions/setup-node@v4 with : node-version : 18 - run : npm ci - run : npm test The node-version input is optional. If not supplied, the node version from PATH will be used. However, it is recommended to always specify Node.js version and don't rely on the system one. The action will first check the local cache for a semver match. If unable to find a specific version in the cache, the action will attempt to download a version of Node.js. It will pull LTS versions from node-versions releases and on miss or failure will fall back to the previous behavior of downloading directly from node dist . For information regarding locally cached versions of Node.js on GitHub hosted runners, check out GitHub Actions Runner Images . Supported version syntax The node-version input supports the Semantic Versioning Specification, for more detailed examples please refer to the semver package documentation . Examples: Major versions: 18 , 20 More specific versions: 10.15 , 16.15.1 , 18.4.0 NVM LTS syntax: lts/erbium , lts/fermium , lts/* , lts/-n Latest release: * or latest / current / node Note: Like the other values, * will get the latest locally-cached Node.js version , or the latest version from actions/node-versions , depending on the check-latest input. current / latest / node always resolve to the latest dist version . That version is then downloaded from actions/node-versions if possible, or directly from Node.js if not. Since it will not be cached always, there is possibility of hitting rate limit when downloading from dist Checking in lockfiles It's always recommended to commit the lockfile of your package manager for security and performance reasons. For more information consult the "Working with lockfiles" section of the Advanced usage guide. Caching global packages data The action has a built-in functionality for caching and restoring dependencies. It uses actions/cache under the hood for caching global packages data but requires less configuration settings. Supported package managers are npm , yarn , pnpm (v6.10+). The cache input is optional, and caching is turned off by default. The action defaults to search for the dependency file ( package-lock.json , npm-shrinkwrap.json or yarn.lock ) in the repository root, and uses its hash as a part of the cache key. Use cache-dependency-path for cases when multiple dependency files are used, or they are located in different subdirectories. Note: The action does not cache node_modules See the examples of using cache for yarn / pnpm and cache-dependency-path input in the Advanced usage guide. Caching npm dependencies: steps : - uses : actions/checkout@v4 - uses : actions/setup-node@v4 with : node-version : 20 cache : ' npm ' - run : npm ci - run : npm test Caching npm dependencies in monorepos: steps : - uses : actions/checkout@v4 - uses : actions/setup-node@v4 with : node-version : 20 cache : ' npm ' cache-dependency-path : subdir/package-lock.json - run : npm ci - run : npm test Matrix Testing jobs : build : runs-on : ubuntu-latest strategy : matrix : node : [ 14, 16, 18 ] name : Node ${{ matrix.node }} sample steps : - uses : actions/checkout@v4 - name : Setup node uses : actions/setup-node@v4 with : node-version : ${{ matrix.node }} - run : npm ci - run : npm test Using setup-node on GHES setup-node comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Nodejs distributions, setup-node downloads distributions from actions/node-versions on github.com (outside of the appliance). These calls to actions/node-versions are made via unauthenticated requests, which are limited to 60 requests per hour per IP . If more requests are made within the time frame, then you will start to see rate-limit errors during downloading that looks like: ##[error]API rate limit exceeded for... . After that error the action will try to download versions directly from the official site, but it also can have rate limit so it's better to put token. To get a higher rate limit, you can generate a personal access token on github.com and pass it as the token input for the action: uses : actions/setup-node@v4 with : token : ${{ secrets.GH_DOTCOM_TOKEN }} node-version : 20 If the runner is not able to access github.com, any Nodejs versions requested during a workflow run must come from the runner's tool cache. See " Setting up the tool cache on self-hosted runners without internet access " for more information. Advanced usage Check latest version Using a node version file Using different architectures Using v8 canary versions Using nightly versions Using rc versions Caching packages data Using multiple operating systems and architectures Publishing to npmjs and GPR with npm Publishing to npmjs and GPR with yarn Using private packages Recommended permissions When using the setup-node action in your GitHub Actions workflow, it is recommended to set the following permissions to ensure proper functionality: permissions : contents : read # access to check out code and install dependencies License The scripts and documentation in this project are released under the MIT License Contributions Contributions are welcome! See Contributor's Guide Code of Conduct 👋 Be nice. See our code of conduct About Set up your GitHub Actions workflow with a specific version of node.js Resources Readme License MIT license Code of conduct Code of conduct Security policy Security policy Uh oh! There was an error while loading. Please reload this page . Activity Custom properties Stars 4.3k stars Watchers 126 watching Forks 1.5k forks Report repository Releases 57 v4.4.0 Latest Apr 14, 2025 + 56 releases Packages 0 &nbsp; &nbsp; &nbsp; Uh oh! There was an error while loading. Please reload this page . Used by 2.9m + 2,885,158 Contributors 100 + 86 contributors Languages TypeScript 98.0% JavaScript 1.1% Shell 0.9% Footer &copy; 2025 GitHub,&nbsp;Inc. Footer navigation Terms Privacy Security Status Docs Contact Manage cookies Do not share my personal information You can’t perform that action at this time.