diff --git a/.github/workflows/utils.yaml b/.github/workflows/utils.yaml index 5e0c21f..10f878f 100644 --- a/.github/workflows/utils.yaml +++ b/.github/workflows/utils.yaml @@ -75,134 +75,181 @@ jobs: echo "safe_label=0" >> $GITHUB_OUTPUT; fi - ut_coverage: + pr_coverage: if: ${{ needs.check_organization_user.outputs.safe_label == '1' || needs.check_organization_user.outputs.in_org == '1' }} - name: PR Unit Test Coverage + name: PR Unit and BVT Test Coverage needs: [check_organization_user] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: - fetch-depth: "3" + fetch-depth: "1" path: ./matrixone repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.ref }} - - name: Set up Go and Java + - name: Generate diff.patch + run: | + cd $GITHUB_WORKSPACE/matrixone + git remote add upstream https://github.com/matrixorigin/matrixone.git + target_branch="${{ github.event.pull_request.base.ref }}" + current_branch="${{ github.event.pull_request.head.ref }}" + echo "upstream target_branch: $target_branch" + echo "origin current_branch: $current_branch" + + git fetch upstream $target_branch --depth=1 + git fetch origin $current_branch --depth=1 + + git diff upstream/$target_branch origin/$current_branch > diff.patch + + - name: Set up Go and JAVA uses: matrixorigin/CI/actions/setup-env@main + with: + setup-java: true - name: Set Variables run: | - cd $GITHUB_WORKSPACE/matrixone - echo "test_scope=$(go list ./... | grep -v 'driver\|engine/aoe\|engine/memEngine\|pkg/catalog' | xargs)" >> $GITHUB_ENV + echo "ut_report='UT-Report.out'" >> $GITHUB_ENV echo "raw_ut_coverage='ut_coverage.raw'" >> $GITHUB_ENV echo "raw_bvt_coverage='bvt_coverage.raw'" >> $GITHUB_ENV - echo "raw_bvt_coverage_temp='bvt_coverage_temp.raw'" >> $GITHUB_ENV - echo "raw_ut_coverage_temp='ut_coverage_temp.raw'" >> $GITHUB_ENV - echo "all_coverage='all_coverage.raw'" >> $GITHUB_ENV - echo "test_report='test_report.out'" >> $GITHUB_ENV + echo "ut_coverage='ut_coverage.out'" >> $GITHUB_ENV + echo "bvt_coverage='bvt_coverage.out'" >> $GITHUB_ENV echo "ut_html_coverage='ut_coverage.html'" >> $GITHUB_ENV echo "bvt_html_coverage='bvt_coverage.html'" >> $GITHUB_ENV - echo "all_html_coverage='all_coverage.html'" >> $GITHUB_ENV echo "ut_excluded_pkg='pkg/pb\|pkg/sql/parsers/goyacc\|yaccpar'" >> $GITHUB_ENV echo "bvt_excluded_pkg='pkg/pb\|yaccpar'" >> $GITHUB_ENV - echo "coverage_line=75" >> $GITHUB_ENV - - name: Set env - run: | - echo "endpoint=${{ secrets.S3ENDPOINT }}" >> $GITHUB_ENV - echo "region=${{ secrets.S3REGION }}" >> $GITHUB_ENV - echo "apikey=${{ secrets.S3APIKEY }}" >> $GITHUB_ENV - echo "apisecret=${{ secrets.S3APISECRET }}" >> $GITHUB_ENV - echo "bucket=${{ secrets.S3BUCKET }}" >> $GITHUB_ENV - - name: Get Changed Paths - uses: matrixorigin/CI/actions/change-paths-action@main - id: ut-pr - with: - github-token: ${{ secrets.TOKEN_ACTION }} - ignore: "/,etc/,optools/,LICENSES/,cgo/,cmd/,docs/,proto/,test/,.github/,pkg/pb/" - source-path: ${{ env.test_scope }} - - name: Start PR Unit Test - if: ${{ steps.ut-pr.outputs.paths != '' }} - id: test_ut - timeout-minutes: 60 - run: | - cd $GITHUB_WORKSPACE/matrixone - echo "-----------------------ut start-----------------------" - CGO_CFLAGS="-I${GITHUB_WORKSPACE}/matrixone/cgo" - CGO_LDFLAGS="-L${GITHUB_WORKSPACE}/matrixone/cgo -lmo -lm" - make clean && make config && make cgo - go test -v -cover -short -tags matrixone_test -p 6 -covermode=set -coverprofile ${{ env.raw_ut_coverage }} -count=1 ${{ steps.ut-pr.outputs.paths }} - echo "-----------------------ut finish-----------------------" - - name: Clone mo-tester repository - if: ${{ steps.ut-pr.outputs.paths != '' }} + + - name: Clone test-tool repository uses: actions/checkout@v4 with: repository: matrixorigin/mo-tester path: ./mo-tester ref: main + - name: Start Unit Test + timeout-minutes: 120 + run: | + cd $GITHUB_WORKSPACE/matrixone + test_scope=$(go list ./... | grep -v 'driver\|engine/aoe\|engine/memEngine\|pkg/catalog') + make clean && make config && make cgo + echo "ut start" + CGO_CFLAGS="-I${GITHUB_WORKSPACE}/matrixone/cgo" CGO_LDFLAGS="-L${GITHUB_WORKSPACE}/matrixone/cgo -lmo" go test -v -tags matrixone_test -p 6 -covermode=set -coverprofile=${{ env.raw_ut_coverage }} -coverpkg=./pkg/... ${test_scope} | tee ${{ env.ut_report }} + echo "ut finished" - name: Start BVT Test Service - if: ${{ steps.ut-pr.outputs.paths != '' }} - id: test_bvt_start + if: ${{ always() && !cancelled() }} timeout-minutes: 10 run: | cd $GITHUB_WORKSPACE/matrixone + sed -i.bak 's/level = "info"/level = "error"/g' ./etc/launch/log.toml if [ -d "./store" ]; then rm -rf ./store; fi GOLDFLAGS=-ldflags="-X 'main.GoVersion=$(go version)' -X 'main.BranchName=$(git rev-parse --abbrev-ref HEAD)' -X 'main.CommitID=$(git rev-parse HEAD)' -X 'main.BuildTime=$(date)' -X 'main.Version=$(git describe --always --tags $(git rev-list --tags --max-count=1))'" export GOCOVERDIR=$GITHUB_WORKSPACE/matrixone go build -cover "$GOLDFLAGS" -o mo-service ./cmd/mo-service/ ./optools/run_bvt.sh $GITHUB_WORKSPACE/matrixone launch - - name: Start PR BVT Test - if: ${{ steps.ut-pr.outputs.paths != '' }} - id: test_bvt - continue-on-error: true + - name: Start BVT Test + if: ${{ always() && !cancelled() }} + id: bvt_on_pr_version run: | + export LC_ALL="C.UTF-8" + locale + cd $GITHUB_WORKSPACE/mo-tester sed -i 's/ port: [0-9]*/ port: 12345/g' mo.yml cat mo.yml - echo "=============================" + echo "============================" + ./run.sh -n -g -o -p $GITHUB_WORKSPACE/matrixone/test/distributed/cases -e optimistic 2>&1 - - name: Stop MO Service - id: test_bvt_stop - if: ${{ steps.ut-pr.outputs.paths != '' }} + + + - name: Generate UT and BVT Coverage File + if: ${{ always() && !cancelled() }} + timeout-minutes: 10 run: | + cd $GITHUB_WORKSPACE/matrixone + cat ${{ env.raw_ut_coverage }} | grep -v ${{ env.ut_excluded_pkg }} > ${{ env.ut_coverage }} + echo "ut_coverage finished" + go tool cover -o ${{ env.ut_html_coverage }} -html=${{ env.ut_coverage }} + echo "ut_html_coverage finished" + rm -rf ${{ env.raw_ut_coverage }} ps -aux | grep 'mo-service' | grep -v 'grep' | awk '{print $2}' | xargs kill -s SIGINT i=1 && while [ -n "$(ps -aux|grep 'mo-service' | grep -v 'grep' | awk '{print $2}')" ] && [ $i -le 300 ]; do echo "mo-service kill not finished......$i/300"; i=$(($i+1)); sleep 1s; done if [ $i -gt 300 ]; then echo 'stop mo-service failed...'; exit 1; else echo 'stop mo-service successed...'; fi - - name: Coverage Calculate - if: ${{ steps.ut-pr.outputs.paths != '' }} - id: calculate_result - run: | - cd $GITHUB_WORKSPACE/matrixone go tool covdata textfmt -i="$GITHUB_WORKSPACE/matrixone" -o ${{ env.raw_bvt_coverage }} - cat ${{ env.raw_bvt_coverage }} | grep "${{ steps.ut-pr.outputs.files }}" | grep -v ${{ env.bvt_excluded_pkg }} | tee ${{ env.raw_bvt_coverage_temp }} > /dev/null - cat ${{ env.raw_ut_coverage }} | grep "${{ steps.ut-pr.outputs.files }}" | grep -v ${{ env.ut_excluded_pkg }} | tee ${{ env.raw_ut_coverage_temp }} > /dev/null - echo "======================= Coverage Calculate Start =======================" - awk -F '[ ]+' 'FNR==NR{arr[$1,$2]=$3;next}{if($3>=1){arr[$1,$2]=1}else{arr[$1,$2]+=$3}}END{for(i in arr){split(i,ind,SUBSEP);printf("%s %s %s\n",ind[1],ind[2],arr[i])};}' ${{ env.raw_ut_coverage_temp }} ${{ env.raw_bvt_coverage_temp }} | tee ${{ env.all_coverage }} > /dev/null - awk -F '[:, ]+' '{all[$1]+=$4;hit[$1]+=0;if($5>0) hit[$1]+=$4;}END{for(i in all)if(all[i]!=0){print(i,all[i],hit[i],hit[i]/all[i]*100)}else{print(i,all[i],hit[i],100)}}' ${{ env.all_coverage }} | tee ${{ env.test_report }} > /dev/null - awk 'BEGIN{flag=1}{if($4<${{ env.coverage_line }}){flag=0;print("\033[31merror:\033[0m the code coverage of \033[31m"$1"\033[0m is \033[31m"$4"%\033[0m which is below ${{ env.coverage_line }}%");} else { print("\033[32minfo:\033[0m the code coverage of "$1" is "$4"% which is up to ${{ env.coverage_line }}%") }}END{if(flag==0) {exit 1;}}' ${{ env.test_report }} - - name: Package Test Result - if: ${{ steps.ut-pr.outputs.paths != '' && failure() && steps.test_ut.conclusion != 'failure' && steps.test_bvt_start.conclusion != 'failure' && steps.test_bvt_stop.conclusion != 'failure' }} - continue-on-error: true + cat ${{ env.raw_bvt_coverage }} | grep -v ${{ env.bvt_excluded_pkg }} > ${{ env.bvt_coverage }} + echo "bvt_coverage finished" + go tool cover -o ${{ env.bvt_html_coverage }} -html=${{ env.bvt_coverage }} + echo "bvt_html_coverage finished" + + - name: Download UT BVT Coverage and diff.patch Files + run: | + cd $GITHUB_WORKSPACE + mkdir -p coverage_downloads + cp $GITHUB_WORKSPACE/matrixone/ut_coverage.out $GITHUB_WORKSPACE/coverage_downloads/ut_coverage.out + cp $GITHUB_WORKSPACE/matrixone/bvt_coverage.out $GITHUB_WORKSPACE/coverage_downloads/bvt_coverage.out + cp $GITHUB_WORKSPACE/matrixone/diff.patch $GITHUB_WORKSPACE/coverage_downloads/diff.patch + + cd $GITHUB_WORKSPACE/coverage_downloads + sort ut_coverage.out | uniq > ut_coverage_sort.out + zip -r coverage_files.zip ut_coverage_sort.out bvt_coverage.out diff.patch + zip -r ut_origin_files.zip ut_coverage.out + + - name: Upload Compressed Files + uses: actions/upload-artifact@v4 + with: + name: coverage-files + path: ${{ github.workspace }}/coverage_downloads/coverage_files.zip + retention-days: 7 + - name: Upload origin ut_coverage.out + uses: actions/upload-artifact@v4 + with: + name: origin-ut-coverage-files + path: ${{ github.workspace }}/coverage_downloads/ut_origin_files.zip + retention-days: 7 + - name: Set up Python environment + uses: actions/setup-python@v4 + with: + python-version: '3.9' # 使用Python 3.9版本 + - name: Checkout for Python file + uses: actions/checkout@v3 + with: + repository: matrixorigin/CI + fetch-depth: "0" + path: CI + - name: Get Python file + run: | + cd $GITHUB_WORKSPACE + cp $GITHUB_WORKSPACE/CI/scripts/parse_coverage.py $GITHUB_WORKSPACE/parse_coverage.py + - name: Run coverage Python script + run: | + cd $GITHUB_WORKSPACE + python $GITHUB_WORKSPACE/parse_coverage.py -coverage_files $GITHUB_WORKSPACE/matrixone/ut_coverage.out $GITHUB_WORKSPACE/matrixone/bvt_coverage.out -diff_path $GITHUB_WORKSPACE/matrixone/diff.patch + + - name: Compress final result files run: | cd $GITHUB_WORKSPACE/matrixone - echo "======================= Coverage HTML Generate Start =======================" - sed -i '1s/^/mode: set/' ${{ env.raw_ut_coverage_temp }} - go tool cover -o ${{ env.ut_html_coverage }} -html=${{ env.raw_ut_coverage_temp }} - echo "HTML for UT test generated is finished" - sed -i '1s/^/mode: set/' ${{ env.raw_bvt_coverage_temp }} - go tool cover -o ${{ env.bvt_html_coverage }} -html=${{ env.raw_bvt_coverage_temp }} - echo "HTML for BVT test generated is finished" - sed -i '1s/^/mode: set/' ${{ env.all_coverage }} - go tool cover -o ${{ env.all_html_coverage }} -html=${{ env.all_coverage }} - echo "HTML for ALL test generated is finished" - echo "======================= Coverage HTML Generate Finished =======================" - zip -r code_coverage_reports_${{ github.event.pull_request.number}}_${{ github.run_id }}.zip ${{ env.all_html_coverage }} ${{ env.raw_ut_coverage }} ${{ env.raw_ut_coverage_temp }} ${{ env.test_report }} ${{ env.raw_bvt_coverage_temp }} ${{ env.raw_bvt_coverage }} ${{ env.all_coverage }} ${{ env.ut_html_coverage }} ${{ env.bvt_html_coverage }} 'mo-service.log' - rm -rf ${{ env.all_html_coverage }} ${{ env.raw_ut_coverage }} ${{ env.raw_ut_coverage_temp }} ${{ env.test_report }} ${{ env.raw_bvt_coverage_temp }} ${{ env.raw_bvt_coverage }} ${{ env.all_coverage }} ${{ env.ut_html_coverage }} ${{ env.bvt_html_coverage }} 'mo-service.log' + cp $GITHUB_WORKSPACE/pr_coverage.out $GITHUB_WORKSPACE/matrixone/pr_coverage.out + go tool cover -o pr_coverage.html -html=pr_coverage.out + + cd $GITHUB_WORKSPACE + cp $GITHUB_WORKSPACE/matrixone/pr_coverage.html $GITHUB_WORKSPACE/coverage_downloads/pr_coverage.html + cp $GITHUB_WORKSPACE/pr_coverage.out $GITHUB_WORKSPACE/coverage_downloads/pr_coverage.out + cp $GITHUB_WORKSPACE/merged_coverage.out $GITHUB_WORKSPACE/coverage_downloads/merged_coverage.out + + cd $GITHUB_WORKSPACE/coverage_downloads + zip -r final_result_files.zip pr_coverage.html pr_coverage.out merged_coverage.out + - name: Upload final result files + uses: actions/upload-artifact@v4 + if: ${{ always() && !cancelled() }} + continue-on-error: true + with: + name: final-result-files + path: | + ${{ github.workspace }}/coverage_downloads/final_result_files.zip + retention-days: 7 - uses: actions/upload-artifact@v4 - if: ${{ steps.ut-pr.outputs.paths != '' && failure() && steps.test_ut.conclusion != 'failure' && steps.test_bvt_start.conclusion != 'failure' && steps.test_bvt_stop.conclusion != 'failure' }} + if: ${{ failure() }} continue-on-error: true with: - name: PR-Unit-Test-Coverage-reports-${{ github.event.pull_request.number}}-${{ github.run_id }}.zip + name: daily-test-reports path: | - ${{ github.workspace }}/matrixone/code_coverage_reports_${{ github.event.pull_request.number}}_${{ github.run_id }}.zip + ${{ github.workspace }}/matrixone retention-days: 7 pr-size-label: