/
vshmidt
/
streamlit
Обзор
Документация
Войти
/
vshmidt
/
streamlit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
.github/workflows/require-labels.yml
94 строки
4 KB
Laura Wilby
Remove agent-knowledge and specs from CI workflow paths-ignore (#13110)
25 ноя 2025, 00:59
Не верифицирован
25 ноя 2025, 00:59
a8358e9
Код
Авторство
О чём код?
name: Pull Request Labels on: pull_request: types: [opened, labeled, unlabeled, synchronize] jobs: check-required-labels: runs-on: ubuntu-latest permissions: pull-requests: read steps: - name: Check required labels uses: actions/github-script@v8 with: script: | const requiredLabels = { 'security-assessment': { mode: 'exactly', count: 1, labels: ['security-assessment-completed'] }, 'do-not-merge': { mode: 'exactly', count: 0, labels: ['do-not-merge'] }, 'change-description': { mode: 'exactly', count: 1, labels: ['change:feature', 'change:bugfix', 'change:refactor', 'change:chore', 'change:docs', 'change:other', 'change:spec'] }, 'impact-defined': { mode: 'exactly', count: 1, labels: ['impact:users', 'impact:internal'] } }; const prNumber = context.payload.pull_request.number; const { data: prLabels } = await github.rest.issues.listLabelsOnIssue({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber }); const prLabelNames = prLabels.map(label => label.name); console.log(`PR #${prNumber} has labels: ${prLabelNames.join(', ')}`); let hasErrors = false; let errorMessages = []; const bypassLabel = 'change:spec'; const hasBypassLabel = prLabelNames.includes(bypassLabel); const bypassedChecks = hasBypassLabel ? new Set(['security-assessment', 'impact-defined']) : new Set(); for (const [checkName, check] of Object.entries(requiredLabels)) { if (bypassedChecks.has(checkName)) { errorMessages.push(`⚠️ ${checkName}: Skipped because "${bypassLabel}" label is present`); continue; } const { mode, count, labels } = check; const matchedLabels = prLabelNames.filter(name => labels.includes(name)); if (mode === 'exactly' && matchedLabels.length !== count) { if (count === 0 && matchedLabels.length > 0) { // Forbidden label is present errorMessages.push(`❌ ${checkName}: Label "${matchedLabels.join(', ')}" should not be present`); } else if (count === 1 && matchedLabels.length === 0) { // Required label is missing errorMessages.push(`❌ ${checkName}: Missing one of these labels: [${labels.join(', ')}]`); } else if (count === 1 && matchedLabels.length > 1) { // Too many labels from a group errorMessages.push(`❌ ${checkName}: Too many labels selected. Choose only one of: [${labels.join(', ')}]`); } else { // Generic error message errorMessages.push(`❌ ${checkName}: Expected exactly ${count} of [${labels.join(', ')}], but found ${matchedLabels.length}`); } hasErrors = true; } else { // Success message for logging errorMessages.push(`✅ ${checkName}: Requirement satisfied`); } } // Log all messages for visibility errorMessages.forEach(msg => console.log(msg)); if (hasErrors) { const failMessage = 'PR label requirements not met:\n' + errorMessages.filter(msg => msg.startsWith('❌')).join('\n'); core.setFailed(failMessage); }