-
Notifications
You must be signed in to change notification settings - Fork 24
159 lines (128 loc) · 6.04 KB
/
2-prepare-release-pr.yml
File metadata and controls
159 lines (128 loc) · 6.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
name: Open PR develop -> main (AI Assisted)
on:
push:
branches: [develop]
permissions:
pull-requests: write
contents: write # 'write' é necessário para fazer o checkout e ler o histórico
concurrency:
group: open-pr-develop-to-main
cancel-in-progress: true
jobs:
open_pr:
runs-on: ubuntu-latest
env:
# Pré-requisito: Adicione o segredo da sua API KEY nas configurações do repositório
LOG_LEVEL: info
ENV: prod
LLM_PROVIDER: OPENAI
LOG_FILE: ./app.log
OPENAI_MODEL: gpt-5.2
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# Garante que o Go instale os binários em um local conhecido
GOPATH: ${{ github.workspace }}/go
steps:
# Security (M16): Mask API key to prevent accidental log exposure
- name: Mask sensitive environment variables
run: |
echo "::add-mask::${{ secrets.OPENAI_API_KEY }}"
- name: Checkout repository
uses: actions/checkout@v6
with:
# fetch-depth: 0 é essencial para buscar todo o histórico e poder comparar as branches
fetch-depth: 0
- name: Fetch main branch to ensure it exists
run: git fetch origin main
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Install ChatCLI
run: go install github.com/diillson/chatcli@latest
- name: Add Go bin to PATH
run: echo "${{ env.GOPATH }}/bin" >> $GITHUB_PATH
- name: Generate PR Content with ChatCLI
id: generate-pr-content
run: |
# 1. Coletar o contexto: logs e diff de arquivos entre main e develop
LOG_DIFF=$(git log origin/main..develop --pretty=format:"- %s (%h) by %an")
FILE_DIFF=$(git diff --stat origin/main..develop)
# 2. Criar um prompt detalhado para a IA
PROMPT=$(cat <<EOF
Sua única tarefa é em inglês, gerar um título e um corpo para um Pull Request, mesclando 'develop' em 'main'. O projeto usa squash merge.
Sua resposta DEVE SEGUIR ESTRITAMENTE O SEGUINTE FORMATO, sem nenhuma palavra ou texto adicional antes ou depois:
<TÍTULO DO PR SEGUINDO CONVENTIONAL COMMITS>
---
<CORPO DO PR EM MARKDOWN>
**Exemplo de formato esperado:**
feat(sessions): Adiciona gerenciamento de sessões de conversa
---
### Novas Funcionalidades
- Adicionado o comando \`/session\` com as sub-ações \`save\`, \`load\`, \`list\`, e \`delete\` para permitir que os usuários persistam e retomem conversas.
- As sessões são salvas como arquivos JSON no diretório \`~/.chatcli/sessions/\`.
### Melhorias
- O prompt do CLI agora exibe o nome da sessão ativa para melhor contexto do usuário.
NÃO inclua explicações, introduções ou qualquer texto fora deste formato.
**Use o seguinte contexto para gerar o título e o corpo:**
**Log de Commits:**
${LOG_DIFF}
**Resumo das Alterações nos Arquivos:**
${FILE_DIFF}
EOF
)
# 3. Executar o chatcli em modo one-shot para gerar o conteúdo
# Usamos --no-anim para uma saída limpa no log do CI
AI_RESPONSE=$(chatcli -p "$PROMPT" --no-anim --raw --provider OPENAI --model gpt-5.2)
# 4. Salvar a resposta completa para o próximo passo
# Usamos a sintaxe recomendada para outputs de múltiplas linhas
echo "ai_response<<EOF" >> $GITHUB_OUTPUT
echo "$AI_RESPONSE" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Open or reuse PR develop -> main
uses: actions/github-script@v9
env:
AI_RESPONSE_CONTENT: ${{ steps.generate-pr-content.outputs.ai_response }}
with:
github-token: ${{ secrets.GH_RELEASE_TOKEN }}
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const head = 'develop';
const base = 'main';
// 1. Verificar se um PR já existe
const { data: prs } = await github.rest.pulls.list({
owner, repo, state: 'open', head, base, per_page: 1
});
if (prs.length > 0) {
core.info(`PR já existe: #${prs[0].number}. Nenhuma ação necessária.`);
return;
}
// 2. Processar a resposta da IA lendo da ENV (Seguro contra caracteres especiais)
const ai_response = process.env.AI_RESPONSE_CONTENT.trim();
let title = `Merge develop into main`; // Título de fallback
let body = `PR automático para promover mudanças da develop à main.`; // Corpo de fallback
// Tentativa 1: Separador ideal "---"
let parts = ai_response.split('\n---\n');
if (parts.length >= 2) {
title = parts[0].trim();
body = parts[1].trim();
core.info("Resposta da IA parseada com sucesso usando '---'.");
} else {
// Lógica de fallback...
const firstNewlineIndex = ai_response.indexOf('\n');
if (firstNewlineIndex !== -1) {
title = ai_response.substring(0, firstNewlineIndex).trim();
body = ai_response.substring(firstNewlineIndex + 1).trim();
title = title.replace(/^#+\s*/, '');
core.info("Usando fallback: primeira linha como título.");
} else {
title = ai_response;
core.warning("Resposta da IA não continha quebras de linha.");
}
}
// 3. Criar o Pull Request
const { data: pr } = await github.rest.pulls.create({
owner, repo, head, base, title, body
});
core.info(`PR criado com sucesso: #${pr.number}`);
core.info(`Título: ${title}`);