actions / setup-node

Set up your GitHub Actions workflow with a specific version of node.js
MIT License
3.95k stars 1.3k forks source link

How to use the ESLint annotations? #96

Open Couto opened 4 years ago

Couto commented 4 years ago

It's my first time using the annotations feature, so please forgive me if this issue is irrelevant.

I'm trying to have annotations in the PR, however all I can get is a simple annotation in the actions screen with irrelevant information. I'm guessing that's a problem of mine, and since there's not a lot documentation (that I could find) about this might as well ask.

Screenshot 2019-12-18 at 09 39 49

That's the output of a failing eslint job. The current configuration is:

  quality:
    needs: [build]

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1

      - uses: actions/setup-node@v1
        with:
          node-version: "12.x"

      - name: Cache node modules
        id: cache
        uses: actions/cache@v1
        with:
          path: node_modules # npm cache files are stored in `~/.npm` on Linux/macOS
          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-
            ${{ runner.os }}-build-
            ${{ runner.os }}-

      - name: Install Dependencies
        if: steps.cache.outputs.cache-hit != 'true'
        run: npm ci

      - name: Prettier
        run: npm run fmt:check

      - name: ESlint
        run: npm run eslint:github-action

where my package.json looks like:

  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^2.12.0",
    "@typescript-eslint/parser": "^2.12.0",
    "eslint": "^6.7.2",
    "eslint-config-prettier": "^6.7.0",
    "prettier": "^1.19.1",
    "serverless-dynamodb-local": "^0.2.38",
    "serverless-offline": "^5.12.1",
    "serverless-plugin-typescript": "^1.1.9",
    "typescript": "^3.7.3"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint": "eslint functions/**.ts",
    "eslint:github-action": "eslint functions/**",
    "fmt": "prettier --write ./**.{json,js,ts,yml,md}",
    "fmt:check": "prettier --check ./**.{json,js,ts,yml,md}"
  },

I expected that the following error would actually appear in the annotation, and hopefully in the PR too.

 /home/runner/work/utom.is/utom.is/functions/a.ts
  1:0  error  Parsing error: Declaration or statement expected

but as you can get the from screenshot, all I have is that the process completed with error 1.

Is my expectation wrong? Or do I have something misconfigured?

Thanks

Couto commented 4 years ago

Just as a FYI, I've also tried with the eslint --format=compact and eslint --format=stylish with no luck.

Couto commented 4 years ago

After some investigation:

Currently the error matchers require that ESLint errors have an error code in them:

{
  "regexp": "^(.+):\\sline\\s(\\d+),\\scol\\s(\\d+),\\s(Error|Warning|Info)\\s-\\s(.+)\\s\\((.+)\\)$",
  "file": 1,
  "line": 2,
  "column": 3,
  "severity": 4,
  "message": 5,
  "code": 6
}

However, not all ESLint error messages have associated codes, specially if it's invalid JavaScript like:

const a = (a: number, b: number): number => a + b;

export const handler = () => {
  make javascript fail again
  async function foo(things) {
    const results = [];
    for (const thing of things) {
      // Bad: each loop iteration is delayed until the entire asynchronous operation completes
      results.push(await bar(thing));
    }
    return baz(results);
  }
};

The script above will result in the following error message:

> @1.0.0 eslint /home/runner/work/
> eslint --format=compact functions/**.ts

/home/runner/work/functions/a.ts: line 4, col 7, Error - Parsing error: ';' expected.

1 problem
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! utom.is@1.0.0 eslint: `eslint --format=compact functions/**.ts`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the utom.is@1.0.0 eslint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/runner/.npm/_logs/2019-12-22T21_43_16_956Z-debug.log
##[error]Process completed with exit code 1.

While it has line and column, it has no error code associated.

bryanmacfarlane commented 4 years ago

The action could potential only register the problem matcher is it detects an eslint config file ...

jsg2021 commented 4 years ago

Could the code capture group be made optional? so it still matches?

Couto commented 3 years ago

I might be wrong, but as a consequence of this, this action doesn't create annotations for typescript/ and react-hooks/ ESLint warning/errors.

Which means that it doesn't annotate around 80% of real-world linting messages.

zomars commented 2 years ago

Yeah, I'd had to use the ataylorme/eslint-annotate-action and generate my own reports since I've thought that setup-node just didn't support it. I'm using a monorepo BTW which make the console output non-standard. So there's that as well...

domdomegg commented 1 year ago

A regex such as:

(?:^|\s)([^\s].+):\sline\s(\d+),\scol\s(\d+),\s(Error|Warning|Info)\s-\s(.+)(?:\s\((.+)\))?

Would likely fix this. I can raise a PR if people are happy with this.

andershagbard commented 2 days ago

Did this ever get merged? I can't get this to work either