1
1
# Copyright 2025 SAP SE
2
2
# SPDX-License-Identifier: Apache-2.0
3
3
4
- name : Test
4
+ name : Test and Report Coverage
5
5
6
- on : [push]
6
+ on :
7
+ push :
8
+ pull_request :
9
+ branches :
10
+ - ' *'
7
11
8
12
jobs :
9
13
test-without-docker :
@@ -15,10 +19,12 @@ jobs:
15
19
uses : actions/setup-go@v5
16
20
with :
17
21
go-version : 1.24.2
18
- - name : Test without Docker
22
+ - name : Test quickly without Docker
19
23
run : go test -v ./...
20
24
21
25
test-with-docker :
26
+ # We don't need to run this longer test if the previous one already failed.
27
+ needs : test-without-docker
22
28
runs-on : ubuntu-latest
23
29
services :
24
30
dind :
32
38
uses : actions/setup-go@v5
33
39
with :
34
40
go-version : 1.24.2
35
- - name : Test with Docker
36
- run : POSTGRES_CONTAINER=1 VERNEMQ_CONTAINER=1 go test -v ./...
41
+ - name : Run tests with Docker and calculate coverage
42
+ run : |
43
+ POSTGRES_CONTAINER=1 VERNEMQ_CONTAINER=1 go test -v -coverpkg=./internal/... -coverprofile=pr_profile.cov ./internal/...
44
+ CURRENT_COVERAGE=$(go tool cover -func pr_profile.cov | grep total | awk '{print $3}' | tr -d '%')
45
+ echo "CURRENT_COVERAGE=$CURRENT_COVERAGE" >> $GITHUB_ENV
46
+
47
+ # Steps below are only executed if the workflow is triggered by a pull request
48
+ - name : Checkout base commit (PR only)
49
+ if : ${{ github.event_name == 'pull_request' }}
50
+ uses : actions/checkout@v4
51
+ with :
52
+ ref : ${{ github.event.pull_request.base.sha }}
53
+ - name : Run tests on base commit and calculate previous coverage (PR only)
54
+ if : ${{ github.event_name == 'pull_request' }}
55
+ run : |
56
+ POSTGRES_CONTAINER=1 VERNEMQ_CONTAINER=1 go test -v -coverpkg=./internal/... -coverprofile=base_profile.cov ./internal/...
57
+ PREVIOUS_COVERAGE=$(go tool cover -func base_profile.cov | grep total | awk '{print $3}' | tr -d '%')
58
+ echo "PREVIOUS_COVERAGE=$PREVIOUS_COVERAGE" >> $GITHUB_ENV
59
+ - name : Calculate coverage change (PR only)
60
+ if : ${{ github.event_name == 'pull_request' }}
61
+ run : |
62
+ CHANGE=$(echo "$CURRENT_COVERAGE - $PREVIOUS_COVERAGE" | bc)
63
+ echo "CHANGE=$CHANGE" >> $GITHUB_ENV
64
+ - name : Delete old coverage comments (PR only)
65
+ if : ${{ github.event_name == 'pull_request' }}
66
+ uses : actions/github-script@v7
67
+ with :
68
+ script : |
69
+ const { data: comments } = await github.rest.issues.listComments({
70
+ owner: context.repo.owner,
71
+ repo: context.repo.repo,
72
+ issue_number: context.issue.number,
73
+ });
74
+ const coverageCommentTag = '<!-- coverage-comment -->';
75
+ for (const comment of comments) {
76
+ if (comment.body.includes(coverageCommentTag)) {
77
+ await github.rest.issues.deleteComment({
78
+ owner: context.repo.owner,
79
+ repo: context.repo.repo,
80
+ comment_id: comment.id,
81
+ });
82
+ }
83
+ }
84
+ - name : Post coverage comment (PR only)
85
+ if : ${{ github.event_name == 'pull_request' }}
86
+ uses : actions/github-script@v7
87
+ with :
88
+ script : |
89
+ const currentCoverage = process.env.CURRENT_COVERAGE || 'unknown';
90
+ const previousCoverage = process.env.PREVIOUS_COVERAGE || 'unknown';
91
+ const change = process.env.CHANGE || 'unknown';
92
+ const commentBody = `
93
+ <!-- coverage-comment -->
94
+ Coverage in go module **internal/**: **${currentCoverage}%** (${change >= 0 ? '+' : ''}${change}%)
95
+ `;
96
+ await github.rest.issues.createComment({
97
+ issue_number: context.issue.number,
98
+ owner: context.repo.owner,
99
+ repo: context.repo.repo,
100
+ body: commentBody,
101
+ });
0 commit comments