123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- name: build-and-test
- description: Build YDB and run Tests
- inputs:
- log_suffix:
- required: true
- type: string
- test_label_regexp:
- required: false
- type: string
- aws_key_id:
- required: true
- type: string
- aws_key_value:
- required: true
- type: string
- testman_token:
- required: false
- type: string
- testman_url:
- required: false
- type: string
- testman_project_id:
- required: false
- type: string
- aws_bucket:
- required: true
- type: string
- aws_endpoint:
- required: true
- type: string
- run_unit_tests:
- required: true
- type: string
- run_functional_tests:
- required: true
- type: string
- runs:
- using: "composite"
- steps:
- - name: Init
- id: init
- shell: bash
- run: |
- mkdir -p artifacts tmp test_reports
- rm -rf artifacts/* tmp/* test_reports/*
- echo "WORKDIR=$(pwd)" >> $GITHUB_ENV
- echo "TESTREPDIR=$(pwd)/test_reports" >> $GITHUB_ENV
- echo "PYTESTREPDIR=$(pwd)/ydb/tests/functional/test-results/xml" >> $GITHUB_ENV
- echo "TESTMO_TOKEN=${{inputs.testman_token}}" >> $GITHUB_ENV
- echo "TESTMO_URL=${{inputs.testman_url}}" >> $GITHUB_ENV
- echo "ARTIFACTS_DIR=$(pwd)/artifacts" >> $GITHUB_ENV
- echo "logfilename=${{inputs.log_suffix}}-ctest-stdout.gz" >> $GITHUB_OUTPUT
- echo "testfilterfile=$(pwd)/.github/config/muted_test.txt" >> $GITHUB_OUTPUT
- echo "testshardfilterfile=$(pwd)/.github/config/muted_shard.txt" >> $GITHUB_OUTPUT
- echo "logurlprefix=${{inputs.aws_endpoint}}/${{inputs.aws_bucket}}/${{ github.repository }}/${{github.workflow}}/${{github.run_id}}" >> $GITHUB_OUTPUT
- echo "pytest-logfilename=${{inputs.log_suffix}}-pytest-stdout.gz" >> $GITHUB_OUTPUT
- - name: configure s3cmd
- shell: bash
- run: |
- cat <<EOF > $WORKDIR/tmp/s3cfg
- [default]
- access_key = ${aws_key_id}
- secret_key = ${aws_secret_access_key}
- bucket_location = ru-central1
- host_base = storage.yandexcloud.net
- host_bucket = %(bucket)s.storage.yandexcloud.net
- EOF
- echo "S3CMD_CONFIG=$WORKDIR/tmp/s3cfg" >> $GITHUB_ENV
- echo "S3_BUCKET_PATH=s3://${{ inputs.aws_bucket }}/${{ github.repository }}/${{github.workflow}}/${{ github.run_id }}/" >> $GITHUB_ENV
- env:
- aws_key_id: ${{inputs.AWS_KEY_ID }}
- aws_secret_access_key: ${{inputs.AWS_KEY_VALUE}}
- - name: Install Node required for Testmo CLI
- uses: actions/setup-node@v3
- with:
- node-version: 19
- - name: Install Testmo CLI
- shell: bash
- run: npm install -g @testmo/testmo-cli
- - name: Test history run create
- id: th
- if: inputs.testman_token
- shell: bash
- env:
- PR_NUMBER: ${{ github.event.number }}
- run: |
- RUN_URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
- BRANCH_TAG="$GITHUB_REF_NAME"
- case $GITHUB_EVENT_NAME in
- workflow_dispatch)
- TESTMO_RUN_NAME="${{ github.run_id }} manual"
- EXTRA_TAG="manual"
- ;;
- pull_request | pull_request_target)
- TESTMO_RUN_NAME="${{ github.run_id }} PR #${PR_NUMBER}"
- EXTRA_TAG="pr"
- BRANCH_TAG=""
- ;;
- schedule)
- TESTMO_RUN_NAME="${{ github.run_id }} schedule"
- EXTRA_TAG="schedule"
- ;;
- *)
- TESTMO_RUN_NAME="${{ github.run_id }}"
- EXTRA_TAG=""
- ;;
- esac
- testmo automation:resources:add-link --name build --url $RUN_URL --resources testmo.json
- testmo automation:resources:add-field --name git-sha --type string --value ${GITHUB_SHA:0:7} --resources testmo.json
- testmo automation:run:create --instance "$TESTMO_URL" --project-id ${{inputs.testman_project_id}} --name "$TESTMO_RUN_NAME" \
- --source "${{inputs.log_suffix}}" --resources testmo.json \
- --tags "$BRANCH_TAG" --tags "$EXTRA_TAG" | \
- echo "runid=$(cat)" >> $GITHUB_OUTPUT
- - name: Run unit tests
- id: ctest
- if: inputs.run_unit_tests == 'true'
- shell: bash
- run: |
- cd $WORKDIR/../build/ydb
- echo "[Stdout unittest/ctest log (gzip archive)](${{steps.init.outputs.logurlprefix}}/${{steps.init.outputs.logfilename}})" >> $GITHUB_STEP_SUMMARY
- echo "[Testmo](${TESTMO_URL}/automation/runs/view/${{steps.th.outputs.runid}})" >> $GITHUB_STEP_SUMMARY
- # Sed removes coloring from the output
-
- TMPDIR=$WORKDIR/tmp GTEST_OUTPUT="xml:$TESTREPDIR/unittests/" Y_UNITTEST_OUTPUT="xml:$TESTREPDIR/unittests/" \
- ctest -j28 --timeout 1200 --force-new-ctest-process --output-on-failure \
- --output-junit $TESTREPDIR/suites/ctest_report.xml \
- -L '${{inputs.test_label_regexp}}' -E "${CTEST_SKIP_SHARDS:-}" | \
- sed -u -e 's/\x1b\[[0-9;]*m//g' | \
- tee >(gzip --stdout > $ARTIFACTS_DIR/${{steps.init.outputs.logfilename}}) | \
- grep --line-buffered -E '(Test\s*#.*\*\*\*|\[FAIL\])|.*tests passed,.*tests failed out of' | \
- tee $WORKDIR/short.log || (
- RC=$?
- if [ $RC == 8 ]; then
- echo "ctest returned TEST_ERRORS, recovering.."
- else
- exit $RC
- fi
- )
- - name: archive unitest reports (orig)
- if: inputs.run_unit_tests == 'true'
- shell: bash
- run: |
- tar -C $TESTREPDIR/ -czf $ARTIFACTS_DIR/reports.tar.gz .
- ls -la $ARTIFACTS_DIR/reports.tar.gz
- echo "[Unittest/CTest XML reports archive](${{steps.init.outputs.logurlprefix}}/reports.tar.gz)" >> $GITHUB_STEP_SUMMARY
- - name: postprocess xml reports
- if: inputs.run_unit_tests == 'true'
- shell: bash
- run: |
- echo "::group::junit-postprocess"
-
- .github/scripts/tests/junit-postprocess.py \
- --filter-file ${{steps.init.outputs.testfilterfile}} \
- $TESTREPDIR/unittests/
- echo "::endgroup::"
- echo "::group::ctest-postprocess"
- .github/scripts/tests/ctest-postprocess.py \
- --filter-file ${{steps.init.outputs.testshardfilterfile}} \
- --decompress \
- $ARTIFACTS_DIR/${{steps.init.outputs.logfilename}} \
- $TESTREPDIR/suites/ctest_report.xml
- echo "::endgroup::"
- echo "::group::extract-logs"
- mkdir $ARTIFACTS_DIR/logs/
- .github/scripts/tests/attach-logs.py \
- --url-prefix ${{steps.init.outputs.logurlprefix}}/logs/ \
- --filter-shard-file ${{steps.init.outputs.testshardfilterfile}} \
- --filter-test-file ${{steps.init.outputs.testfilterfile}} \
- --ctest-report $TESTREPDIR/suites/ctest_report.xml \
- --junit-reports-path $TESTREPDIR/unittests/ \
- --decompress \
- $ARTIFACTS_DIR/${{steps.init.outputs.logfilename}} \
- $ARTIFACTS_DIR/logs/
- echo "::endgroup::"
- - name: write unittests summary
- if: inputs.run_unit_tests == 'true'
- shell: bash
- run: |
- .github/scripts/tests/generate-summary.py -t "#### CTest run test shard failures" $TESTREPDIR/suites/ctest_report.xml
- .github/scripts/tests/generate-summary.py -t "#### Unittest failures" $TESTREPDIR/unittests/
- - name: sync test results to s3
- if: always() && inputs.run_unit_tests == 'true'
- shell: bash
- run: |
- echo "::group::s3-sync"
- s3cmd sync -P --no-progress --stats --no-check-md5 -P $ARTIFACTS_DIR/ $S3_BUCKET_PATH
- echo "::endgroup::"
- - name: Unit test history upload results
- if: always() && inputs.run_unit_tests == 'true' && inputs.testman_token
- shell: bash
- run: |
- testmo automation:run:submit-thread \
- --instance "$TESTMO_URL" --run-id ${{steps.th.outputs.runid}} \
- --results "$TESTREPDIR/unittests/*.xml"
- testmo automation:run:submit-thread \
- --exec-suppress \
- --instance "$TESTMO_URL" --run-id ${{steps.th.outputs.runid}} \
- --results "$TESTREPDIR/suites/*.xml" \
- -- cat $WORKDIR/short.log
- - name: Run functional tests
- if: inputs.run_functional_tests == 'true' && (success() || failure())
- shell: bash
- run: |
- export source_root=$WORKDIR
- export build_root=$WORKDIR/../build/
- echo "[Stdout pytest log (gzip archive)](${{steps.init.outputs.logurlprefix}}/${{steps.init.outputs.pytest-logfilename}})" >> $GITHUB_STEP_SUMMARY
- cd $WORKDIR/ydb/tests/functional/
- bad_suites=$(grep -Eo 'ignore=[a-zA-Z_-]*' pytest.ini | sed -e 's/ignore=//g')
- suites=""
- for suite in $(echo */ | sed -e 's/\///g'); do
- if [[ $(echo "$bad_suites" | grep -F -e $suite -) == '' ]]; then
- suites+=$suite
- suites+=$'\n'
- fi
- done
- if [[ "${{inputs.test_label_regexp}}" != '' ]]; then
- suites="${{inputs.test_label_regexp}}"
- fi
- source $WORKDIR/ydb/tests/oss/launch/prepare.sh
- echo -n "$suites" | parallel -j28 "pytest -o junit_logging=log -o junit_log_passing_tests=False \
- -v --junit-xml=$PYTESTREPDIR/{}.xml {}" | \
- sed -e 's/\x1b\[[0-9;]*m//g' | \
- tee >(gzip --stdout > $ARTIFACTS_DIR/${{steps.init.outputs.pytest-logfilename}}) | \
- grep -E '(FAILED|ERROR)\s*\[.*\]' | \
- tee $WORKDIR/pytest-short.log
- - name: write functional tests summary
- if: always() && inputs.run_functional_tests == 'true'
- shell: bash
- run: |
- .github/scripts/tests/generate-summary.py -t "#### Functional tests failures" $PYTESTREPDIR
- - name: Functional tests history upload results
- if: always() && inputs.run_functional_tests == 'true' && inputs.testman_token
- shell: bash
- run: |
- testmo automation:run:submit-thread \
- --instance "$TESTMO_URL" --run-id ${{steps.th.outputs.runid}} \
- --results "$PYTESTREPDIR/*.xml" \
- -- cat $WORKDIR/pytest-short.log
- - name: Test history run complete
- if: always() && inputs.testman_token
- shell: bash
- run: |
- testmo automation:run:complete --instance "$TESTMO_URL" --run-id ${{steps.th.outputs.runid}}
- - name: sync test results to s3
- if: always() && inputs.run_functional_tests == 'true'
- shell: bash
- run: |
- echo "::group::s3-sync"
- s3cmd sync -P --no-progress --stats --no-check-md5 -P $ARTIFACTS_DIR/ $S3_BUCKET_PATH
- echo "::endgroup::"
- - name: finish
- shell: bash
- run: |
- .github/scripts/tests/fail-checker.py $TESTREPDIR/unittests/ $TESTREPDIR/suites/
|