Skip to content

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über… #5

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über…

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über… #5

name: Copy labels from linked issue to PR
on:
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
- edited
permissions:
contents: read
issues: read
pull-requests: write
jobs:
copy-issue-labels:
runs-on: ubuntu-latest
steps:
- name: Copy timeline + copy labels
uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.pull_request.number;
console.log(`🔍 PR #${prNumber}`);
const timeline = await github.paginate(
github.rest.issues.listEventsForTimeline,
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
per_page: 100
}
);
console.log(`📜 Timeline-Einträge (${timeline.length}):`);
timeline.forEach((event, i) => {
const label = `#${i + 1} [${event.event}]`;
console.log(`${label} ${JSON.stringify(event, null, 2)}`);
});
const linkedIssue = timeline.find(event =>
event.event === 'connected' &&
event.source?.type === 'issue' &&
event.source?.issue?.number
);
if (!linkedIssue) {
core.warning('❌ Kein verknüpfter Issue über Timeline gefunden.');
return;
}
const issueNumber = linkedIssue.source.issue.number;
core.info(`✅ Verknüpfter Issue: #${issueNumber}`);
const issue = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
const labels = issue.data.labels.map(label => label.name);
if (labels.length === 0) {
core.info('ℹ️ Keine Labels auf dem verknüpften Issue.');
return;
}
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
labels
});
core.info(`🏷️ Labels übertragen: ${labels.join(', ')}`);