Skip to content

Configurar o SonarCloud para um projeto usando Jest

Bruno Carmo Nunes edited this page Oct 24, 2022 · 3 revisions

Como configurar o SonarCloud para um projeto usando Jest

Histórico de Revisão

Data Versão Descrição Revisor
17/11/2021 1.0 Versão Inicial Henrique Martins de Messias
19/11/2021 1.1 Adição do parser Henrique Martins de Messias
20/10/2022 1.2 Atualização dos procedimentos Bruno Carmo Nunes

O que será usado

  • Github Actions
  • Node
  • SonarCloud
  • Jest

Passo 1 - Criar arquivo de propriedades do SonarCloud

Na raiz do projeto, crie um arquivo chamado sonar-project.properties com o seguinte conteúdo:

sonar.organization=fga-eps-mds-1
sonar.projectKey=fga-eps-mds_<nome_do_repositorio>

sonar.projectName=<nome_do_repositorio>

sonar.sources= src/
sonar.tests= __tests__/
sonar.language=js
sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.coverage.exclusions=__tests__/,
sonar.testExecutionReportPaths=coverage/jest-report.xml

Os valores de sonar.organization e sonar.projectKey podem ser encontrados ao acessar o SonarCloud e acessar a área de informação do projeto.

Os valores de sonar.sources e sonar.tests podem variar dependendo do seu projeto.

Não esqueça de dar o commit e enviar o novo arquivo para sua organização no github, caso não mande pode ocorrer problemas na configuração do SonarCloud.

Passo 2 - Adicionar Secret no repositório

Independentemente da linguagem usada no projeto, é necessário adicionar uma secret chamada SONAR_TOKEN.

Para adicionar a secret no repositório:

  1. Entre no SonarCloud com sua conta github que tenha vinculado o repositório da disciplina;
  2. Adicione a análise de um novo projeto no canto superior à direita;

Default user

  1. Selecione a organização EPS/MDS, e escolha o repositório do seu projeto.

Default user

  1. Quando selecionado, escolhe o método de análise sendo o Github Actions.

Default user

  1. Copie o token mostrado no campo 2 (o que vem após Value field);

Default user

  1. Vá para a página do seu projeto no GitHub e clique em Settings e depois clique em Secrets;

Default user

  1. Clique em New repository secret;

Default user

  1. Na parte Name coloque: SONAR_TOKEN;

Default user

  1. Na parte Value cole o código copiado no passo 5;

Default user

  1. Clique em Add secret.

Default user

Passo 3 - Criar parser de métricas

Inclua no seu package.json as dependências de desenvolvimento:

npm install -D jest
npm install -D jest-config
npm install -D jest-sonar

Na raiz do repositório, crie um arquivo chamado jest.config.js com o seguinte conteúdo:

module.exports = {
  moduleDirectories: ['node_modules', '<rootDir>/'],
  moduleFileExtensions: [
    'js',
    'mjs',
    'cjs',
    'jsx',
    'ts',
    'tsx',
    'json',
    'node',
  ],
  collectCoverage: true,
  collectCoverageFrom: ['./src/**'],
  coveragePathIgnorePatterns: [
    '/src/server.js',
  ],
  testFailureExitCode: 0,
  reporters: [
    'default',
    [
      'jest-sonar',
      {
        outputDirectory: 'coverage/',
        outputName: 'jest-report.xml',
        reportedFilePath: 'relative',
        relativeRootDir: '<rootDir>/../',
      },
    ],
  ],
  testMatch: [
    '**/*.test.js',
  ],
};


module.exports = createJestConfig(customJestConfig)

Esse arquivo serve para escolher o que irá testar e também para gerar as métricas destinadas ao SonarCloud, que irá criar uma pasta coverage e enviar quando a Actions for ativada pelo GitHub.

Passo 4 - Configurar workflow no GitHub Actions

Crie um arquivo chamado .github/workflows/<nome_do_arquivo>.yml com o seguinte conteúdo:

on:
  push:
    branches:
      - main

name: SonarCloud
jobs:
  sonarcloud:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        fetch-depth: 0
    - name: Get main
      run:  git fetch origin main
    - name: Instalar dependencias
      run:  npm install
    - name: Instalar Jest
      run:  npm install -g jest
    - name: Executar testes
      run:  jest --coverage --runInBand --detectOpenHandles --forceExit
    - name: SonarCloud Scan
      uses: sonarsource/sonarcloud-github-action@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

Obs: o secrets.GITHUB_TOKEN é disponibilizado automaticamente pelo GitHub.

Os passos importantes desse pipeline são Executar testes e SonarCloud Scan. O seu projeto pode configurar o pipeline de maneiras diferentes, mas certifique-se que esses dois passos estejam presentes.

Passo 5 - Extrair métricas

Crie um arquivo chamado .github/workflows/<nome_do_arquivo>.yml com o seguinte conteúdo:

name: ReleaseMetrics
on:
  push:
    tags:
      - "v*"
jobs:
  generate-release:
    runs-on: ubuntu-latest
    steps:
      - name: Get file name
        id: name
        run: echo "::set-output name=file_name::fga-eps-mds-<nome_do_repositorio>-$(TZ='America/Sao_Paulo' date +'%m-%d-%Y-%H-%M-%S')-${{github.ref_name}}"
      - name: Copy repository
        uses: actions/checkout@v2
      - run: wget $METRICS_URL -O ${{ steps.name.outputs.file_name }}.json
        env:
          METRICS_URL: ${{ secrets.METRICS_URL }}
      - uses: actions/upload-artifact@v2
        with:
          name: ${{ steps.name.outputs.file_name }}.json
          path: ${{ steps.name.outputs.file_name }}.json

      - name: Send metrics to docs repo
        uses: dmnemec/[email protected]
        env:
          API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
        with:
          source_file: ${{ steps.name.outputs.file_name }}.json
          destination_repo: 'fga-eps-mds/<nome_do_repositorio-de-documentacao>'
          destination_folder: 'analytics-raw-data'
          user_email: ${{ secrets.GIT_EMAIL}}
          user_name: ${{ secrets.GIT_USER }}
          commit_message: New metrics from ${{ github.event.repository.name }}
      

No passo name, modifique a string com o nome do repositório.

Crie uma secret chamada METRICS_URL, para ser passado as informações das métricas geradas pela API do SonarCloud. Como um link exemplo (12 métricas):

https://sonarcloud.io/api/measures/component_tree?component=PROJECT_KEY&metricKeys=files,functions,complexity,comment_lines_density,duplicated_lines_density,coverage,ncloc,tests,test_errors,test_failures,test_execution_time,security_rating&ps=500&p=1

Sendo que em PROJECT_KEY (valor da variável component), é a chave do repositório no SonarCloud. A mesma utilizada no passo 1 na parte de sonar-project.properties.

O API_TOKEN_GITHUB, é obtido na configuração do usuário, e em configurações de desenvolvedor. Necessitando selecionar todas as configurações do repositório (repo).

Default user

Ao gerar o token, copie ele e crie um secret com o nome API_TOKEN_GITHUB.

Na variável destination_repo, coloque o nome do repositório da documentação do seu projeto (O mesmo link que o github utiliza na url).

Crie também dois secrets GIT_EMAIL e GIT_USER, representando as são informações do e-mail e usuário do github usados na seção.

Com isso, o arquivo de extração de métricas está pronto, ele somente irá ser ativado caso o usuário mande uma tag de versão do repositório para o github.

Resumo dos secrets

Segue abaixo a quantidade de secrets criadas nessa documentação.

Default user

Extra - Resolvendo Erro de Automatic Analysis

Caso você receba o seguinte erro:

You are running CI analysis while Automatic Analysis is enabled. Please consider disabling one or the other

É necessário desabilitar o scan automático do repositório no SonarCloud. Para isso:

  1. Vá para a página do seu projeto no SonarCloud;
  2. Na aba Administration, clique em Analysis Method;
  3. Na seção SonarCloud Automatic Analysis, clique no botão para desabilitar.
Clone this wiki locally