| name: Helix CI |
| on: |
| push: |
| branches: [ master ] |
| schedule: |
| - cron: '0 */12 * * *' |
| |
| permissions: write-all |
| |
| jobs: |
| Merge_PR_CI: |
| |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v2 |
| - name: Set up JDK 11 |
| uses: actions/setup-java@v1 |
| with: |
| java-version: 11 |
| - name: Delete frontend-maven-plugin dir |
| run: rm -rf .m2\repository\com\github\eirslett |
| - name: Build with Maven |
| run: mvn clean install -Dmaven.test.skip.exec=true -DretryFailedDeploymentCount=5 |
| - name: Run All Tests |
| run: mvn -q -fae test |
| - name: Upload to Codecov |
| run: bash <(curl -s https://codecov.io/bash) |
| if: ${{ github.repository == 'apache/helix' && github.event_name == 'push' && (success() || failure()) }} |
| - name: Generate Test Report |
| uses: dorny/test-reporter@v1 |
| if: ${{ success() || failure() }} |
| with: |
| name: Tests Results |
| path: './**/target/surefire-reports/TEST-TestSuite.xml' |
| reporter: java-junit |
| - name: Upload Unit Test Results as Artifacts |
| if: failure() |
| uses: actions/upload-artifact@v2 |
| with: |
| name: surefire-reports |
| path: ./**/target/surefire-reports/ |
| if-no-files-found: ignore |
| - name: Print Tests Results |
| run: .github/scripts/printTestResult.sh |
| if: ${{ success() || failure() }} |
| - name: Report Failed Tests as GitHub Issues |
| uses: actions/github-script@v4 |
| with: |
| github-token: ${{secrets.GITHUB_TOKEN}} |
| script: | |
| const fs = require('fs'); |
| const readline = require('readline'); |
| |
| var run_url = 'Unknown URL. Run ID is ' + context.runId |
| if (process.env.GITHUB_SERVER_URL && process.env.GITHUB_REPOSITORY && process.env.GITHUB_RUN_ID ) { |
| run_url = process.env.GITHUB_SERVER_URL + '/' + process.env.GITHUB_REPOSITORY + '/actions/runs/' + process.env.GITHUB_RUN_ID |
| } |
| |
| const failureReportPath = './FailingTest.out' |
| // 1. Search for any test failures |
| if (!fs.existsSync(failureReportPath)) { |
| console.log('No test failure report found.') |
| return |
| } |
| |
| var response = await github.issues.listForRepo({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| labels: ['FailedTestTracking'], |
| state: ['all'] |
| }) |
| const existingIssues = response.data.filter((data) => !data.pull_request) |
| |
| const lineReader = readline.createInterface({ |
| input: fs.createReadStream('./FailingTest.out') |
| }); |
| const failingTests = [] |
| for await (const line of lineReader) { |
| failingTests.push(line) |
| } |
| |
| for (failingTest of failingTests) { |
| // 2. Creating issues for the failing tests |
| console.log('Failing test identified:\n' + failingTest) |
| if (failingTest) { |
| const testInfo = failingTest.split(' ')[0] |
| const issueTitle = '[Failed CI Test] ' + testInfo |
| if (issueTitle) { |
| console.log('Adding comment to issue: ' + issueTitle) |
| var issue = null |
| // 2.1. Check existing test issues, create new ones for the failing tests if not exist. |
| for (existingIssue of existingIssues) { |
| if (existingIssue.title == issueTitle) { |
| issue = existingIssue |
| break |
| } |
| } |
| if (!issue) { |
| console.log('Creating issue: ' + issueTitle) |
| response = await github.issues.create({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| labels: ['FailedTestTracking'], |
| title: issueTitle, |
| body: 'This issue is created for tracking unstable test: ' + testInfo |
| }); |
| issue = response.data |
| } else { |
| // 2.2. Reopen the tickets if needed. |
| if (issue.state != 'open') { |
| console.log('Reopen issue: ' + issueTitle) |
| await github.issues.update({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| issue_number: issue.number, |
| state: 'open' |
| }); |
| } |
| } |
| // 2.3. Adding the most recent failure to the ticket. |
| console.log('Add comment to issue: ' + issueTitle) |
| github.issues.createComment({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| issue_number: issue.number, |
| body: 'This test fails in: ' + run_url |
| }); |
| } |
| } |
| } |
| if: ${{ github.repository == 'apache/helix' && (success() || failure()) }} |