diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..30d8c1c --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,69 @@ +name: Code Coverage + +on: + push: + branches: [main, release-*] + paths-ignore: ['**.md', '**.png', '**.jpg', '**.svg', '**/docs/**'] + pull_request: + branches: [main, release-*] + paths-ignore: ['**.md', '**.png', '**.jpg', '**.svg', '**/docs/**'] + +permissions: + contents: read + +jobs: + coverage: + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.24.2' + + - name: Cache Go modules + uses: actions/cache@v4 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Run tests with coverage + run: | + sudo make test-coverage + + - name: Generate coverage report + run: | + go tool cover -func=coverage.out > coverage.txt + + - name: Display coverage summary + run: | + echo "## Code Coverage Report" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + tail -1 coverage.txt >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "
Detailed Coverage by Package" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + cat coverage.txt >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "
" >> $GITHUB_STEP_SUMMARY + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + file: ./coverage.out + flags: unittests + name: codecov-umbrella + fail_ci_if_error: false + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 35821f9..0349dc6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ /output /cover.out.tmp /coverage.log +/coverage.out +/coverage.txt .vscode diff --git a/Makefile b/Makefile index f52091e..ddff6a2 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ REVISION=$(shell git rev-parse HEAD)$(shell if ! git diff --no-ext-diff --quiet RELEASE_INFO = -X main.revision=${REVISION} -X main.gitVersion=${VERSION} -X main.buildTime=${BUILD_TIMESTAMP} -.PHONY: release test +.PHONY: release test test-coverage release: @CGO_ENABLED=0 ${PROXY} GOOS=linux GOARCH=${GOARCH} go vet -tags disable_libgit2 $(PACKAGES) @@ -21,6 +21,30 @@ release: @CGO_ENABLED=0 ${PROXY} GOOS=linux GOARCH=${GOARCH} go build -tags disable_libgit2 -ldflags '${RELEASE_INFO} -w -extldflags "-static"' -o ./ ./cmd/model-csi-cli test: - go list ./... | grep -v -E github.com/modelpack/model-csi-driver/pkg/server | xargs go test -tags disable_libgit2 -race -v -timeout 10m - go test -tags disable_libgit2 -race -c -o ./server.test github.com/modelpack/model-csi-driver/pkg/server - sudo CONFIG_PATH=./test/testdata/config.test.yaml ./server.test -test.v -test.timeout 10m + @echo "Running tests for all packages except pkg/server (requires sudo)..." + @go list ./... | grep -v -E github.com/modelpack/model-csi-driver/pkg/server | xargs go test -tags disable_libgit2 -race -v -timeout 10m + @echo "Running tests for pkg/server (with sudo)..." + @go test -tags disable_libgit2 -race -c -o ./server.test github.com/modelpack/model-csi-driver/pkg/server + @sudo CONFIG_PATH=./test/testdata/config.test.yaml ./server.test -test.v -test.timeout 10m + @rm -f ./server.test + @echo "All tests completed successfully!" + +test-coverage: + @echo "mode: atomic" > coverage.out + @echo "Running tests with coverage for non-server packages..." + @for pkg in $$(go list ./... | grep -v -E github.com/modelpack/model-csi-driver/pkg/server); do \ + go test -tags disable_libgit2 -race -coverprofile=coverage.tmp -covermode=atomic -timeout 10m $$pkg || exit 1; \ + if [ -f coverage.tmp ]; then \ + tail -n +2 coverage.tmp >> coverage.out; \ + rm coverage.tmp; \ + fi; \ + done + @echo "Running tests with coverage for pkg/server..." + @go test -tags disable_libgit2 -race -covermode=atomic -c -o ./server.test github.com/modelpack/model-csi-driver/pkg/server + @sudo CONFIG_PATH=./test/testdata/config.test.yaml ./server.test -test.coverprofile=coverage.server.out -test.timeout 10m || exit 1 + @if [ -f coverage.server.out ]; then \ + tail -n +2 coverage.server.out >> coverage.out; \ + rm coverage.server.out; \ + fi + @rm -f ./server.test + @echo "Coverage report generated: coverage.out"