aboutsummaryrefslogtreecommitdiffstats
path: root/.github/actions/build_and_test_ya/action.yml
blob: b280c4d938ada7d68bcdedbff6cf7b7307939a0d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
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: 12
    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: target_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: ${{ steps.target_choice.outputs.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.target_choice.outputs.target }}
        build_preset: ${{ inputs.build_preset }}
        test_size: ${{ inputs.test_size }}
        test_type: ${{ inputs.test_type }}
        testman_token: ${{ fromJSON( inputs.secs ).TESTMO_TOKEN2 }}
        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 }}
        bazel_remote_uri: ${{  fromJSON( inputs.vars ).REMOTE_CACHE_URL || '' }}

    
    - name: Notify about failed build
      if: ${{ steps.build.outputs.success != 'true' && inputs.run_tests == 'true' && inputs.run_tests_if_build_fails == 'false' }}
      shell: bash
      env:
        GITHUB_TOKEN: ${{ github.token }}
      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 }}" 
        export commit_git_sha="$(git rev-parse HEAD)"

        python3 -m pip install ydb ydb[yc]
        python3 .github/scripts/send_build_stats.py

    - name: show_build_size_diff
      shell: bash
      continue-on-error: true
      if: always()
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: |
        set -x
        export build_preset="${{ inputs.build_preset }}" 
        export branch_to_compare="$GITHUB_REF_NAME" 
        export yellow_treshold=102400
        export red_treshold=2097152 
        export commit_git_sha="$(git rev-parse HEAD)"

        python3 -m pip install ydb ydb[yc] humanize

        get_sizes_comment_script=.github/scripts/get_build_diff.py
        comment_raw=`$get_sizes_comment_script`
        
        IFS=';;;'
        read -ra comment_arr <<< "$comment_raw"

        printf "$comment"
        if [[ ${comment_raw} != "Error"* ]];then
          color=${comment_arr[0]}
          replace=$color";;;"
          comment=${comment_raw/$replace/""}
          
          printf "$comment" | .github/scripts/tests/comment-pr.py --color $color

        else
          echo "Skipped build size difference, comment_raw = ${comment_raw}"
        fi

    - 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