From 5d0c3aad47b4b95a72e24ab38b415f2ceb8889a7 Mon Sep 17 00:00:00 2001 From: AlexeyAtroshenko Date: Tue, 13 Aug 2024 16:06:45 +0100 Subject: [PATCH 1/5] save --- .github/workflows/php.yml | 130 +++++++++++++++++++++++++++++++------- composer.json | 2 +- 2 files changed, 108 insertions(+), 24 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 3524616..e641b9a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -1,4 +1,4 @@ -name: EXADS Pipeline +name: PHP Pipeline on: pull_request: @@ -21,38 +21,122 @@ jobs: with: path: repo + - name: Install dependencies run: | cd repo composer install - # - name: "Upload coverage data" - # uses: actions/upload-artifact@v3 - # with: - # name: covdata - # path: gh_output/clover.xml - - - - name: Run test suite + - name: Unit tests and code coverage report run: | cd repo composer run-script test:coverage - ls -la . + head -n9 coverage/cover.txt | tail -n1| grep -Pow '(\d{1,3}\.\d{0,2})%'| rev | cut -c2- | rev > coverage/coveragePercent.txt - - name: Make code coverage badge - uses: timkrase/phpunit-coverage-badge@v1.2.1 + - name: Leave PR summary + uses: actions/github-script@v6 with: - report: ${{ GITHUB_WORKSPACE }}/coverage/clover.xml - coverage_badge_path: output/coverage.svg - push_badge: false + script: | + const CODE_COVERAGE_THRESHOLD = 0; + const reportFile = "repo/coverage/coveragePercent.txt"; + + require('fs').readFile(reportFile, (err, buffer)=>{ + let coveragePercent = parseFloat(buffer.toString()); + + if(CODE_COVERAGE_THRESHOLD > coveragePercent){ + throw new Error(thresholdErrorMessage()); + } + + writeCoverageReport(coveragePercent); + }) + + function thresholdErrorMessage(){ + msg = `** Code level coverage is too low (${totalCoverage}%, minimum required ${CODE_COVERAGE_THRESHOLD} %) **`; + let strLen = msg.length; + let border = "\n" +"".padStart(strLen, "*") + "\n"; + return border + msg + border; + } + + function writeCoverageReport(coveragePercent){ + let msgToPush = { + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "" + }; + + msgToPush.body = "### Pull request summary\n"; + msgToPush.body += `Total code coverage: ${coveragePercent}%` + + github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }).then((response)=>{ + let createNew = true; + for(const message of response.data){ + if(message.user.type == "Bot"){ + msgToPush.comment_id = message.id; + createNew = false; + break; + } + } + + if(createNew){ + github.rest.issues.createComment(msgToPush); + }else{ + github.rest.issues.updateComment(msgToPush); + } + + }, error => { + throw new Error(error); + }); + } + + + # - name: Make code coverage badge + # uses: timkrase/phpunit-coverage-badge@v1.2.1 + # with: + # report: 'repo/coverage/clover.xml' + # coverage_badge_path: ./output/coverage.svg + # push_badge: false + # + # - name: GitHub Pages v4 + # uses: peaceiris/actions-gh-pages@v4.0.0 + # with: + # github_token: ${{ secrets.GITHUB_TOKEN }} + # # deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} + # publish_dir: ./output + # publish_branch: bages-data + # commit_message: ${{ github.event.head_commit.message }} + +# - name: Leave PR summary +# uses: actions/github-script@v6 +# with: +# script: | +# let summaries = await github.rest.issues.listComments({ +# issue_number: context.issue.number, +# owner: context.repo.owner, +# repo: context.repo.repo, +# }); +# +# summaries.data.forEach((summary)=>{ +# github.rest.issues.deleteComment({ +# owner: context.repo.owner, +# repo: context.repo.repo, +# comment_id: summary.id, +# }); +# }); +# +# console.info("Old summaries deleted: " + summaries.data.length); +# +# github.rest.issues.createComment({ +# issue_number: context.issue.number, +# owner: context.repo.owner, +# repo: context.repo.repo, +# body: '👋 Thanks for reporting! ' +# }) + - - name: Git push to image-data branch - uses: peaceiris/actions-gh-pages@v3 - with: - publish_dir: ./output - publish_branch: image-data - github_token: ${{ secrets.GITHUB_TOKEN }} - user_name: 'github-actions[bot]' - user_email: 'alexey@exads.com' diff --git a/composer.json b/composer.json index 7d6bb2d..6a86826 100755 --- a/composer.json +++ b/composer.json @@ -19,6 +19,6 @@ "test": [ "vendor/bin/phpunit" ], - "test:coverage": "@php -dxdebug.mode=coverage ./vendor/bin/phpunit --coverage-clover ./coverage/clover.xml" + "test:coverage": "@php -dxdebug.mode=coverage ./vendor/bin/phpunit --coverage-text=./coverage/cover.txt --coverage-filter=src" } } From 2d714f0afa5506f762d96fe2fc88c83e7e6ccbd0 Mon Sep 17 00:00:00 2001 From: AlexeyAtroshenko Date: Tue, 13 Aug 2024 18:19:46 +0100 Subject: [PATCH 2/5] save --- .github/workflows/php.yml | 133 ++++++++++++++------------------------ 1 file changed, 48 insertions(+), 85 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index e641b9a..101f6cc 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -31,112 +31,75 @@ jobs: run: | cd repo composer run-script test:coverage - head -n9 coverage/cover.txt | tail -n1| grep -Pow '(\d{1,3}\.\d{0,2})%'| rev | cut -c2- | rev > coverage/coveragePercent.txt + head -n9 coverage/cover.txt | tail -n3 > coverage/coverageSummary.txt - name: Leave PR summary uses: actions/github-script@v6 with: script: | const CODE_COVERAGE_THRESHOLD = 0; - const reportFile = "repo/coverage/coveragePercent.txt"; + const reportFile = "./coverageSummary.txt"; require('fs').readFile(reportFile, (err, buffer)=>{ - let coveragePercent = parseFloat(buffer.toString()); - - if(CODE_COVERAGE_THRESHOLD > coveragePercent){ - throw new Error(thresholdErrorMessage()); + let summary = parseSummary(buffer.toString()); + if(CODE_COVERAGE_THRESHOLD > summary.Total.percent){ + throw new Error(thresholdErrorMessage(summary)); } - - writeCoverageReport(coveragePercent); + writeCoverageReport(summary); }) function thresholdErrorMessage(){ - msg = `** Code level coverage is too low (${totalCoverage}%, minimum required ${CODE_COVERAGE_THRESHOLD} %) **`; + msg = `** Code level coverage is too low (${summary.Total.percent}%, minimum required ${CODE_COVERAGE_THRESHOLD} %) **`; let strLen = msg.length; let border = "\n" +"".padStart(strLen, "*") + "\n"; return border + msg + border; } - function writeCoverageReport(coveragePercent){ + function parseSummary(summary){ + let result = {}; + const pattern = /(Classes|Methods|Lines).*(\d{1,3}\.\d{0,2})%\s*(\(.*\))/iug; + for (const matchLine of summary.matchAll(pattern)) { + if(matchLine[1] === "Lines") matchLine[1] = "Total"; + result[matchLine[1]] = { title: matchLine[1], percent: parseFloat(matchLine[2]), ratio: matchLine[3] } + } + return result; + } + + function writeCoverageReport(summary){ let msgToPush = { - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "" - }; + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "" + }; - msgToPush.body = "### Pull request summary\n"; - msgToPush.body += `Total code coverage: ${coveragePercent}%` + msgToPush.body = "### Pull request summary\n"; + msgToPush.body += "Code coverage:\n"; + msgToPush.body += `**${summary.Methods.title}**: ${summary.Methods.percent}% ${summary.Methods.ratio}\n`; + msgToPush.body += `**${summary.Total.title}**: ${summary.Total.percent}% ${summary.Total.ratio}\n`; - github.rest.issues.listComments({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - }).then((response)=>{ - let createNew = true; - for(const message of response.data){ - if(message.user.type == "Bot"){ - msgToPush.comment_id = message.id; - createNew = false; - break; - } - } - if(createNew){ - github.rest.issues.createComment(msgToPush); - }else{ - github.rest.issues.updateComment(msgToPush); + github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }).then((response)=>{ + let createNew = true; + for(const message of response.data){ + if(message.user.type == "Bot"){ + msgToPush.comment_id = message.id; + createNew = false; + break; } - - }, error => { - throw new Error(error); - }); - } - - - # - name: Make code coverage badge - # uses: timkrase/phpunit-coverage-badge@v1.2.1 - # with: - # report: 'repo/coverage/clover.xml' - # coverage_badge_path: ./output/coverage.svg - # push_badge: false - # - # - name: GitHub Pages v4 - # uses: peaceiris/actions-gh-pages@v4.0.0 - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - # # deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} - # publish_dir: ./output - # publish_branch: bages-data - # commit_message: ${{ github.event.head_commit.message }} - -# - name: Leave PR summary -# uses: actions/github-script@v6 -# with: -# script: | -# let summaries = await github.rest.issues.listComments({ -# issue_number: context.issue.number, -# owner: context.repo.owner, -# repo: context.repo.repo, -# }); -# -# summaries.data.forEach((summary)=>{ -# github.rest.issues.deleteComment({ -# owner: context.repo.owner, -# repo: context.repo.repo, -# comment_id: summary.id, -# }); -# }); -# -# console.info("Old summaries deleted: " + summaries.data.length); -# -# github.rest.issues.createComment({ -# issue_number: context.issue.number, -# owner: context.repo.owner, -# repo: context.repo.repo, -# body: '👋 Thanks for reporting! ' -# }) - - + } + if(createNew){ + github.rest.issues.createComment(msgToPush); + }else{ + github.rest.issues.updateComment(msgToPush); + } + }, error => { + throw new Error(error); + }); + } From ce5316d95c379adba6518538ff53dc85d4924e72 Mon Sep 17 00:00:00 2001 From: AlexeyAtroshenko Date: Tue, 13 Aug 2024 18:22:15 +0100 Subject: [PATCH 3/5] save --- .github/workflows/php.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 101f6cc..3989475 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -38,7 +38,7 @@ jobs: with: script: | const CODE_COVERAGE_THRESHOLD = 0; - const reportFile = "./coverageSummary.txt"; + const reportFile = "coverage/coverageSummary.txt"; require('fs').readFile(reportFile, (err, buffer)=>{ let summary = parseSummary(buffer.toString()); @@ -84,22 +84,22 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, }).then((response)=>{ - let createNew = true; - for(const message of response.data){ - if(message.user.type == "Bot"){ - msgToPush.comment_id = message.id; - createNew = false; - break; - } - } - if(createNew){ - github.rest.issues.createComment(msgToPush); - }else{ - github.rest.issues.updateComment(msgToPush); - } - }, error => { - throw new Error(error); - }); - } + let createNew = true; + for(const message of response.data){ + if(message.user.type == "Bot"){ + msgToPush.comment_id = message.id; + createNew = false; + break; + } + } + if(createNew){ + github.rest.issues.createComment(msgToPush); + }else{ + github.rest.issues.updateComment(msgToPush); + } + }, error => { + throw new Error(error); + }); + } From bcee06729b63fb37f8e0f2311535917eca3a2c27 Mon Sep 17 00:00:00 2001 From: AlexeyAtroshenko Date: Tue, 13 Aug 2024 18:31:58 +0100 Subject: [PATCH 4/5] upd --- .github/workflows/php.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 3989475..b5f8d9d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -38,9 +38,10 @@ jobs: with: script: | const CODE_COVERAGE_THRESHOLD = 0; - const reportFile = "coverage/coverageSummary.txt"; + const reportFile = "repo/coverage/coverageSummary.txt"; require('fs').readFile(reportFile, (err, buffer)=>{ + if(err) throw new Error(err); let summary = parseSummary(buffer.toString()); if(CODE_COVERAGE_THRESHOLD > summary.Total.percent){ throw new Error(thresholdErrorMessage(summary)); @@ -73,6 +74,8 @@ jobs: body: "" }; + console.log(summary); + msgToPush.body = "### Pull request summary\n"; msgToPush.body += "Code coverage:\n"; msgToPush.body += `**${summary.Methods.title}**: ${summary.Methods.percent}% ${summary.Methods.ratio}\n`; From eeae17a7df6bca68792b4b02290a84dd93869475 Mon Sep 17 00:00:00 2001 From: AlexeyAtroshenko Date: Wed, 14 Aug 2024 09:14:17 +0100 Subject: [PATCH 5/5] bug fix --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b5f8d9d..af6c690 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -58,7 +58,7 @@ jobs: function parseSummary(summary){ let result = {}; - const pattern = /(Classes|Methods|Lines).*(\d{1,3}\.\d{0,2})%\s*(\(.*\))/iug; + const pattern = /(Classes|Methods|Lines):\s*(\d{1,3}\.\d{0,2})%\s*(\(.*\))/iug; for (const matchLine of summary.matchAll(pattern)) { if(matchLine[1] === "Lines") matchLine[1] = "Total"; result[matchLine[1]] = { title: matchLine[1], percent: parseFloat(matchLine[2]), ratio: matchLine[3] }