Giter VIP home page Giter VIP logo

ci's People

Contributors

agentender avatar brianespinosa avatar cyrixmorten avatar gperdomor avatar jameshenry avatar johndalvik avatar layzeedk avatar marcusresell avatar meeroslav avatar mheob avatar michsior14 avatar rrooding avatar sebastiandg7 avatar sergeylanzman avatar stalkaltan avatar szepeviktor avatar wolfsoko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ci's Issues

Upload Coverage

Hey !
First of all, thanks for the work.
In the example, a --code-coverage is used. Which means coverage files are generated.
The problem is, since the tests are run on the agents, the coverage files are generated there, and are not available on the main job.
How would you upload these coverage files ? (using the codecov action for example)

Expose in the docs the "working-directory" input

I was looking for such input to properly have a working recipe in a mono-repo containing a back and front root folders.
I had to fork this repository and go on my own until I came across this existing “working-directory” input, which was precisely what I needed.
Could you officially make it a valid input from the docs so that others may not struggle?
Thanks!

Make more clear what causes the job to fail

The main job fails with Error: Process completed with exit code 1. at the end of the output

image

It is not clear at all what causes that failure. I tried debugging it and even revert back to a setup without DTE to see that there was a formatting error.

image

With DTE the formatting error is printed at the start of the console output and it is polluted with these NX_BASE errors. After the formatter error you get the output from the other task. In my case there are more than 4000 lines between the error and the end of the failed step.

Can it be made more clear what causes the error? Maybe an overview can be provided at the end of the job?

Run volta-cli Step 404 Error

I generated the GitHub Actions CI file with the generator, but when I create the PR for the action to run it fails with the following error:

Agents:

image

Main Job:

image

I'm unsure why it's failing, but my ci.yaml file that was generated is basically unchanged. I added a few environment variables and an init-commands section, and changed the name of the main branch:

CI Yaml File on: push: branches: - master pull_request: branches: - master

env:
NX_BRANCH: ${{ github.event.number }}
NX_RUN_GROUP: ${{ github.run_id }}
NPM_TOKEN: ${{ secrets.MYGET_TOKEN }}

jobs:
main:
name: Nx Cloud - Main Job
uses: nrwl/ci/.github/workflows/[email protected]
with:
main-branch-name: master
init-commands: |
cp npmrc_file .npmrc
parallel-commands: |
npx nx-cloud record -- npx nx workspace-lint
npx nx-cloud record -- npx nx format:check
parallel-commands-on-agents: |
npx nx affected --target=lint --parallel=3
npx nx affected --target=test --parallel=3 --ci --code-coverage
npx nx affected --target=build --parallel=3

agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
        number-of-agents: 3

My version of Angular is 13.3.11 and Nx is 14.1.9.

Allow to override agent runner

Hi, I want to run nrwl/ci/.github/workflows/nx-cloud-main.yml and nrwl/ci/.github/workflows/nx-cloud-agents.yml
with a self hosted runner but there's no option to override it :(

Is this task compatible with Nx17?

After upgrading to NX17, my build job fails to run with "To use Distributed Task Execution, your default task runner configuration must use the "nx-cloud" task runner."

For background: I'm using nx-cloud only on the CI server. Nx migrate removed the taskRunnerOptions from nx.json, so not really sure why it would need to set it again?

SHORT FORM:
Is this shared action known to be compatible with nx17?

LONG FORM:
I've bumped to run on 0.14.0 of this action, but i get

For Start Nx Agent 1/2/3

Run npx nx-cloud start-agent
  

 >  NX   Starting an agent for running Nx tasks


 >  NX   Invalid Task Runner Configuration

   To use Distributed Task Execution, your default task runner configuration must
   use the "nx-cloud" task runner.
   
   This can be adjusted in "nx.json".

Under "Run any configured install commands" it logs


Run npm ci --prefer-offline --audit false --legacy-peer-deps 
  npm ci --prefer-offline --audit false --legacy-peer-deps 
  npm run postinstall
  npx nx report
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    NX_CLOUD_DISTRIBUTED_EXECUTION: true
    NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT: 3
    NX_BRANCH: [2](https://github.com/<ORG>/<REPO>/actions/runs/6958272621/job/18932964541#step:15:2)54
    NX_CLOUD_ACCESS_TOKEN: ***
    NX_CLOUD_AUTH_TOKEN: 
    NPM_TOKEN: 
    VOLTA_HOME: /opt/hostedtoolcache/volta/1.1.1/x64
npm WARN deprecated [email protected]: Please upgrade to @sentry/node. See the migration guide https://bit.ly/[3](https://github.com/ORG/REPO/actions/runs/6958272621/job/18932964541#step:15:3)ybOlo7
npm WARN deprecated [email protected]: We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser
npm WARN deprecated @types/[email protected]: This is a stub types definition for reflect-metadata (https://github.com/rbuckton/ReflectDecorators). reflect-metadata provides its own type definitions, so you don't need @types/reflect-metadata installed!
npm WARN deprecated @slack/[email protected]: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm WARN deprecated @babel/[email protected]: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.
npm WARN deprecated @babel/[email protected]: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.
npm WARN deprecated @babel/[email protected]: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.
npm WARN deprecated [email protected]: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.

> [email protected] postinstall
> node ./decorate-angular-cli.js


 >  NX   Decoration of the Angular CLI is deprecated and will be removed in a future version

   Please replace usage of "ng <command>" in any scripts, particularly for CI, with "nx <command>"


 >  NX   Angular CLI has been decorated to enable computation caching.


added 2687 packages in 1m

358 packages are looking for funding
  run `npm fund` for details

> [email protected] postinstall
> node ./decorate-angular-cli.js


 >  NX   Decoration of the Angular CLI is deprecated and will be removed in a future version

   Please replace usage of "ng <command>" in any scripts, particularly for CI, with "nx <command>"


 >  NX   Angular CLI has been decorated to enable computation caching.


 >  NX   Report complete - copy this into the issue template

   Node   : 18.18.2
   OS     : linux-x6[4](https://github.com/ORG/REPO/actions/runs/6958272621/job/18932964541#step:15:4)
   npm    : 9.8.1
   
   nx                 : 17.1.3
   @nx/js             : 17.1.3
   @nx/jest           : 17.1.3
   @nx/linter         : 17.1.3
   @nx/eslint         : 17.1.3
   @nx/workspace      : 17.1.3
   @nx/angular        : 17.1.3
   @nx/cypress        : 17.1.3
   @nx/devkit         : 17.1.3
   @nx/eslint-plugin  : 17.1.3
   @nx/plugin         : 17.1.3
   @nx/storybook      : 17.1.3
   @nrwl/tao          : 17.1.3
   @nx/web            : 17.1.3
   @nx/webpack        : 17.1.3
   typescript         : [5](https://github.com/ORG/REPO/actions/runs/6958272621/job/18932964541#step:15:5).2.2
   ---------------------------------------
   Community plugins:
   @currents/nx       : 0.2.1
   @ngneat/spectator  : 10.0.1
   @storybook/angular : [7](https://github.com/ORG/REPO/actions/runs/6958272621/job/18932964541#step:15:7).5.3
   ng-mocks           : 14.[12](https://github.com/ORG/REPO/actions/runs/6958272621/job/18932964541#step:15:12).1
   ---------------------------------------
   Local workspace plugins:



My tasks:


main:
    needs:
      - install
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    secrets:
      NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
    with:
      number-of-agents: 3
      install-commands: npm ci --prefer-offline --audit false --legacy-peer-deps && npm run postinstall
      init-commands: |
        npx nx-cloud start-ci-run --stop-agents-after="e2e" --agent-count=3
      parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=3
        npx nx affected --target=test --ci  --base=remotes/origin/main --parallel=3 --runInBand --exclude integration-tests components storefront-b2c feed-generator
        npx nx affected --target=server  --parallel=3
        npx nx affected --target=build --parallel=3
  # check server side builds as well as regular builds, to capture any broken services
  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    secrets:
      NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
    with:
      number-of-agents: 3
      install-commands: |
        npm ci --prefer-offline --audit false --legacy-peer-deps 
        npm run postinstall
        npx nx report

How can we record artifacts on failure too?

I have a project that uses the nrwl/ci/.github/workflows/nx-cloud-main.yml@refs/tags/v0.14 action and some agents to run my Playwright tests for my project.

In my previous setup, I used playwright's sharding feature, where you gather the blob reports from each shard job as artifacts and then consolidate then in a subsequent job.

With using the nx-cloud-main workflow mentioned above, I set the input values for collecting some artifacts. But unfortunately the Upload Artifacts step only runs if the main job was successful. See

- name: Uploading artifacts
uses: actions/upload-artifact@v3
if: ${{ inputs.artifacts-path != '' }}
with:
name: ${{ inputs.artifacts-name }}
path: ${{ inputs.artifacts-path }}
retention-days: ${{ inputs.artifacts-retention-days }}

The Playwright sharding docs recommend to use if: always() in the "Upload Artifact" step:

    - name: Upload blob report to GitHub Actions Artifacts
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: blob-report-${{ matrix.shardIndex }}
        path: blob-report
        retention-days: 1

This will allow for artifacts for failed tests to be uploaded too, which is pretty essential.

Is there a recommended approach here, or is this a change that needs to be made to the nx-cloud-main workflow?

Potential solutions:

  1. Provide some guidance to your users that they should include || true to the end of the command where failures are acceptable
  • This will unfortunately give a false signal of success for the main job
  1. Add the always() expression to the condition in the "Upload Artifacts" step
  • This may be an unexpected behaviour for some users
  1. Add an input artifacts-always-upload to the workflow that allows a user to conditionally turn this behaviour on.
  • The condition in the step would become: if: ${{ inputs.artifacts-path != '' && (success() || (failure() && inputs.artifacts-always-upload)) }}
  1. Extract the steps of this workflow as a github action (which would exclude the artifact bit) so that users can leverage this code within their own job and handle artifacts how they wish. The nx-could-main workflow in your repository would then also use this extracted action.

What do you think?

Allow artifact retention period to be configured

This is a feature request. We recently started using the ability to store artifacts made possible by the artifacts-path parameter to the nx-cloud-main workflow. This has had the knock on effect of significantly increasing our storage costs for artifacts we only need to store short term.

I don't think GitHub supports this on a per-repository basis (happy to be corrected) and we do not want to lower the organisation wide default. So if we could set on a per-workflow basis that would be ideal.

The upload artifact action which you are using supports this - https://github.com/actions/upload-artifact#retention-period.

CI Fails with Error: ENOENT: no such file or directory './.github/workflows/run-commands-in-parallel.sh'

I am using the ci template to get initial out of the box CI with nx cloud.
I am getting this error since 2 days.

If I understand correctly it is a script generated by the workflow itself. Is this known?

failed 12 minutes ago in 1m 26s
Search logs
4s
2s
0s
0s
0s
1s
0s
0s
4s
0s
0s
0s
0s
1m 9s
0s
##[debug]Evaluating condition for step: 'Create command utils'
##[debug]Evaluating: success()
##[debug]Evaluating success:
##[debug]=> true
##[debug]Result: true
##[debug]Starting: Create command utils
##[debug]Loading inputs
##[debug]Evaluating: github.token
##[debug]Evaluating Index:
##[debug]..Evaluating github:
##[debug]..=> Object
##[debug]..Evaluating String:
##[debug]..=> 'token'
##[debug]=> '***'
##[debug]Result: '***'
##[debug]Loading env
Run actions/github-script@v6
  with:
    script: const { writeFileSync } = require('fs');
  const runCommandsInParallelScript = `
    # Extract the provided commands from the stringified JSON array.
    IFS=$'\n' read -d '' -a userCommands < <((jq -c -r '.[]') <<<"$[1](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:1)")
  
    # Invoke the provided commands in parallel and collect their exit codes.
    pids=()
    for userCommand in "\${userCommands[@]}"; do
      eval "$userCommand" & pids+=($!)
    done
  
    # If any one of the invoked commands exited with a non-zero exit code, exit the whole thing with code 1.
    for pid in \${pids[*]}; do
      if ! wait $pid; then
        exit 1
      fi
    done
  
    # All the invoked commands must have exited with code zero.
    exit 0
  `;
  writeFileSync('./.github/workflows/run-commands-in-parallel.sh', runCommandsInParallelScript);
  
    github-token: ***
    debug: false
    user-agent: actions/github-script
    result-encoding: json
  env:
    NX_CLOUD_DISTRIBUTED_EXECUTION: true
    NX_BRANCH: 8
    NX_BASE: a98c3111c1719c38b639b69a9811e49f373361ea
    NX_HEAD: 6accfdaef9a5fb6[2](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:2)d9c621e[3](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:3)07b85[4](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:4)d[5](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:5)1829cdce
    VOLTA_HOME: /opt/hostedtoolcache/volta/1.0.7/x[6](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:6)4
Error: ENOENT: no such file or directory, open './.github/workflows/run-commands-in-parallel.sh'
    at Object.openSync (node:fs:585:3)
    at writeFileSync (node:fs:2153:35)
    at eval (eval at callAsyncFunction (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:480[7](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:7):16), <anonymous>:24:1)
    at callAsyncFunction (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:4[8](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:8)08:12)
    at main (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:4862:26)
    at Module.272 (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:4846:1)
    at __webpack_require__ (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:24:31)
    at startup (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:43:1[9](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:9))
    at /home/runner/work/_actions/actions/github-script/v6/dist/index.js:49:18
    at Object.<anonymous> (/home/runner/work/_actions/actions/github-script/v6/dist/index.js:52:[10](https://github.com/Cheveo/gymony/runs/6592554030?check_suite_focus=true#step:15:10)) {
  errno: -2,
  syscall: 'open',
  code: 'ENOENT',
  path: './.github/workflows/run-commands-in-parallel.sh'
}
Error: Unhandled error: Error: ENOENT: no such file or directory, open './.github/workflows/run-commands-in-parallel.sh'
##[debug]Node Action run completed with exit code 1
##[debug]Finishing: Create command utils```

[Feature Request]: hook the nx cloud workflow up with build artifacts

Hey guys,

I would like to know if it's currently possible to hook the nx cloud main workflow up with build artifacts?
To put it simple, I use this:

parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=3
        npx nx affected --target=test --parallel=3 --ci --code-coverage
        npx nx affected --target=build --parallel=3

And I would like to upload the generated code coverage to codecov via another job.
The problem, I can't use the generated files from the main nx workflow because I did not find any way to upload the artifacts with a command like:

      - uses: actions/upload-artifact@master
        with:
          name: dist
          path: dist

Right now my workaround has been to copy paste all your script, and add a step after the parallel commands have been executed:

  - name: Upload coverage to Codecov
    uses: codecov/codecov-action@v3

Thank you in advance for your attention 😊

Support setting registry-url and scope for private packages

We currently have this step in our workflow that we are trying to migrate to NxCloud DTE

      - uses: actions/setup-node@v3
        with:
          node-version: '20'
          cache: 'npm'
          registry-url: 'https://npm.pkg.github.com'
          scope: '@myorg'

The current workflow does support node-version and cache but does not support the registry-url and scope params. There is also support for setting the NPM_TOKEN secret but I am struggling to see how that can even be used without being able to set these. Could we set these using a .npmrc file in the root of our repo?

How do I use external GitHub actions within Nx workflow

Example: I would like to "plug" the Coveralls Github Action at the end of Nx workflow, after running the tests with the coverage flag.
What should I do?

In Github Actions docs, they suggest uploading the artifacts for sharing between jobs, but it's also an action 🤷‍♂️
Should you guys break the workflow into actions to cover these complex needs?
Thanks!

First test in each library is very slow

I am using the nx-cloud-main.yml workflow for our runs. Its working fine, splitting up our runs across three agents. However, our Jest tests run very slow. And it seems that the first test in each library takes a long time, and then the rest of the tests run fast.

Screenshot 2023-02-07 at 09 33 32

I have tried to play with --maxworkers and --runInBand but have not seen much of any improvement.

The tests run blazing fast locally, using the same nx command npx nx run-many --target=test --parallel=3 --all -- --runInBand

Can this be an issue with the Github workflow, or with nx config - or just the way we use tests?

Add caching node_modules option

Feature request.
As dependencies increase in monorepo, yarn commands tend to get longer.
The install time can be shortened by caching the node_modules.
Is this worth considering?

Publishing

Whats the recommended way of using this repo to do versioning and publishing to npm?

Error when changing to v0.11.0

When changing version 0.10 to 0.11 of the action, github actions started showing errors

Captura de tela de 2022-12-06 12-16-40

Here is the error shown by github actions

Captura de tela de 2022-12-06 12-15-48


My workflow file

name: CI - Nx Cloud

on:
  pull_request: 
    branches: [some branchs]

env:
  NX_CLOUD_DISTRIBUTED_EXECUTION: true
  NX_CLOUD_DISTRIBUTED_EXECUTION_STOP_AGENTS_ON_FAILURE: true

concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
  cancel-in-progress: true

jobs:
  main:
    name: Nx Cloud - Main Job
    permissions:
      contents: 'read'
      actions: 'write'

    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 3
      parallel-commands-on-agents: |
        yarn nx affected --target=c1 --parallel=3
        yarn nx affected --target=c2 --parallel=3
        yarn nx affected --target=c3 --parallel=3

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 3

How to get outputs from nx-cloud-main workflow?

I've been trying to see if it is possible to execute a command within the nx-cloud-main workflow and send the result to $GITHUB_OUTPUT and then pick it up later on in our pipeline.

Our use case is to drive a strategy matrix with a list of affected projects with a "package" target which in our case means that the project needs to be pushed to ECR and deployed to ECS. We have this working already with a custom action but it requires a fair bit of copy/paste from the nx-cloud-main workflow which is a bit of a maintenance overhead to keep up to date.

I don't think this is possible with a reusable workflow (a GitHub limitation not an Nx one) but I am hoping to be proved wrong.

Thanks in advance.

Unable to use environment variables in .npmrc with PNPM

We are using different registries for some packages.

For example fontawesome.

This is our .npmrc file:

strict-peer-dependencies=false
auto-install-peers=true

@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_TOKEN}

Locally I have set a env variable in my .zshrc file, works fine.
Since as of now it is not possible to use any other secrets than the ones defined under secrets, we defined our tokens in Github variables (not optimal, but for now it is fine).

Here is our workflow yml file:

name: CI

on:
  push:
    branches:
      - main
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
  cancel-in-progress: true

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      # NOTE: Here we are using the special `nx-cloud record` command to ensure that any commands we run that do not go through the cloud task runner natively
      # (i.e. anything that starts with `nx run`/`nx run-many`/`nx affected --target`), are still captured in the Nx Cloud UI and Github App comment for
      # easier troubleshooting. See more here: https://nx.dev/nx-cloud/set-up/record-commands#recording-non-nx-commands
      environment-variables: |
        FONTAWESOME_NPM_TOKEN=${{ vars.FONTAWESOME_NPM_TOKEN }} 
      parallel-commands: |
        npx nx-cloud record -- npx nx workspace-lint
        npx nx-cloud record -- npx nx format:check
      parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=3
        npx nx affected --target=test --parallel=3 --ci --code-coverage
        npx nx affected --target=build --parallel=3

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 3

We tried a lot of combinations regarding the environment-variables, it just does not want to work.
Screenshot 2023-04-20 at 13 20 19

If we define our tokens hardcoded in .npmrc, then it works.

It seems to me like the env variables are not parsed at all.
Any feedback is very much appreciated.

nx-cloud-main.yml returns Error with exit code 1 when another yml is present

I have two actions (see below).
Even though all jobs in each .yml complete successfully, the Nx Cloud - Main Job returns Error: Process completed with exit code 1.

This only occurs when there is another .yml present (even if that .yml isn't triggered (i.e. only runs on push to main etc)

Any idea why this is?

# Based on template from nx - https://github.com/nrwl/ci
name: Pull Request Flow

on:
    pull_request:
jobs:
    main:
        name: Nx Cloud - Main Job
        uses: nrwl/ci/.github/workflows/[email protected]
        with:
            environment-variables: |
                NX_CLOUD_DISTRIBUTED_EXECUTION=true
            main-branch-name: master
            number-of-agents: 3
            init-commands: |
                npx nx-cloud start-ci-run --stop-agents-after="build" --agent-count=3
            parallel-commands: |
                npx nx-cloud record -- npx nx format:check
            parallel-commands-on-agents: |
                npx nx affected --target=lint --parallel=3 --base=$NX_BASE --head=$NX_HEAD
                npx nx affected --target=test --parallel=3 --ci --code-coverage --base=$NX_BASE --head=$NX_HEAD
                npx nx affected --target=build --parallel=3 --base=$NX_BASE --head=$NX_HEAD

    agents:
        name: Nx Cloud - Agents
        uses: nrwl/ci/.github/workflows/[email protected]
        with:
            number-of-agents: 3

and another action

name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on:
    pull_request:
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v4
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."

Raw Log:
log.txt

Workflow hangs for full timeout if there are no detectable changes

It appears as though if affected detects no changes, the agents are brought up and then timeout after the default 60mins.

The PR here had a change to several files that were in a folder that is in .nxignore

Is there something we need to do to short-circuit this?
image

name: 'Affected commands'

on:
  pull_request:
    branches: [master]

env:
  NX_CLOUD_DISTRIBUTED_EXECUTION: 'true'
  NODE_OPTIONS: '--max_old_space_size=4096'
  CYPRESS_INSTALL_BINARY: 0

jobs:
  main:
    name: Nx Cloud Main
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      main-branch-name: 'master'
      node-version: '14.17.0'
      npm-version: '6.14.17'
      yarn-version: '1.22.18'
      parallel-commands-on-agents: |
        npx nx-cloud record -- npx nx format:check
        npx nx affected --target=lint --parallel=3
        npx nx affected --target=test --parallel=3

  agents:
    name: Nx Cloud Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 12
      node-version: '14.17.0'
      npm-version: '6.14.17'
      yarn-version: '1.22.18'

[Feature Request] Add support for `NX_CLOUD_ACCESS_TOKEN`

Hey there!

In our Nx GitHub Actions setup we currently set the NX_CLOUD_ACCESS_TOKEN environment variable to a token that has read/write access, while our local development environments use a read-only token (docs here). Is it possible to set a different Nx Cloud token utilizing this workflow?

I apologize if this is considered a duplicate, and I did see issue #8 asking about general environment variables. However, this seems a little more specific because it's an advertised feature of Nx Cloud.

Thank you!

runs-on config is not working as expected

I tried to use larger runners to speed up our nx builds even more. GitHub provides us a list of large runners for example: ubuntu-latest-16-cores.

Screenshot 2023-02-08 at 09 53 44

When I set this name in the ci-config, the build will fail. It looks like it is not possible to define the requested runner by name. I'm missing something in my config?

name: NX Cloud

on:
  push:
    branches:
      - develop
      - master
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review

concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
  cancel-in-progress: true

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    if: github.event.pull_request.draft == false
    with:
      number-of-agents: 3
      runs-on: ubuntu-latest-16-cores
      main-branch-name: 'master'
      init-commands: |
        npx nx-cloud start-ci-run --stop-agents-after="build" --agent-count=3
      parallel-commands: |
        npx nx-cloud record -- npx nx workspace-lint
        npx nx-cloud record -- npx nx format:check
      parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=3
        npx nx run-many --all --target=test --parallel=3 --ci --code-coverage --coverageReporters=lcov
        npx nx affected --target=build --parallel=1
      final-commands: |
        npx nx-cloud record node ./tools/scripts/coverageMerger.js
      artifacts-path: |
        coverage/lcov.info
      artifacts-name: coverage-report

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    if: github.event.pull_request.draft == false
    with:
      number-of-agents: 3
      runs-on: ubuntu-latest-16-cores

Usage with act?

Overview

I was wondering if it's possible to use Nx actions locally with act.

Errors

Error
[CI/main]   ✅  Success - Main Checkout
[CI/main] ⭐ Run Main Set NX SHAs
[CI/main]   🐳  docker cp src=/Users/UserName/.cache/act/nrwl-nx-set-shas@v3/ dst=/var/run/act/actions/nrwl-nx-set-shas@v3/
[CI/main] ⭐ Run Main Set base and head SHAs used for nx affected
[CI/main]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/1-composite-setSHAs.sh] user= workdir=
[CI/main]   ❗  ::error::Not Found
[CI/main]   ❌  Failure - Main Set base and head SHAs used for nx affected

First issue was something to do with the work directory

Looked at the GH and tried this fix

steps:
  - name: Checkout
    uses: actions/checkout@v2
    with:
      path: "my-action"

Then I got this "not a git repository" error

Error
[CI/main] ⭐ Run Main Set base and head SHAs used for nx affected
[CI/main]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/1-composite-setSHAs.sh] user= workdir=
| fatal: not a git repository (or any parent up to mount point /Users/UserName/projects/personal)
| Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
| node:internal/errors:857
|   const err = new Error(message);
|               ^
| 
| Error: Command failed: git rev-parse HEAD
| fatal: not a git repository (or any parent up to mount point /Users/UserName/projects/personal)
| Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
| 
|     at checkExecSyncError (node:child_process:861:11)
|     at execSync (node:child_process:932:15)
|     at /run/act/actions/nrwl-nx-set-shas@v3/dist/index.js:13735:20
|     at /run/act/actions/nrwl-nx-set-shas@v3/dist/index.js:13771:3
|     at /run/act/actions/nrwl-nx-set-shas@v3/dist/index.js:13846:3
|     at Object.<anonymous> (/run/act/actions/nrwl-nx-set-shas@v3/dist/index.js:13849:12)
|     at Module._compile (node:internal/modules/cjs/loader:1155:14)
|     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10)
|     at Module.load (node:internal/modules/cjs/loader:1033:32) {
|   status: 128,
|   signal: null,
|   output: [
|     null,
|     '',
|     'fatal: not a git repository (or any parent up to mount point /Users/UserName/projects/personal)\n' +
|       'Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).\n'
|   ],
|   pid: 34,
|   stdout: '',
|   stderr: 'fatal: not a git repository (or any parent up to mount point /Users/UserName/projects/personal)\n' +
|     'Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).\n'
| }

That's where I paused and figured I'd ask to see if anyone has tried this.

Thanks!

Specifying a custom runner with runs-on fails

Specifying a custom runner with runs-on fails with the following error message:

Called workflows cannot be queued onto self-hosted runners across organisations/enterprises. Failed to queue this job. Labels: '8-core_runner'.

Any idea what could be wrong or how to fix this?

The github actions config:

name: CI

on:
  push:
    branches:
      - master
      - staging
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
  cancel-in-progress: true

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    secrets:
      NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
    with:
      runs-on: 8-core_runner
      main-branch-name: master
      parallel-commands: |
        npx nx-cloud record -- nx format:check --all
      parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=4 --maxWarnings=0
        npx nx affected --target=test --parallel=4 --ci
        npx nx affected --target=build --parallel=4 --prod

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    secrets:
      NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
    with:
      runs-on: 8-core_runner
      number-of-agents: 8

Environment variables in custom workflow

CI Provider: GitHub

Where do I set env vars when using a custom workflow for the parallel tasks? Do I set them on the agent job? if so which step? the Start Nx Agent step? This didn't seem to be working for me.

packageManager in package.json is not respected for pnpm setup action

The setup action of PNPM should always take into account the version set in the package manager. This is already the case by default for the action.

The issue here is that the pnpm-setup action by default takes the version in package.json (packageManager) into account if no version is specified. nrwl/ci on the other hand takes the latest version if none is specified.

nx-cloud-main: forward secrets/env for commands running parallel

Hello, I am using nx-cloud-main and I have a use case where I need to pass a secret into a command running in parallel. It is currently impossible, can we get a way to set internal environment variables from outside or allow nx-cloud-main to use secrets?

I am using @nx-tools/nx-container and they require secrets.GITHUB_TOKEN

pnpm setup fails

Hi!

Due to passing package_json_file here:

package_json_file: "${{ inputs.working-directory || github.workspace }}/package.json"

and here:

package_json_file: "${{ inputs.working-directory || github.workspace }}/package.json"

This causes the "Install PNPM" step to fail with these workflows:
CleanShot 2023-11-02 at 20 29 01

The problem here is how pnpm appends the workspace root to the input as well, which is how we end up with it there twice:

https://github.com/pnpm/action-setup/blob/d2613e087f2e0aa841925861c5a5f7395d552177/src/install-pnpm/run.ts#L53

Maybe this should be fixed in that action instead?

Github CI - no such file or directory package.json

Hello,

I used the command line :

nx g ci-workflow

to generate my github workflow.

It generated me a ci.yml file where I added my secret NX_CLOUD_ACCESS_TOKEN

name: CI

on:
  push:
    branches:
      - main
  pull_request:

# Needed for nx-set-shas within nx-cloud-main.yml, when run on the main branch
permissions:
  actions: read
  contents: read

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      main-branch-name: main
      number-of-agents: 3
      init-commands: |
        pnpm exec nx-cloud start-ci-run --stop-agents-after="build" --agent-count=3
      parallel-commands: |
        pnpm exec nx-cloud record -- pnpm exec nx format:check
      parallel-commands-on-agents: |
        pnpm exec nx affected --target=lint --parallel=3
        pnpm exec nx affected --target=test --parallel=3 --ci --code-coverage
        pnpm exec nx affected --target=build --parallel=3
    secrets:
      NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 3

When the pipeline runs I receive this error during Install PNPM step

Run pnpm/action-setup@v2
  with:
    package_json_file: /home/runner/work/myrepo/myrepo/package.json
    dest: ~/setup-pnpm
    run_install: null
    standalone: false
  env:
    NX_CLOUD_DISTRIBUTED_EXECUTION: true
    NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT: 3
    NX_BRANCH: 4
    NX_CLOUD_ACCESS_TOKEN: ***
    NX_CLOUD_AUTH_TOKEN: 
    NPM_TOKEN: 
    NX_BASE: abb15dd8634ea8a39afef3e0510f9[2](https://github.com/sueno-ltd/myrepo/actions/runs/7383009232/job/20083548144#step:7:2)458ffabf76
    NX_HEAD: dc52fca6dbde92cf8[3](https://github.com/sueno-ltd/myrepo/actions/runs/7383009232/job/20083548144#step:7:3)72369f0c2a1f8ebec6dd8d
    VOLTA_HOME: /opt/hostedtoolcache/volta/1.1.1/x6[4](https://github.com/sueno-ltd/myrepo/actions/runs/7383009232/job/20083548144#step:7:4)
Running self-installer...
  [Error: ENOENT: no such file or directory, open '/home/runner/work/myrepo/myrepo/home/runner/work/myrepo/myrepo/package.json'] {
    errno: -2,
  Error: Error: ENOENT: no such file or directory, open '/home/runner/work/myrepo/myrepo/home/runner/work/myrepo/myrepo/package.json'
    code: 'ENOENT',
    syscall: 'open',
    path: '/home/runner/work/myrepo/myrepo/home/runner/work/myrepo/myrepo/package.json'
  }

It looks like the current path is duplicated

Thank you in advance for your help

workflow exits if one task fails

Issue summary

PR to repro the issue: rarmatei/nx-deploy-test-2#23
(See the YML directly)

If I run 3 targets:

  • affected --target=test
  • affected --target=60s-delay-fail --> waits 60s, then fails (defined with run-commands + sleep 20 + ls <non-existent-folder>
  • affected --target=20s-delay-fail --> waits 20s, then fails

If I use the workflow, I will get only 1 task on my github comment:

image

The moment the "tests" fail, it will shutdown every other task, and the NxAPI will not have a chance to mark them as completed. I am setting NX_CLOUD_DISTRIBUTED_EXECUTION_STOP_AGENTS_ON_FAILURE=false explicitly.

I don't believe this is an NxAPI issue however - if you watch the Agent logs, you will see the Main agent move over to shutting down ALL agents the moment the tests fail, even if the 60s-delay-fail task hasn't finished.

Simplified issue

Let's simplify the set-up and remove the Nrwl Workflow and Distributed Task Execution: rarmatei/nx-deploy-test-2#24
(See the YML directly)

We get the same broken comment:

image

If you pull the below into a local script and run it, it will correctly wait for all tasks to finish before shutting down:

pids=()

npx nx affected --target=test --base=origin/main &
pids+=($!)

npx nx affected --target=60s-delay-fail --base=origin/main &
pids+=($!)

npx nx affected --target=20s-delay-fail --base=origin/main &
pids+=($!)

for pid in "${pids[@]}"; do
  wait "$pid"
done

So this seems to be a problem only in an Github Action context.

What's more interesting, is that, if you remove the test from the above script and you re-submit it, it will CORRECTLY wait for all tasks to finish:

pids=()

# remove the tests and now it works even on Github Actions
# npx nx affected --target=test --base=origin/main &
# pids+=($!)

npx nx affected --target=60s-delay-fail --base=origin/main &
pids+=($!)

npx nx affected --target=20s-delay-fail --base=origin/main &
pids+=($!)

for pid in "${pids[@]}"; do
  wait "$pid"
done

So there seems to be something about how the tests exit that causes the Github Actions step to end prematurely. And this seems to be affecting our workflow as well.

How to make it work

If we use a slightly different approach to run all tasks in parallel, it seems to work, and correctly displays all tasks in the comment: rarmatei/nx-deploy-test-2#25
(See the YML directly)

image

I don't think I understand bash/Github actions well enough to understand what's happening here, and why it would work in this case.

Passing Env vars into action

Hi, thanks for this action! looks amazing.
Is there any way of passing a env var into the action?
I would like to pass an npm token as an env var into the action so when it build it can read packages from a private registry.

Frequent failure with volta-cli//action

The error of using Volta to install Node.js 16.18.1 failed quite often and it is quite disruptive to our pipelines. Happens 1-2 times everyday
Do you have any suggestions on how I can improve this?

Run volta-cli/action@v4
  with:
    node-version: 16.18.1
    npm-version: 8.19.[2](https://github.com/***/****/actions/runs/)
    token: ***
    always-auth: false
  env:
    NX_CLOUD_DISTRIBUTED_EXECUTION: true
    NX_BRANCH: develop
    NX_CLOUD_ACCESS_TOKEN: 
    NX_CLOUD_AUTH_TOKEN: 
    NPM_TOKEN: 
looking up latest volta version
downloading [email protected]
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/118[3](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:3)303d-b7a6-[4](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:4)af9-88cc-1b79993d1[5](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:5)9c/bin -f /home/runner/work/_temp/0522f090-57c9-480f-b553-83[6](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:6)3bbdef8cd
/opt/hostedtoolcache/volta/1.1.1/x64/bin/volta setup
caching [email protected] into /opt/hostedtoolcache/volta/1.1.1/x64
adding /opt/hostedtoolcache/volta/1.1.1/x64/bin to $PATH
installing Node 16.18.1
/opt/hostedtoolcache/volta/1.1.1/x64/bin/volta install [email protected]
error: Could not unpack Node v16.18.1

Please ensure the correct version is specified.
error: Error cause: failed to unpack `/opt/hostedtoolcache/volta/1.1.1/x64/tmp/.tmprsHt[7](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:7)a/node-v16.1[8](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:8).1-linux-x64/bin/node`

Error cause: failed to unpack `/opt/hostedtoolcache/volta/1.1.1/x64/tmp/.tmprsHt7a/node-v16.18.1-linux-x64/bin/node`

Error cause: failed to unpack `node-v16.18.1-linux-x64/bin/node` into `/opt/hostedtoolcache/volta/1.1.1/x64/tmp/.tmprsHt7a/node-v16.18.1-linux-x64/bin/node`

Error cause: Resource temporarily unavailable (os error [11](https://github.com//actions/runs/4692165290/jobs/8317540378#step:4:11))
Error: The process '/opt/hostedtoolcache/volta/1.1.1/x64/bin/volta' failed with exit code 1

install-command does not work if the install-command contains apostrophe `"`

The input install-command of the [email protected] workflow does fail when the install-command input contains aphostophe.

Error Message:

Run if [ -n "echo "Test"
... 
/home/runner/work/_temp/f144c54f-e9f8-48bd-9d58-abcdef123.sh: line 1: [: too many arguments

e.g. in your ci.yaml:

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      node-version: ${{ github.env.NODE_VERSION }}
      install-command: |
        echo "Test"
        sudo apt-get upgrade -y
        npm ci
        ...

The problematic code line seems to be:

if [ -n "${{ inputs.install-command }}" ]; then

Apostrophe inside the install-command ends the if statement string and leads to unpredictable behavior.

[Feature Request]: Add Init Commands Option for Agents

We need to add domains to our /etc/hosts file in order for our E2E to run successfully.

We have to spin up a web and api server, which we need to test on actual domains.

It appears, that agents run on different machines (I'm not a CI expert, but this seems reasonable) than the main job runs on (which makes sense). So I need each agent that is running an E2E (at least for this E2E job), to have these /etc/hosts domains available.

I have been changing the /etc/hosts file like so:
sudo echo "127.0.0.1 sdkapp.example.com auth.example.com api.example.com user.example.com" | sudo tee -a /etc/hosts

It would be great if we have an option for init-commands: | in agent config as well.

Something like this:

agents:
    name: Forgerock CI Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      init-commands: |
      sudo echo "127.0.0.1 sdkapp.example.com auth.example.com api.example.com user.example.com" | sudo tee -a /etc/hosts
      number-of-agents: 3

For my understanding: In this scenario, I think only the agent needs to edit to the /etc/hosts config file, and the "main" job in this instance would not need it because its not really "running" the command. Is this correct?

Permission denied error with GitHub Actions when using pnpm

Overveiw

The nrwl/ci/.github/workflows/[email protected] and nrwl/ci/.github/workflows/[email protected] actions don't seem to work with pnpm.

Details

When I tried using the generated GitHub Actions workflow while using pnpm I encountered this error.

sh: 1: nx-cloud: Permission denied
Error: Process completed with exit code 126.
workflow code
name: CI

on:
push:
  branches:
    - main
pull_request:

concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
cancel-in-progress: true

jobs:
main:
  name: Nx Cloud - Main Job
  uses: nrwl/ci/.github/workflows/nx-cloud-main.yml@v0.8
  secrets: inherit
  with:
    number-of-agents: 3

    init-commands: |
      pnpm exec nx-cloud start-ci-run --stop-agents-after="build" --agent-count=3
    parallel-commands: |
      pnpm exec nx-cloud record -- pnpm exec nx workspace-lint
      pnpm exec nx-cloud record -- pnpm exec nx format:check
    parallel-commands-on-agents: |
      pnpm exec nx affected --target=lint --parallel=3
      pnpm exec nx affected --target=test --parallel=3 --ci --code-coverage
      pnpm exec nx affected --target=build --parallel=3

agents:
  name: Nx Cloud - Agents
  uses: nrwl/ci/.github/workflows/nx-cloud-agents.yml@v0.8
  secrets: inherit
  with:
    number-of-agents: 3

Troubleshooting

I tried everything I could think of

  • adding secrets: inherit
  • explicitly defining NX_CLOUD_ACCESS_TOKEN, NX_CLOUD_AUTH_TOKEN in environment-variables
  • nx-cloud.env
  • reducing the number of agents / parallelism
  • different versions of the actions
  • etc

Works with yarn

Eventually I switched to yarn and it worked.

Error when connecting to Nx Cloud. Code: 404

Lately we've been getting weird cloud errors where the main job times out with a weird 404 error from nx-cloud. The app shows in the text message that the runs went through, when logging into the cloud the runs also seem to go through but the action itself fails with this error:
image

Sadly I've not been able to create a test repo to reproduce this error 🤔 If you need any additional info let me know.

Our config:

name: nrwl-nx-ci

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  main:
    name: Nx Cloud - Main Job
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 2
      node-version: 18.14.0
      parallel-commands: |
        npx nx-cloud record -- npx nx workspace-lint
        npx nx-cloud record -- npx nx format:check
      parallel-commands-on-agents: |
        npx nx affected --target=lint --parallel=3 --maxWarnings=0
        npx nx affected --target=build --parallel=3 -c prod --prod

  agents:
    name: Nx Cloud - Agents
    uses: nrwl/ci/.github/workflows/[email protected]
    with:
      number-of-agents: 2
      node-version: 18.14.0

Lastly, is there a way to completely purge the cache of nx cloud? 🤔 I am aware of --skip-nx-cache but there is not command afaik that just resets one nx cloud cache?

Support yarn v2+

I noticed a cache issue with yarn v2+:

- name: Get yarn cache directory path
if: steps.package_manager.outputs.name == 'yarn'
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"

yarn cache dir doesn't exist in yarn 2+

This should be done instead:

https://github.com/actions/cache/blob/main/examples.md#node---yarn-2

Edit: also --immutable should be used instead of --frozen-lockfile at the install step

Pass last-successful-event to nrwl/nx-set-shas

I was wondering if it would make sense to pass github.event_name to nrwl/nx-set-shas from nx-cloud-main.yml?

This defaults to push within nrwl/nx-set-shas.

We have a pipeline which runs off both push and release events. When it runs from a release event it would be preferable if the base and head SHAs where from the previous release and the current release rather than the previous push and the current release.

Thanks in advance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.