name: Ya-Build-and-Test inputs: build_target: type: string default: "ydb/" description: "limit build and test to specific target" build_preset: type: string run_build: type: boolean default: true description: "run build" run_tests: type: boolean default: true description: "run tests" run_tests_if_build_fails: default: "true" description: "run tests if build fails" test_threads: type: string default: 28 description: "Test threads count" link_threads: type: string default: 8 description: "link threads count" test_size: type: string default: "small,medium,large" test_type: type: string default: "" description: "run only specific test types (or all by default)" increment: type: boolean required: true description: If true, compares build graphs between the current and previous commits to find a list of test suites to run. Otherwise, runs all tests. folder_prefix: type: string default: "ya-" put_build_results_to_cache: type: boolean default: true additional_ya_make_args: type: string default: "" secs: type: string default: "" vars: type: string default: "" defaults: run: shell: bash runs: using: "composite" steps: - name: comment-build-start if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' shell: bash env: BUILD_PRESET: ${{ inputs.build_preset }} GITHUB_TOKEN: ${{ github.token }} run: | jobs_url="https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/jobs" # tricky: we are searching job with name that contains build_preset check_url=$(curl -s $jobs_url | jq --arg n "$BUILD_PRESET" -r '.jobs[] | select(.name | contains($n)) | .html_url') echo "Pre-commit [check]($check_url) for $(git rev-parse HEAD) has started." | .github/scripts/tests/comment-pr.py --rewrite curl -L -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{github.token}}" -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/${{github.repository}}/statuses/${{github.event.pull_request.head.sha}} \ -d '{"state":"pending","description":"The check has been started","context":"build_${{inputs.build_preset}}"}' if [[ "${{inputs.run_tests}}" == "true" ]];then curl -L -X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{github.token}}" -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/${{github.repository}}/statuses/${{github.event.pull_request.head.sha}} \ -d '{"state":"pending","description":"The check has been started","context":"test_${{inputs.build_preset}}"}' fi - name: Prepare s3cmd uses: ./.github/actions/s3cmd with: s3_bucket: ${{ fromJSON( inputs.vars ).AWS_BUCKET }} s3_endpoint: ${{ fromJSON( inputs.vars ).AWS_ENDPOINT }} s3_key_id: ${{ fromJSON( inputs.secs ).AWS_KEY_ID }} s3_key_secret: ${{ fromJSON( inputs.secs ).AWS_KEY_VALUE }} folder_prefix: ya- build_preset: ${{ inputs.build_preset }} - name: Generate ya.make with affected test suites and modules list if: inputs.increment == 'true' uses: ./.github/actions/graph_compare - name: Change target in case of incremental (tests) id: test_run_choice shell: bash run: | if [ "${{ inputs.increment }}" == "true" ]; then echo "target=." >> $GITHUB_OUTPUT else echo "target=${{ inputs.build_target }}" >> $GITHUB_OUTPUT fi - name: Build uses: ./.github/actions/build_ya id: build if: ${{ inputs.run_build == 'true' }} with: build_target: ${{ inputs.build_target }} build_preset: ${{ inputs.build_preset }} bazel_remote_uri: ${{ fromJSON( inputs.vars ).REMOTE_CACHE_URL || '' }} bazel_remote_username: ${{ fromJSON( inputs.secs ).REMOTE_CACHE_USERNAME || '' }} bazel_remote_password: ${{ fromJSON( inputs.secs ).REMOTE_CACHE_PASSWORD || '' }} put_build_results_to_cache: ${{ inputs.put_build_results_to_cache }} link_threads: ${{ inputs.link_threads }} additional_ya_make_args: ${{ inputs.additional_ya_make_args }} - name: Run tests uses: ./.github/actions/test_ya if: ${{ inputs.run_tests == 'true' && (steps.build.outputs.success == 'true' || inputs.run_tests_if_build_fails == 'true') }} with: build_target: ${{ steps.test_run_choice.outputs.target }} build_preset: ${{ inputs.build_preset }} test_size: ${{ inputs.test_size }} test_type: ${{ inputs.test_type }} testman_token: ${{ fromJSON( inputs.secs ).TESTMO_TOKEN }} testman_url: ${{ fromJSON( inputs.vars ).TESTMO_URL }} testman_project_id: ${{ fromJSON( inputs.vars ).TESTMO_PROJECT_ID }} link_threads: ${{ inputs.link_threads }} additional_ya_make_args: ${{ inputs.additional_ya_make_args }} test_threads: ${{ inputs.test_threads }} - name: Notify about failed build if: ${{ steps.build.outputs.success != 'true' && inputs.run_tests == 'true' && inputs.run_tests_if_build_fails == 'false' }} shell: bash run: | echo 'Build failed. See the [build log](${{ steps.build.outputs.log_url }}).' >> $GITHUB_STEP_SUMMARY if [[ "$GITHUB_EVENT_NAME" =~ ^pull_request ]]; then echo "Tests run skipped." | .github/scripts/tests/comment-pr.py --fail fi exit 1 - name: build_stats shell: bash continue-on-error: true if: always() run: | set -x export build_preset="${{ inputs.build_preset }}" python3 -m pip install ydb ydb[yc] python3 .github/scripts/send_build_stats.py - name: comment-if-cancel shell: bash if: cancelled() && (github.event_name == 'pull_request' || github.event_name == 'pull_request_target') env: BUILD_PRESET: ${{ inputs.build_preset }} GITHUB_TOKEN: ${{ github.token }} run: echo "Check cancelled" | .github/scripts/tests/comment-pr.py --color black