Skip to content

Commit 37fa2c5

Browse files
Config/quality and codesmell (#31)
feat: Configura pipeline de CI para detecção de Code Smells e criação automática de Issues.
1 parent 86533ed commit 37fa2c5

24 files changed

+1153
-731
lines changed

.github/workflows/cicd.yml

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,83 @@ jobs:
1414

1515
test-pipeline:
1616
runs-on: ubuntu-latest
17+
permissions:
18+
contents: read
19+
issues: write
1720

1821
steps:
19-
- name: 1. Obter o código (Checkout)
22+
- name: Obter o código (Checkout)
2023
uses: actions/checkout@v4
2124
with:
2225
fetch-depth: 0
2326

24-
- name: 2. Configurar Node.js
27+
- name: Configurar Node.js
2528
uses: actions/setup-node@v4
2629
with:
2730
node-version: '18'
2831
cache: 'npm'
2932

30-
- name: 3. Instalar dependências do projeto
33+
- name: Instalar dependências do backend
3134
run: npm install
35+
working-directory: ./backend
3236

33-
- name: 4. Rodar Testes e Gerar Cobertura (lcov)
34-
run: npm test -- --coverage
37+
- name: Rodar Testes e Gerar Cobertura (lcov)
38+
run: npm run test:coverage
39+
working-directory: ./backend
3540

36-
- name: 5. Executar Análise de Qualidade (QLTY)
37-
# Usa a Action oficial da Qlty para análise e envio dos dados
38-
uses: qltysh/qlty-action
39-
with:
40-
token: ${{ secrets.QLTY_TOKEN }}
41-
path: .
41+
- name: Instalar Qlty CLI
42+
uses: qltysh/qlty-action/install@main
43+
44+
- name: Inicializar Qlty
45+
run: qlty init --no
46+
47+
- name: Rodar Qlty smells e salvar resultados
48+
run: qlty check --sarif . > ../qlty_report.json
49+
working-directory: ./backend
50+
continue-on-error: true
51+
52+
- name: Instalar GitHub CLI (gh)
53+
run: sudo apt-get install gh -y
54+
55+
- name: Debug - Mostrar Conteúdo do Relatório Qlty
56+
run: cat qlty_report.json
57+
58+
- name: Criar Issues no GitHub a partir do Relatório
59+
env:
60+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61+
run: |
62+
REPORT_FILE="qlty_report.json"
63+
64+
if [ ! -s $REPORT_FILE ]; then
65+
echo "Relatório Qlty não encontrado ou vazio. Nenhuma Issue será criada."
66+
exit 0
67+
fi
68+
69+
echo "Processando o relatório Qlty SARIF..."
70+
71+
sudo apt-get install jq -y
72+
73+
jq -c '.runs[0].results[]' $REPORT_FILE | while read -r i; do
74+
75+
RULE_ID=$(echo $i | jq -r '.ruleId')
76+
77+
FILE_URI=$(echo $i | jq -r '.locations[0].physicalLocation.artifactLocation.uri')
78+
79+
LINE=$(echo $i | jq -r '.locations[0].physicalLocation.region.startLine')
80+
81+
MESSAGE=$(echo $i | jq -r '.message.text' | sed 's/"/\\"/g')
82+
83+
TITLE="[Qlty Smell] $RULE_ID em $FILE_URI"
84+
85+
EXISTING_ISSUES=$(gh issue list --search "$TITLE label:technical-debt is:open" --json number --jq '.[0].number' --repo ${{ github.repository }} || echo "")
86+
87+
if [ -n "$EXISTING_ISSUES" ]; then
88+
echo "Issue duplicada encontrada (#$EXISTING_ISSUES) para: $TITLE. Pulando criação."
89+
else
90+
91+
BODY="**Detalhes do Débito Técnico**\n\n- **Regra:** $RULE_ID\n- **Arquivo:** \`$FILE_URI\`\n- **Linha:** $LINE\n\n---\n**Mensagem do Qlty:** $MESSAGE\n\n\nCriado automaticamente pelo pipeline de CI."
92+
93+
gh issue create --title "$TITLE" --body "$BODY" --label "technical-debt" --repo ${{ github.repository }}
94+
echo "Issue criada para: $TITLE"
95+
fi
96+
done

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,6 @@ Construir um sistema de ponta a ponta que rastreia fóruns, processa o texto das
4646
### Cobertura de testes:
4747
- No terminal dentro da pasta backend, execute o comando: npm run test:coverage
4848
- Para verificar a cobertura de testes, entre na pasta backend/src/coverage/lcov-report e abra o arquivo index.html no navegador para melhor análise.
49+
50+
51+
## Configuração da verificação de code smells:

backend/src/coverage/clover.xml

Lines changed: 136 additions & 112 deletions
Large diffs are not rendered by default.

backend/src/coverage/coverage-final.json

Lines changed: 7 additions & 10 deletions
Large diffs are not rendered by default.

backend/src/coverage/lcov-report/index.html

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,30 @@ <h1>All files</h1>
2323
<div class='clearfix'>
2424

2525
<div class='fl pad1y space-right2'>
26-
<span class="strong">67.22% </span>
26+
<span class="strong">58.16% </span>
2727
<span class="quiet">Statements</span>
28-
<span class='fraction'>80/119</span>
28+
<span class='fraction'>89/153</span>
2929
</div>
3030

3131

3232
<div class='fl pad1y space-right2'>
33-
<span class="strong">55% </span>
33+
<span class="strong">43.75% </span>
3434
<span class="quiet">Branches</span>
35-
<span class='fraction'>11/20</span>
35+
<span class='fraction'>14/32</span>
3636
</div>
3737

3838

3939
<div class='fl pad1y space-right2'>
40-
<span class="strong">29.41% </span>
40+
<span class="strong">25.64% </span>
4141
<span class="quiet">Functions</span>
42-
<span class='fraction'>10/34</span>
42+
<span class='fraction'>10/39</span>
4343
</div>
4444

4545

4646
<div class='fl pad1y space-right2'>
47-
<span class="strong">67.22% </span>
47+
<span class="strong">58.55% </span>
4848
<span class="quiet">Lines</span>
49-
<span class='fraction'>80/119</span>
49+
<span class='fraction'>89/152</span>
5050
</div>
5151

5252

@@ -79,48 +79,48 @@ <h1>All files</h1>
7979
</tr>
8080
</thead>
8181
<tbody><tr>
82-
<td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83-
<td data-value="85" class="pic high">
84-
<div class="chart"><div class="cover-fill" style="width: 85%"></div><div class="cover-empty" style="width: 15%"></div></div>
82+
<td class="file medium" data-value="src"><a href="src/index.html">src</a></td>
83+
<td data-value="56.92" class="pic medium">
84+
<div class="chart"><div class="cover-fill" style="width: 56%"></div><div class="cover-empty" style="width: 44%"></div></div>
8585
</td>
86-
<td data-value="85" class="pct high">85%</td>
87-
<td data-value="40" class="abs high">34/40</td>
88-
<td data-value="50" class="pct medium">50%</td>
89-
<td data-value="10" class="abs medium">5/10</td>
90-
<td data-value="83.33" class="pct high">83.33%</td>
91-
<td data-value="6" class="abs high">5/6</td>
92-
<td data-value="85" class="pct high">85%</td>
93-
<td data-value="40" class="abs high">34/40</td>
86+
<td data-value="56.92" class="pct medium">56.92%</td>
87+
<td data-value="65" class="abs medium">37/65</td>
88+
<td data-value="31.25" class="pct low">31.25%</td>
89+
<td data-value="16" class="abs low">5/16</td>
90+
<td data-value="62.5" class="pct medium">62.5%</td>
91+
<td data-value="8" class="abs medium">5/8</td>
92+
<td data-value="56.92" class="pct medium">56.92%</td>
93+
<td data-value="65" class="abs medium">37/65</td>
9494
</tr>
9595

9696
<tr>
9797
<td class="file medium" data-value="src/business"><a href="src/business/index.html">src/business</a></td>
98-
<td data-value="77.41" class="pic medium">
99-
<div class="chart"><div class="cover-fill" style="width: 77%"></div><div class="cover-empty" style="width: 23%"></div></div>
98+
<td data-value="66.66" class="pic medium">
99+
<div class="chart"><div class="cover-fill" style="width: 66%"></div><div class="cover-empty" style="width: 34%"></div></div>
100100
</td>
101-
<td data-value="77.41" class="pct medium">77.41%</td>
102-
<td data-value="31" class="abs medium">24/31</td>
103-
<td data-value="60" class="pct medium">60%</td>
104-
<td data-value="10" class="abs medium">6/10</td>
105-
<td data-value="20" class="pct low">20%</td>
106-
<td data-value="10" class="abs low">2/10</td>
107-
<td data-value="77.41" class="pct medium">77.41%</td>
108-
<td data-value="31" class="abs medium">24/31</td>
101+
<td data-value="66.66" class="pct medium">66.66%</td>
102+
<td data-value="45" class="abs medium">30/45</td>
103+
<td data-value="56.25" class="pct medium">56.25%</td>
104+
<td data-value="16" class="abs medium">9/16</td>
105+
<td data-value="15.38" class="pct low">15.38%</td>
106+
<td data-value="13" class="abs low">2/13</td>
107+
<td data-value="66.66" class="pct medium">66.66%</td>
108+
<td data-value="45" class="abs medium">30/45</td>
109109
</tr>
110110

111111
<tr>
112-
<td class="file high" data-value="src/controller"><a href="src/controller/index.html">src/controller</a></td>
113-
<td data-value="81.81" class="pic high">
114-
<div class="chart"><div class="cover-fill" style="width: 81%"></div><div class="cover-empty" style="width: 19%"></div></div>
112+
<td class="file medium" data-value="src/controller"><a href="src/controller/index.html">src/controller</a></td>
113+
<td data-value="52.94" class="pic medium">
114+
<div class="chart"><div class="cover-fill" style="width: 52%"></div><div class="cover-empty" style="width: 48%"></div></div>
115115
</td>
116-
<td data-value="81.81" class="pct high">81.81%</td>
117-
<td data-value="22" class="abs high">18/22</td>
116+
<td data-value="52.94" class="pct medium">52.94%</td>
117+
<td data-value="34" class="abs medium">18/34</td>
118118
<td data-value="100" class="pct high">100%</td>
119119
<td data-value="0" class="abs high">0/0</td>
120-
<td data-value="66.66" class="pct medium">66.66%</td>
121-
<td data-value="3" class="abs medium">2/3</td>
122-
<td data-value="81.81" class="pct high">81.81%</td>
123-
<td data-value="22" class="abs high">18/22</td>
120+
<td data-value="33.33" class="pct low">33.33%</td>
121+
<td data-value="6" class="abs low">2/6</td>
122+
<td data-value="54.54" class="pct medium">54.54%</td>
123+
<td data-value="33" class="abs medium">18/33</td>
124124
</tr>
125125

126126
<tr>
@@ -129,13 +129,13 @@ <h1>All files</h1>
129129
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
130130
</td>
131131
<td data-value="0" class="pct low">0%</td>
132-
<td data-value="22" class="abs low">0/22</td>
132+
<td data-value="5" class="abs low">0/5</td>
133133
<td data-value="100" class="pct high">100%</td>
134134
<td data-value="0" class="abs high">0/0</td>
135135
<td data-value="0" class="pct low">0%</td>
136-
<td data-value="14" class="abs low">0/14</td>
136+
<td data-value="11" class="abs low">0/11</td>
137137
<td data-value="0" class="pct low">0%</td>
138-
<td data-value="22" class="abs low">0/22</td>
138+
<td data-value="5" class="abs low">0/5</td>
139139
</tr>
140140

141141
<tr>
@@ -161,7 +161,7 @@ <h1>All files</h1>
161161
<div class='footer quiet pad2 space-top1 center small'>
162162
Code coverage generated by
163163
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164-
at 2025-11-16T16:41:26.687Z
164+
at 2025-11-20T19:46:45.688Z
165165
</div>
166166
<script src="prettify.js"></script>
167167
<script>

backend/src/coverage/lcov-report/src/app.ts.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> app.ts<
139139
<div class='footer quiet pad2 space-top1 center small'>
140140
Code coverage generated by
141141
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
142-
at 2025-11-16T16:41:26.687Z
142+
at 2025-11-20T19:46:45.688Z
143143
</div>
144144
<script src="../prettify.js"></script>
145145
<script>

0 commit comments

Comments
 (0)