From ec5b04fb82f6f50b1e299b5355f46756e5674d61 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Fri, 19 Jul 2024 13:43:05 -0400 Subject: [PATCH] docs(core): move "nx connect" earlier in CI section for standalone/monorepo tutorials (#26845) We're making an enhancement to `nx g ci-workflow` such that when the workspace is already connected to Nx Cloud, we'll enable distribution in the workflow file, rather than having them commented out. For the flow of the tutorial, it makes more sense to do `nx connect` first so things are set up correctly without user intervention. Note: I left the "Make sure the following line is uncommented" for distribution because older versions will still leave it uncommented. Example: https://nx-dev-git-docs-tutorials-update-nrwl.vercel.app/getting-started/tutorials/angular-monorepo-tutorial --------- Co-authored-by: Isaac Mann --- .../migration/adding-to-existing-project.md | 102 +++++++---- docs/shared/migration/adding-to-monorepo.md | 102 +++++++---- docs/shared/migration/migration-angular.md | 102 +++++++---- docs/shared/tutorials/angular-monorepo.md | 132 +++++++++------ docs/shared/tutorials/angular-standalone.md | 92 ++++++---- .../tutorials/github-cloud-pr-merged.avif | Bin 0 -> 43201 bytes .../tutorials/github-pr-cloud-report.avif | Bin 0 -> 37203 bytes .../gradle-github-pr-cloud-report.avif | Bin 0 -> 35157 bytes docs/shared/tutorials/gradle.md | 108 ++++++++---- docs/shared/tutorials/npm-workspaces.md | 159 ++++++++---------- .../tutorials/nx-cloud-github-connect.avif | Bin 0 -> 30919 bytes .../tutorials/nx-cloud-run-details.avif | Bin 0 -> 18052 bytes docs/shared/tutorials/react-monorepo.md | 132 +++++++++------ docs/shared/tutorials/react-standalone.md | 102 +++++++---- docs/shared/tutorials/vue-standalone.md | 102 +++++++---- 15 files changed, 720 insertions(+), 413 deletions(-) create mode 100644 docs/shared/tutorials/github-cloud-pr-merged.avif create mode 100644 docs/shared/tutorials/github-pr-cloud-report.avif create mode 100644 docs/shared/tutorials/gradle-github-pr-cloud-report.avif create mode 100644 docs/shared/tutorials/nx-cloud-github-connect.avif create mode 100644 docs/shared/tutorials/nx-cloud-run-details.avif diff --git a/docs/shared/migration/adding-to-existing-project.md b/docs/shared/migration/adding-to-existing-project.md index 4a70af7b8f..68f371c06a 100644 --- a/docs/shared/migration/adding-to-existing-project.md +++ b/docs/shared/migration/adding-to-existing-project.md @@ -293,53 +293,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/migration/adding-to-monorepo.md b/docs/shared/migration/adding-to-monorepo.md index 434bf9714a..5644f7c5bf 100644 --- a/docs/shared/migration/adding-to-monorepo.md +++ b/docs/shared/migration/adding-to-monorepo.md @@ -316,53 +316,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/migration/migration-angular.md b/docs/shared/migration/migration-angular.md index f3681781b0..bdc3770006 100644 --- a/docs/shared/migration/migration-angular.md +++ b/docs/shared/migration/migration-angular.md @@ -117,53 +117,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/angular-monorepo.md b/docs/shared/tutorials/angular-monorepo.md index 3f561534a3..11a71904b0 100644 --- a/docs/shared/tutorials/angular-monorepo.md +++ b/docs/shared/tutorials/angular-monorepo.md @@ -60,10 +60,10 @@ NX Let's create a new workspace [https://nx.dev/getting-started/intro] ✔ Default stylesheet format · css ✔ Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)? · No ✔ Test runner to use for end to end (E2E) tests · cypress -✔ Do you want Nx Cloud to make your CI fast? · Yes +✔ Which CI provider would you like to use? · github ``` -Let's name the initial application `angular-store`. In this tutorial we're going to use `cypress` for e2e tests and `css` for styling. The above command generates the following structure: +Let's name the initial application `angular-store`. In this tutorial we're going to use `cypress` for e2e tests and `css` for styling. We'll talk more about how Nx integrates with GitHub Actions later in the tutorial. The above command generates the following structure: ``` └─ angular-monorepo @@ -117,7 +117,7 @@ The [`nx.json` file](/reference/nx-json) contains configuration settings for Nx To serve your new Angular application, just run: ```shell -nx serve angular-store +npx nx serve angular-store ``` Your application should be served at [http://localhost:4200](http://localhost:4200). @@ -315,9 +315,9 @@ Nx allows you to separate this logic into "local libraries". The main benefits i Let's assume our domain areas include `products`, `orders` and some more generic design system components, called `ui`. We can generate a new library for each of these areas using the Angular library generator: ``` -nx g @nx/angular:library products --directory=libs/products --standalone -nx g @nx/angular:library orders --directory=libs/orders --standalone -nx g @nx/angular:library shared-ui --directory=libs/shared/ui --standalone +npx nx g @nx/angular:library products --directory=libs/products --standalone +npx nx g @nx/angular:library orders --directory=libs/orders --standalone +npx nx g @nx/angular:library shared-ui --directory=libs/shared/ui --standalone ``` Note how we type out the full path in the `directory` flag to place the libraries into a subfolder. You can choose whatever folder structure you like to organize your projects. If you change your mind later, you can run the [move generator](/nx-api/workspace/generators/move) to move a project to a different folder. @@ -360,7 +360,7 @@ Running the above commands should lead to the following directory structure: Each of these libraries -- has its own `project.json` file with corresponding targets you can run (e.g. running tests for just orders: `nx test orders`) +- has its own `project.json` file with corresponding targets you can run (e.g. running tests for just orders: `npx nx test orders`) - has the name you specified in the generate command; you can find the name in the corresponding `project.json` file - has a dedicated `index.ts` file which is the "public API" of the library - is mapped in the `tsconfig.base.json` at the root of the workspace @@ -434,7 +434,7 @@ export const appRoutes: Route[] = [ ]; ``` -Serving your app (`nx serve angular-store`) and then navigating to `/products` should give you the following result: +Serving your app (`npx nx serve angular-store`) and then navigating to `/products` should give you the following result: ![products route](/shared/tutorials/app-products-route.png) @@ -493,12 +493,12 @@ export class AppComponent { -Nx automatically detects the dependencies between the various parts of your workspace and builds a [project graph](/features/explore-graph). This graph is used by Nx to perform various optimizations such as determining the correct order of execution when running tasks like `nx build`, identifying [affected projects](/features/run-tasks#run-tasks-on-projects-affected-by-a-pr) and more. Interestingly you can also visualize it. +Nx automatically detects the dependencies between the various parts of your workspace and builds a [project graph](/features/explore-graph). This graph is used by Nx to perform various optimizations such as determining the correct order of execution when running tasks like `npx nx build`, identifying [affected projects](/features/run-tasks#run-tasks-on-projects-affected-by-a-pr) and more. Interestingly you can also visualize it. Just run: ```shell -nx graph +npx nx graph ``` You should be able to see something similar to the following in your browser. @@ -592,7 +592,7 @@ You should be able to see something similar to the following in your browser. Notice how `shared-ui` is not yet connected to anything because we didn't import it in any of our projects. -Exercise for you: change the codebase such that `shared-ui` is used by `orders` and `products`. Note: you need to restart the `nx graph` command to update the graph visualization or run the CLI command with the `--watch` flag. +Exercise for you: change the codebase such that `shared-ui` is used by `orders` and `products`. Note: you need to restart the `npx nx graph` command to update the graph visualization or run the CLI command with the `--watch` flag. ## Testing and Linting @@ -601,9 +601,9 @@ Exercise for you: change the codebase such that `shared-ui` is used by `orders` Our current setup not only has targets for serving and building the Angular application, but also has targets for unit testing, e2e testing and linting. The `test` and `lint` targets are defined in the application `project.json` file, while the `e2e` target is [inferred from the `apps/angular-store-e2e/cypress.config.ts` file](#inferred-tasks). We can use the same syntax as before to run these tasks: ```bash -nx test angular-store # runs the tests for angular-store -nx lint inventory # runs the linter on inventory -nx e2e angular-store-e2e # runs e2e tests for the angular-store +npx nx test angular-store # runs the tests for angular-store +npx nx lint inventory # runs the linter on inventory +npx nx e2e angular-store-e2e # runs e2e tests for the angular-store ``` ### Inferred Tasks @@ -611,7 +611,7 @@ nx e2e angular-store-e2e # runs e2e tests for the angular-store Nx identifies available tasks for your project from [tooling configuration files](/concepts/inferred-tasks), `package.json` scripts and the targets defined in `project.json`. All tasks from the `angular-store` project are defined in its `project.json` file, but the companion `angular-store-e2e` project has its tasks inferred from configuration files. To view the tasks that Nx has detected, look in the [Nx Console](/getting-started/editor-setup), [Project Details View](/recipes/nx-console/console-project-details) or run: ```shell -nx show project angular-store-e2e --web +npx nx show project angular-store-e2e --web ``` {% project-details title="Project Details View" height="100px" %} @@ -873,7 +873,7 @@ You can also override the settings for inferred tasks by modifying the [`targetD In addition to running individual tasks, you can also run multiple tasks in parallel using the following syntax: ```shell -nx run-many -t test lint e2e +npx nx run-many -t test lint e2e ``` ### Caching @@ -882,7 +882,7 @@ One thing to highlight is that Nx is able to [cache the tasks you run](/features Note that all of these targets are automatically cached by Nx. If you re-run a single one or all of them again, you'll see that the task completes immediately. In addition, (as can be seen in the output example below) there will be a note that a matching cache result was found and therefore the task was not run again. -```{% command="nx run-many -t test lint e2e" path="angular-monorepo" %} +```{% command="npx nx run-many -t test lint e2e" path="angular-monorepo" %} ✔ nx run e2e:lint [existing outputs match the cache, left as is] ✔ nx run angular-store:lint [existing outputs match the cache, left as is] ✔ nx run angular-store:test [existing outputs match the cache, left as is] @@ -915,7 +915,7 @@ And then make a small change to the `products` library. One of the key features of Nx in a monorepo setting is that you're able to run tasks only for projects that are actually affected by the code changes that you've made. To run the tests for only the projects affected by this change, run: ```shell -nx affected -t test +npx nx affected -t test ``` Note that the unit tests were run for `products`, `angular-store` and `inventory`, but not for `orders` because a change to `products` can not possibly break the tests for `orders`. In a small repo like this, there isn't a lot of time saved, but as there are more tests and more projects, this quickly becomes an essential command. @@ -923,7 +923,7 @@ Note that the unit tests were run for `products`, `angular-store` and `inventory You can also see what projects are affected in the graph visualizer with; ```shell -nx graph --affected +npx nx graph --affected ``` {% graph height="450px" %} @@ -1062,10 +1062,10 @@ Replace the `command` with whatever terminal command you use to deploy your site The `"dependsOn": "build"` setting tells Nx to make sure that the project's `build` task has been run successfully before the `deploy` task. -With the `deploy` tasks defined, you can deploy a single application with `nx deploy angular-store` or deploy any applications affected by the current changes with: +With the `deploy` tasks defined, you can deploy a single application with `npx nx deploy angular-store` or deploy any applications affected by the current changes with: ```shell -nx affected -t deploy +npx nx affected -t deploy ``` ## Imposing Constraints with Module Boundary Rules @@ -1193,7 +1193,7 @@ export class ProductsComponent {} If you lint your workspace you'll get an error now: -```{% command="nx run-many -t lint" %} +```{% command="npx nx run-many -t lint" %} NX Running target lint for 7 projects ✖ nx run products:lint Linting "products"... @@ -1241,53 +1241,79 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +When we set up the repository at the beginning of this tutorial, we chose to use GitHub Actions as a CI provider. This created a basic CI pipeline and configured Nx Cloud in the repository. It also printed a URL in the terminal to register your repository in your [Nx Cloud](https://cloud.nx.app) account. If you didn't click on the link when first creating your repository, you can show it again by running: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +Once you click the link, follow the steps provided and make sure Nx Cloud is enabled on the main branch of your repository. -### Enable a Distributed CI Pipeline +### Configure Your CI Workflow -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command: + +```shell +npx nx generate ci-workflow ``` +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/angular-standalone.md b/docs/shared/tutorials/angular-standalone.md index 6b4983bdaf..47e058d1c6 100644 --- a/docs/shared/tutorials/angular-standalone.md +++ b/docs/shared/tutorials/angular-standalone.md @@ -43,13 +43,13 @@ NX Let's create a new workspace [https://nx.dev/getting-started/intro] ✔ Default stylesheet format · css ✔ Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)? · No ✔ Test runner to use for end to end (E2E) tests · cypress -✔ Set up CI with caching, distribution and test deflaking · github +✔ Which CI provider would you like to use? · github ``` You get asked a few questions that help Nx preconfigure your new Angular application. These include: - Angular specific questions, such as which bundler to use, whether to enable server-side rendering and which stylesheet format to use -- General Nx questions, such as whether to enable remote caching with Nx Cloud. Nx comes with built-in [local caching](/features/cache-task-results). If you want to benefit from this cache in CI, you can enable [remote caching](/ci/features/remote-cache) which will set up [Nx Cloud](https://nx.app). This is also a prerequisite for enabling [distributed task execution](/ci/features/distribute-task-execution). +- General Nx questions, such as whether to enable remote caching with Nx Cloud. Nx comes with built-in [local caching](/features/cache-task-results). If you want to benefit from this cache in CI, you can enable [remote caching](/ci/features/remote-cache) which will set up [Nx Cloud](https://nx.app). This is also a prerequisite for enabling [distributed task execution](/ci/features/distribute-task-execution). We'll explore this later in the tutorial. For the sake of this tutorial, let's respond to all the questions with the default response. @@ -1050,53 +1050,79 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +When we set up the repository at the beginning of this tutorial, we chose to use GitHub Actions as a CI provider. This created a basic CI pipeline and configured Nx Cloud in the repository. It also printed a URL in the terminal to register your repository in your [Nx Cloud](https://cloud.nx.app) account. If you didn't click on the link when first creating your repository, you can show it again by running: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +Once you click the link, follow the steps provided and make sure Nx Cloud is enabled on the main branch of your repository. -### Enable a Distributed CI Pipeline +### Configure Your CI Workflow -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command: + +```shell +npx nx generate ci-workflow ``` +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/github-cloud-pr-merged.avif b/docs/shared/tutorials/github-cloud-pr-merged.avif new file mode 100644 index 0000000000000000000000000000000000000000..21fd7bff773be33e87760891b9b7d75595b3b1c4 GIT binary patch literal 43201 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®FUoGaJ#1d&0z9Q%RSPE*b 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

?lZ12hl>)=*kXDV5_Hw1LJgM2h9sRY^apK$TqL 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 literal 0 HcmV?d00001 diff --git a/docs/shared/tutorials/gradle-github-pr-cloud-report.avif b/docs/shared/tutorials/gradle-github-pr-cloud-report.avif new file mode 100644 index 0000000000000000000000000000000000000000..124180647be4a732710d92921a9439800b8280ab GIT binary patch literal 35157 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 Rgt#r!w}NHc$cx#$GY|m_JPrT= literal 0 HcmV?d00001 diff --git a/docs/shared/tutorials/gradle.md b/docs/shared/tutorials/gradle.md index fe4039eb86..aaf3e945d3 100644 --- a/docs/shared/tutorials/gradle.md +++ b/docs/shared/tutorials/gradle.md @@ -269,55 +269,97 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -# Connect your workspace on nx.app and uncomment this to enable task distribution. -# The "--stop-agents-after" is optional, but allows idle agents to shut down once the "build" targets have been requested -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-jvm" --stop-agents-after="build" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Let's create a branch to add a CI workflow. + +```shell +git checkout -b add-workflow +``` + +And use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/gradle-github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + ![Gradle run details](/shared/tutorials/gradle-run-details.webp) For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: diff --git a/docs/shared/tutorials/npm-workspaces.md b/docs/shared/tutorials/npm-workspaces.md index b4c95e9fab..5663831a84 100644 --- a/docs/shared/tutorials/npm-workspaces.md +++ b/docs/shared/tutorials/npm-workspaces.md @@ -49,35 +49,8 @@ Now let's try running some tasks. To lint the `demo` app, use the `lint` npm scr If you try to build the `demo` app, it will fail. -```text {% command="npm run build -w @tuskdesign/demo" path="~/tuskydesigns" %} -> @tuskdesign/demo@0.0.0 prebuild -> npm run typecheck - -> @tuskdesign/demo@0.0.0 typecheck -> tsc - -> @tuskdesign/demo@0.0.0 build -> vite build - -vite v5.0.12 building for production... -✓ 4 modules transformed. -[commonjs--resolver] Failed to resolve entry for package "@tuskdesign/buttons". The package may have incorrect main/module/exports specified in its package.json. -error during build: +```text Error: Failed to resolve entry for package "@tuskdesign/buttons". The package may have incorrect main/module/exports specified in its package.json. - at packageEntryFailure (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/dist/node/chunks/dep-9A4-l-43.js:29443:17) - at resolvePackageEntry (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/dist/node/chunks/dep-9A4-l-43.js:29440:5) - at tryNodeResolve (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/dist/node/chunks/dep-9A4-l-43.js:29210:20) - at Object.resolveId (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/dist/node/chunks/dep-9A4-l-43.js:28978:28) - at file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/node_modules/rollup/dist/es/shared/node-entry.js:19579:40 - at async PluginDriver.hookFirstAndGetPlugin (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/node_modules/rollup/dist/es/shared/node-entry.js:19479:28) - at async resolveId (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/node_modules/rollup/dist/es/shared/node-entry.js:18149:26) - at async ModuleLoader.resolveId (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/node_modules/rollup/dist/es/shared/node-entry.js:18563:15) - at async Object.resolveId (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/dist/node/chunks/dep-9A4-l-43.js:8141:10) - at async PluginDriver.hookFirstAndGetPlugin (file:///Users/isaac/Documents/code/tuskydesign/node_modules/vite/node_modules/rollup/dist/es/shared/node-entry.js:19479:28) -npm ERR! Lifecycle script `build` failed with error: -npm ERR! Error: command failed -npm ERR! in workspace: @tuskdesign/demo@0.0.0 -npm ERR! at location: /Users/isaac/Documents/code/tuskydesign/apps/demo ``` The `build` script fails because it needs the `buttons` and `forms` projects to be built first in order to work correctly. To do this, lets return to the root of the repository and run the `build` task for every project in the repo: @@ -115,38 +88,12 @@ Second, the script asks a series of questions to help set up caching for you. - `Does the "lint" script create any outputs?` - Enter nothing - `Would you like remote caching to make your build faster?` - Choose `Skip for now` -```text {% command="npx nx@latest init" path="~/tuskydesigns" %} - NX Recommended Plugins: - -Add these Nx plugins to integrate with the tools used in your workspace. - -✔ Which plugins would you like to add? · No items were selected - - NX 🐳 Nx initialization - - NX 🧑‍🔧 Please answer the following questions about the scripts found in your workspace in order to generate task runner configuration - -✔ Which scripts need to be run in order? (e.g. before building a project, dependent projects must be built) · build -✔ Which scripts are cacheable? (Produce the same output given the same input, e.g. build, test and lint usually are, serve and start are not) · typecheck, build, lint -✔ Does the "typecheck" script create any outputs? If not, leave blank, otherwise provide a path relative to a project root (e.g. dist, lib, build, coverage) · -✔ Does the "build" script create any outputs? If not, leave blank, otherwise provide a path relative to a project root (e.g. dist, lib, build, coverage) · dist -✔ Does the "lint" script create any outputs? If not, leave blank, otherwise provide a path relative to a project root (e.g. dist, lib, build, coverage) · -✔ Would you like remote caching to make your build faster? · skip - - ... - - NX 👀 Explore Your Workspace - -Run "nx graph" to show the graph of the workspace. It will show tasks that you can run with Nx. -Read this guide on exploring your workspace: https://nx.dev/features/explore-graph -``` - ## Explore Your Workspace If you run `nx graph` as instructed, you'll see the dependencies between your projects. ```shell {% path="~/tuskydesigns" %} -npx nx graph +npx nx graph --focus=@tuskdesign/demo ``` {% graph title="Tusk Design" height="200px" jsonFile="shared/tutorials/npm-workspaces-project-graph.json" %} @@ -386,53 +333,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes to GitHub -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/nx-cloud-github-connect.avif b/docs/shared/tutorials/nx-cloud-github-connect.avif new file mode 100644 index 0000000000000000000000000000000000000000..bb420026c2a9c36ec5fcfad58e32e4c833b869cd GIT binary patch literal 30919 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

Lq=_h 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 MMF)H#)!K^f1Oc{jQ~&?~ literal 0 HcmV?d00001 diff --git a/docs/shared/tutorials/react-monorepo.md b/docs/shared/tutorials/react-monorepo.md index d41dc6d7c8..1b66c1fd9d 100644 --- a/docs/shared/tutorials/react-monorepo.md +++ b/docs/shared/tutorials/react-monorepo.md @@ -61,10 +61,10 @@ NX Let's create a new workspace [https://nx.dev/getting-started/intro] ✔ Which bundler would you like to use? · vite ✔ Test runner to use for end to end (E2E) tests · cypress ✔ Default stylesheet format · css -✔ Do you want Nx Cloud to make your CI fast? · Yes +✔ Which CI provider would you like to use? · GitHub Actions ``` -Let's name the initial application `react-store`. In this tutorial we're going to use `vite` as a bundler, `cypress` for e2e tests and `css` for styling. The above command generates the following structure: +Let's name the initial application `react-store`. In this tutorial we're going to use `vite` as a bundler, `cypress` for e2e tests and `css` for styling. We'll talk more about how Nx integrates with GitHub Actions later in the tutorial. The above command generates the following structure: ``` └─ react-monorepo @@ -114,7 +114,7 @@ The [`nx.json` file](/reference/nx-json) contains configuration settings for Nx To serve your new React application, just run: ```shell -nx serve react-store +npx nx serve react-store ``` Your application should be served at [http://localhost:4200](http://localhost:4200). @@ -128,7 +128,7 @@ Nx uses the following syntax to run tasks: Nx identifies available tasks for your project from [tooling configuration files](/concepts/inferred-tasks), `package.json` scripts and the targets defined in `project.json`. To view the tasks that Nx has detected, look in the [Nx Console](/getting-started/editor-setup) project detail view or run: ```shell -nx show project react-store +npx nx show project react-store ``` {% project-details title="Project Details View (Simplified)" height="100px" %} @@ -355,9 +355,9 @@ Nx allows you to separate this logic into "local libraries". The main benefits i Let's assume our domain areas include `products`, `orders` and some more generic design system components, called `ui`. We can generate a new library for each of these areas using the React library generator: ``` -nx g @nx/react:library products --directory=libs/products --unitTestRunner=vitest --bundler=none -nx g @nx/react:library orders --directory=libs/orders --unitTestRunner=vitest --bundler=none -nx g @nx/react:library shared-ui --directory=libs/shared/ui --unitTestRunner=vitest --bundler=none +npx nx g @nx/react:library products --directory=libs/products --unitTestRunner=vitest --bundler=none +npx nx g @nx/react:library orders --directory=libs/orders --unitTestRunner=vitest --bundler=none +npx nx g @nx/react:library shared-ui --directory=libs/shared/ui --unitTestRunner=vitest --bundler=none ``` Note how we type out the full path in the `directory` flag to place the libraries into a subfolder. You can choose whatever folder structure you like to organize your projects. If you change your mind later, you can run the [move generator](/nx-api/workspace/generators/move) to move a project to a different folder. @@ -401,7 +401,7 @@ Running the above commands should lead to the following directory structure: Each of these libraries -- has a project details view where you can see the available tasks (e.g. running tests for just orders: `nx test orders`) +- has a project details view where you can see the available tasks (e.g. running tests for just orders: `npx nx test orders`) - has its own `project.json` file where you can customize targets - has the name you specified in the generate command; you can find the name in the corresponding `project.json` file - has a dedicated `index.ts` file which is the "public API" of the library @@ -507,7 +507,7 @@ export function App() { export default App; ``` -Serving your app (`nx serve react-store`) and then navigating to `/products` should give you the following result: +Serving your app (`npx nx serve react-store`) and then navigating to `/products` should give you the following result: ![products route](/shared/tutorials/react-tutorial-products-route.png) @@ -555,12 +555,12 @@ export default App; -Nx automatically detects the dependencies between the various parts of your workspace and builds a [project graph](/features/explore-graph). This graph is used by Nx to perform various optimizations such as determining the correct order of execution when running tasks like `nx build`, identifying [affected projects](/features/run-tasks#run-tasks-on-projects-affected-by-a-pr) and more. Interestingly you can also visualize it. +Nx automatically detects the dependencies between the various parts of your workspace and builds a [project graph](/features/explore-graph). This graph is used by Nx to perform various optimizations such as determining the correct order of execution when running tasks like `npx nx build`, identifying [affected projects](/features/run-tasks#run-tasks-on-projects-affected-by-a-pr) and more. Interestingly you can also visualize it. Just run: ```shell -nx graph +npx nx graph ``` You should be able to see something similar to the following in your browser. @@ -654,7 +654,7 @@ You should be able to see something similar to the following in your browser. Notice how `shared-ui` is not yet connected to anything because we didn't import it in any of our projects. -Exercise for you: change the codebase such that `shared-ui` is used by `orders` and `products`. Note: you need to restart the `nx graph` command to update the graph visualization or run the CLI command with the `--watch` flag. +Exercise for you: change the codebase such that `shared-ui` is used by `orders` and `products`. Note: you need to restart the `npx nx graph` command to update the graph visualization or run the CLI command with the `--watch` flag. ## Testing and Linting - Running Multiple Tasks @@ -663,15 +663,15 @@ Exercise for you: change the codebase such that `shared-ui` is used by `orders` Our current setup doesn't just come with targets for serving and building the React application, but also has targets for unit testing, e2e testing and linting. Again, these are defined in the `project.json` file. We can use the same syntax as before to run these tasks: ```bash -nx test react-store # runs the tests for react-store -nx lint inventory # runs the linter on inventory -nx e2e react-store-e2e # runs e2e tests for the react-store +npx nx test react-store # runs the tests for react-store +npx nx lint inventory # runs the linter on inventory +npx nx e2e react-store-e2e # runs e2e tests for the react-store ``` More conveniently, we can also run tasks in parallel using the following syntax: ```shell -nx run-many -t test +npx nx run-many -t test ``` ### Caching @@ -680,7 +680,7 @@ One thing to highlight is that Nx is able to [cache the tasks you run](/features Note that all of these targets are automatically cached by Nx. If you re-run a single one or all of them again, you'll see that the task completes immediately. In addition, (as can be seen in the output example below) there will be a note that a matching cache result was found and therefore the task was not run again. -```{% command="nx run-many -t test lint e2e" path="react-monorepo" %} +```{% command="npx nx run-many -t test lint e2e" path="react-monorepo" %} ✔ nx run e2e:lint [existing outputs match the cache, left as is] ✔ nx run react-store:lint [existing outputs match the cache, left as is] ✔ nx run react-store:test [existing outputs match the cache, left as is] @@ -723,7 +723,7 @@ export default Products; One of the key features of Nx in a monorepo setting is that you're able to run tasks only for projects that are actually affected by the code changes that you've made. To run the tests for only the projects affected by this change, run: ```shell -nx affected -t test +npx nx affected -t test ``` Note that the unit tests were run for `products`, `react-store` and `inventory`, but not for `orders` because a change to `products` can not possibly break the tests for `orders`. In a small repo like this, there isn't a lot of time saved, but as there are more tests and more projects, this quickly becomes an essential command. @@ -731,7 +731,7 @@ Note that the unit tests were run for `products`, `react-store` and `inventory`, You can also see what projects are affected in the graph visualizer with; ```shell -nx graph --affected +npx nx graph --affected ``` {% graph height="450px" %} @@ -865,10 +865,10 @@ Replace the `command` with whatever terminal command you use to deploy your site The `"dependsOn": ["build"]` setting tells Nx to make sure that the project's `build` task has been run successfully before the `deploy` task. -With the `deploy` tasks defined, you can deploy a single application with `nx deploy react-store` or deploy any applications affected by the current changes with: +With the `deploy` tasks defined, you can deploy a single application with `npx nx deploy react-store` or deploy any applications affected by the current changes with: ```shell -nx affected -t deploy +npx nx affected -t deploy ``` ## Imposing Constraints with Module Boundary Rules @@ -993,7 +993,7 @@ export default Products; If you lint your workspace you'll get an error now: -```{% command="nx run-many -t lint" %} +```{% command="npx nx run-many -t lint" %} Running target lint for 7 projects ✖ nx run products:lint Linting "products"... @@ -1039,53 +1039,79 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +When we set up the repository at the beginning of this tutorial, we chose to use GitHub Actions as a CI provider. This created a basic CI pipeline and configured Nx Cloud in the repository. It also printed a URL in the terminal to register your repository in your [Nx Cloud](https://cloud.nx.app) account. If you didn't click on the link when first creating your repository, you can show it again by running: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +Once you click the link, follow the steps provided and make sure Nx Cloud is enabled on the main branch of your repository. -### Enable a Distributed CI Pipeline +### Configure Your CI Workflow -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command: + +```shell +npx nx generate ci-workflow ``` +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/react-standalone.md b/docs/shared/tutorials/react-standalone.md index 43b856c31e..ff1d85722a 100644 --- a/docs/shared/tutorials/react-standalone.md +++ b/docs/shared/tutorials/react-standalone.md @@ -980,53 +980,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle) diff --git a/docs/shared/tutorials/vue-standalone.md b/docs/shared/tutorials/vue-standalone.md index 0cfdebe7c2..c1133252b1 100644 --- a/docs/shared/tutorials/vue-standalone.md +++ b/docs/shared/tutorials/vue-standalone.md @@ -1036,53 +1036,93 @@ This tutorial walked you through how Nx can improve the local development experi - Nx Agents [efficiently distribute tasks across machines](/ci/concepts/parallelization-distribution) ensuring constant CI time regardless of the repository size. The right number of machines is allocated for each PR to ensure good performance without wasting compute. - Nx Atomizer [automatically splits](/ci/features/split-e2e-tasks) large e2e tests to distribute them across machines. Nx can also automatically [identify and rerun flaky e2e tests](/ci/features/flaky-tasks). -### Generate a CI Workflow - -If you are starting a new project, you can use the following command to generate a CI workflow file. - -```shell -npx nx generate ci-workflow --ci=github -``` - -{% callout type="note" title="Choose your CI provider" %} -You can choose `github`, `circleci`, `azure`, `bitbucket-pipelines`, or `gitlab` for the `ci` flag. -{% /callout %} - -This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. - -The key line in the CI pipeline is: - -```yml -- run: npx nx affected -t lint test build e2e-ci -``` - ### Connect to Nx Cloud Nx Cloud is a companion app for your CI system that provides remote caching, task distribution, e2e tests deflaking, better DX and more. -To connect to Nx Cloud: +Now that we're working on the CI pipeline, it is important for your changes to be pushed to a GitHub repository. -- Commit and push your changes -- Go to [https://cloud.nx.app](https://cloud.nx.app), create an account, and connect your repository +1. Commit your existing changes with `git add . && git commit -am "updates"` +2. [Create a new GitHub repository](https://github.com/new) +3. Follow GitHub's instructions to push your existing code to the repository -#### Connect to Nx Cloud Manually - -If you are not able to connect via the automated process at [https://cloud.nx.app](https://cloud.nx.app), you can connect your workspace manually by running: +Now connect your repository to Nx Cloud with the following command: ```shell npx nx connect ``` -You will then need to merge your changes and connect to your workspace on [https://cloud.nx.app](https://cloud.nx.app). +A browser window will open to register your repository in your [Nx Cloud](https://cloud.nx.app) account. The link is also printed to the terminal if the windows does not open, or you closed it before finishing the steps. The app will guide you to create a PR to enable Nx Cloud on your repository. -### Enable a Distributed CI Pipeline +![](/shared/tutorials/nx-cloud-github-connect.avif) -The current CI pipeline runs on a single machine and can only handle small workspaces. To transform your CI into a CI that runs on multiple machines and can handle workspaces of any size, uncomment the `npx nx-cloud start-ci-run` line in the `.github/workflows/ci.yml` file. +Once the PR is created, merge it into your main branch. -```yml -- run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="e2e-ci" +![](/shared/tutorials/github-cloud-pr-merged.avif) + +And make sure you pull the latest changes locally: + +```shell +git pull ``` +You should now have an `nxCloudAccessToken` property specified in the `nx.json` file. + +### Create a CI Workflow + +Use the following command to generate a CI workflow file. + +```shell +npx nx generate ci-workflow --ci=github +``` + +This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs. + +The key lines in the CI pipeline are: + +```yml {% fileName=".github/workflows/ci.yml" highlightLines=["10-14", "21-22"] %} +name: CI +# ... +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npm ci --legacy-peer-deps + - uses: nrwl/nx-set-shas@v4 + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + - run: npx nx affected -t lint test build +``` + +### Open a Pull Request + +Commit the changes and open a new PR on GitHub. + +```shell +git add . +git commit -m 'add CI workflow file' +git push origin add-workflow +``` + +When you view the PR on GitHub, you will see a comment from Nx Cloud that reports on the status of the CI run. + +![Nx Cloud report](/shared/tutorials/github-pr-cloud-report.avif) + +The `See all runs` link goes to a page with the progress and results of tasks that were run in the CI pipeline. + +![Run details](/shared/tutorials/nx-cloud-run-details.avif) + For more information about how Nx can improve your CI pipeline, check out one of these detailed tutorials: - [Circle CI with Nx](/ci/intro/tutorials/circle)