Skip to content

End to End Tests

End to End Tests #38

name: End to End Tests
on:
schedule:
# run daily at 2:00 AM UTC
- cron: '0 2 * * *'
# allow manual triggering for testing purposes
workflow_dispatch:
permissions:
contents: read
jobs:
test-symfony-cli-installation:
name: Test Symfony CLI Installation
runs-on: ubuntu-latest
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: none, ctype, dom, iconv, intl, mbstring, pdo_sqlite, simplexml, tokenizer, xml, xmlwriter
php-version: '8.2'
tools: symfony-cli
- name: Configure environment
run: |
git config --global init.defaultBranch main
git config --global user.email "[email protected]"
git config --global user.name "Symfony Demo"
- name: Create project using Symfony CLI
run: symfony new --demo ${{ github.job }}
- name: Test application
working-directory: ${{ github.job }}
run: |
php bin/console about
symfony server:start -d --no-tls
curl --fail --max-time 5 --no-progress-meter --output home.html -v http://127.0.0.1:8000/
symfony server:stop
test-composer-create-project:
name: Test Composer Create Project
runs-on: ubuntu-latest
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: none, ctype, dom, iconv, intl, mbstring, pdo_sqlite, simplexml, tokenizer, xml, xmlwriter
php-version: latest
tools: symfony-cli
- name: Create project using Composer
run: composer create-project symfony/symfony-demo ${{ github.job }}
- name: Test application
working-directory: ${{ github.job }}
run: |
php bin/console about
symfony server:start -d --no-tls
curl --fail --max-time 5 --no-progress-meter --output home.html -v http://127.0.0.1:8000/
symfony server:stop
test-git-clone-installation:
name: Test Git Clone Installation
runs-on: ubuntu-latest
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: none, ctype, dom, iconv, intl, mbstring, pdo_sqlite, simplexml, tokenizer, xml, xmlwriter
php-version: '8.3'
tools: symfony-cli
- name: Clone repository and install dependencies
run: |
git clone https://github.com/symfony/demo.git ${{ github.job }}
cd ${{ github.job }}
composer install
- name: Test application
working-directory: ${{ github.job }}
run: |
php bin/console about
symfony server:start -d --no-tls
curl --fail --max-time 5 --no-progress-meter --output home.html -v http://127.0.0.1:8000/
symfony server:stop
notify-on-failure:
if: ${{ always() && contains(needs.*.result, 'failure') }}
name: Notify on Failure
needs: [test-symfony-cli-installation, test-composer-create-project, test-git-clone-installation]
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Create Issue on Failure
uses: actions/github-script@v7
env:
NEEDS_CONTEXT: ${{ toJSON(needs) }}
with:
script: |
const needsContext = JSON.parse(process.env.NEEDS_CONTEXT);
// Map job ids to human-readable names used in the workflow UI
const jobNames = {
'test-symfony-cli-installation': 'Test Symfony CLI Installation',
'test-composer-create-project': 'Test Composer Create Project',
'test-git-clone-installation': 'Test Git Clone Installation',
};
const failedJobs = Object.entries(needsContext)
.filter(([, v]) => v.result === 'failure')
.map(([id]) => `- **${jobNames[id] || id}**: failed`);
const runUrl = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`;
const date = new Date().toISOString().split('T')[0];
const title = `E2E Test Failure: ${date}`;
const body = [
'The daily end-to-end test workflow has failed.',
'',
'This may indicate users are experiencing issues installing the Symfony Demo application.',
'',
`**Run**: ${runUrl}`,
'',
'### Failed Jobs',
failedJobs.join('\n'),
'',
'Please investigate and fix the installation issues as soon as possible.'
].join('\n');
// Ensure label exists
const owner = context.repo.owner;
const repo = context.repo.repo;
const labelName = 'bug';
try {
await github.rest.issues.getLabel({ owner, repo, name: labelName });
} catch {
await github.rest.issues.createLabel({
owner, repo, name: labelName, color: 'd73a4a', description: 'Something is broken'
});
}
// Reuse an open issue for today if it already exists to avoid duplicates
const { data: issues } = await github.rest.issues.listForRepo({
owner, repo, state: 'open', labels: labelName, per_page: 100
});
const existing = issues.find(i => i.title === title);
if (existing) {
await github.rest.issues.createComment({
owner, repo, issue_number: existing.number,
body: `Another failing run detected.\n\n${body}`
});
} else {
await github.rest.issues.create({ owner, repo, title, body, labels: [labelName] });
}