94
94
symfony server:stop
95
95
96
96
notify-on-failure :
97
- if : failure()
97
+ if : ${{ always() && contains(needs.*.result, 'failure') }}
98
98
name : Notify on Failure
99
99
needs : [test-symfony-cli-installation, test-composer-create-project, test-git-clone-installation]
100
100
runs-on : ubuntu-latest
@@ -105,28 +105,63 @@ jobs:
105
105
steps :
106
106
- name : Create Issue on Failure
107
107
uses : actions/github-script@v7
108
+ env :
109
+ NEEDS_CONTEXT : ${{ toJSON(needs) }}
108
110
with :
109
111
script : |
110
- const title = `End to End Test Failed - ${new Date().toISOString().split('T')[0]}`;
111
- const body = `The daily end to end test workflow has failed.
112
-
113
- This means users may be experiencing issues installing the Symfony Demo application.
114
-
115
- **Failed Jobs:**
116
- - Check the workflow run for details: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
117
-
118
- **Installation Methods Tested:**
119
- - Symfony CLI installation
120
- - Composer create-project
121
- - Git clone + composer install
122
-
123
- Please investigate and fix the installation issues as soon as possible.
124
- `;
125
-
126
- github.rest.issues.create({
127
- owner: context.repo.owner,
128
- repo: context.repo.repo,
129
- title: title,
130
- body: body,
131
- labels: ['bug']
112
+ const needsContext = JSON.parse(process.env.NEEDS_CONTEXT);
113
+
114
+ // Map job ids to human-readable names used in the workflow UI
115
+ const jobNames = {
116
+ 'test-symfony-cli-installation': 'Test Symfony CLI Installation',
117
+ 'test-composer-create-project': 'Test Composer Create Project',
118
+ 'test-git-clone-installation': 'Test Git Clone Installation',
119
+ };
120
+
121
+ const failedJobs = Object.entries(needsContext)
122
+ .filter(([, v]) => v.result === 'failure')
123
+ .map(([id]) => `- **${jobNames[id] || id}**: failed`);
124
+
125
+ const runUrl = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`;
126
+ const date = new Date().toISOString().split('T')[0];
127
+ const title = `E2E Test Failure: ${date}`;
128
+
129
+ const body = [
130
+ 'The daily end-to-end test workflow has failed.',
131
+ '',
132
+ 'This may indicate users are experiencing issues installing the Symfony Demo application.',
133
+ '',
134
+ `**Run**: ${runUrl}`,
135
+ '',
136
+ '### Failed Jobs',
137
+ failedJobs.join('\n'),
138
+ '',
139
+ 'Please investigate and fix the installation issues as soon as possible.'
140
+ ].join('\n');
141
+
142
+ // Ensure label exists
143
+ const owner = context.repo.owner;
144
+ const repo = context.repo.repo;
145
+ const labelName = 'bug';
146
+ try {
147
+ await github.rest.issues.getLabel({ owner, repo, name: labelName });
148
+ } catch {
149
+ await github.rest.issues.createLabel({
150
+ owner, repo, name: labelName, color: 'd73a4a', description: 'Something is broken'
151
+ });
152
+ }
153
+
154
+ // Reuse an open issue for today if it already exists to avoid duplicates
155
+ const { data: issues } = await github.rest.issues.listForRepo({
156
+ owner, repo, state: 'open', labels: labelName, per_page: 100
132
157
});
158
+ const existing = issues.find(i => i.title === title);
159
+
160
+ if (existing) {
161
+ await github.rest.issues.createComment({
162
+ owner, repo, issue_number: existing.number,
163
+ body: `Another failing run detected.\n\n${body}`
164
+ });
165
+ } else {
166
+ await github.rest.issues.create({ owner, repo, title, body, labels: [labelName] });
167
+ }
0 commit comments