diff --git a/.github/actions/archive-artifacts/action.yaml b/.github/actions/archive-artifacts/action.yaml index 2e9f89c2e9..06c158f23a 100644 --- a/.github/actions/archive-artifacts/action.yaml +++ b/.github/actions/archive-artifacts/action.yaml @@ -15,7 +15,7 @@ inputs: required: true stage: description: Stage name - default: ${{ github.job }}.${{ github.run_attempt }} + default: ${{ github.job }} required: true trunk_token: description: Trunk token @@ -35,11 +35,20 @@ runs: - name: Publish test report uses: mikepenz/action-junit-report@v4 with: - check_name: ${{ inputs.stage}} + annotate_only: true + check_name: ${{ inputs.stage }} report_paths: ${{ inputs.junit-paths }} - job_summary: job.status != 'success' # Only show the summary if the job failed + job_summary: false continue-on-error: true + - name: Upload test reports + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.stage }}-test-report + path: ${{ inputs.junit-paths }} + overwrite: true + retention-days: 5 + - name: Upload results if: inputs.trunk_token && job.status != 'cancelled' uses: trunk-io/analytics-uploader@v1.4.0 @@ -62,8 +71,12 @@ runs: kubectl get zenkodrsink -A -o yaml > /tmp/artifacts/data/${STAGE}/kind-logs/all-zenkodrsinks.log kind export logs /tmp/artifacts/data/${STAGE}/kind-logs/kind-export tar zcvf /tmp/artifacts/${{ github.sha }}-${STAGE}-logs-volumes.tgz /tmp/artifacts/data/${STAGE}/kind-logs + + mkdir -p /tmp/artifacts/data/${STAGE}/tests + cp -r ${JUNIT_PATHS} /tmp/artifacts/data/${STAGE}/tests env: - STAGE: ${{ inputs.stage }} + STAGE: ${{ inputs.stage }}.${{ github.run_attempt }} + JUNIT_PATHS: ${{ inputs.junit-paths }} continue-on-error: true - name: Dump kafka @@ -93,7 +106,7 @@ runs: kcat -L -b ${KAFKA_SERVICE} -t {} -C -o beginning -e -q -J \ > /tmp/artifacts/data/${STAGE}/kafka-messages-{}.log" env: - STAGE: ${{ inputs.stage }} + STAGE: ${{ inputs.stage }}.${{ github.run_attempt }} NAMESPACE: ${{ inputs.zenko-namespace }} ZENKO_NAME: ${{ inputs.zenko-name }} continue-on-error: true diff --git a/.github/actions/debug-wait/action.yaml b/.github/actions/debug-wait/action.yaml index 8549d78d51..9f63f120dd 100644 --- a/.github/actions/debug-wait/action.yaml +++ b/.github/actions/debug-wait/action.yaml @@ -13,4 +13,3 @@ runs: tmate-server-port: ${{ env.TMATE_SERVER_PORT }} tmate-server-rsa-fingerprint: ${{ env.TMATE_SERVER_RSA_FINGERPRINT }} tmate-server-ed25519-fingerprint: ${{ env.TMATE_SERVER_ED25519_FINGERPRINT }} - if: job.status == 'failure' && runner.debug == '1' diff --git a/.github/workflows/end2end.yaml b/.github/workflows/end2end.yaml index 8fdf52cd6a..e9fd84f51c 100644 --- a/.github/workflows/end2end.yaml +++ b/.github/workflows/end2end.yaml @@ -416,6 +416,7 @@ jobs: - name: Debug wait uses: ./.github/actions/debug-wait timeout-minutes: 60 + if: failure() && runner.debug == '1' - name: Archive and publish artifacts uses: ./.github/actions/archive-artifacts with: @@ -475,6 +476,7 @@ jobs: - name: Debug wait uses: ./.github/actions/debug-wait timeout-minutes: 60 + if: failure() && runner.debug == '1' - name: Archive and publish artifacts uses: ./.github/actions/archive-artifacts with: @@ -526,6 +528,7 @@ jobs: - name: Debug wait uses: ./.github/actions/debug-wait timeout-minutes: 60 + if: failure() && runner.debug == '1' - name: Archive and publish artifacts uses: ./.github/actions/archive-artifacts with: @@ -565,6 +568,7 @@ jobs: - name: Debug wait uses: ./.github/actions/debug-wait timeout-minutes: 60 + if: failure() && runner.debug == '1' - name: Archive and publish artifacts uses: ./.github/actions/archive-artifacts with: @@ -611,6 +615,7 @@ jobs: - name: Debug wait uses: ./.github/actions/debug-wait timeout-minutes: 60 + if: failure() && runner.debug == '1' - name: Archive and publish artifacts uses: ./.github/actions/archive-artifacts with: @@ -635,11 +640,62 @@ jobs: - end2end-sharded - end2end-pra - ctst-end2end-sharded + if: always() + permissions: + checks: write steps: - name: Upload final status - uses: scality/actions/upload_final_status@1.8.0 + uses: scality/actions/upload_final_status@1.9.0 with: ARTIFACTS_USER: ${{ secrets.ARTIFACTS_USER }} ARTIFACTS_PASSWORD: ${{ secrets.ARTIFACTS_PASSWORD }} JOBS_RESULTS: ${{ join(needs.*.result) }} - if: always() + + - name: Download all workflow run artifacts + uses: actions/download-artifact@v4 + + - name: List test reports + run: | + REPORT_PATHS= + CHECK_NAMES= + for REPORT in *-test-report ; do + REPORT_PATHS="${REPORT_PATHS}\n${REPORT}/*.xml" + CHECK_NAMES="${CHECK_NAMES}\n${REPORT%-test-report}" + done + + echo -e "REPORT_PATHS<> "$GITHUB_ENV" + echo -e "CHECK_NAMES<> "$GITHUB_ENV" + + - name: Generate test summary + uses: mikepenz/action-junit-report@v4 + id: summary + with: + annotate_only: true # Do not generate a Check or summary + check_retries: true # Check for retries + job_summary: false # No job summary + report_paths: ${{ env.REPORT_PATHS }} + check_name: ${{ env.CHECK_NAMES }} + + - name: Publish summary + run: | + NO_ERROR='-No test annotations available-' + DETAILED_SUMMARY=${DETAILED_SUMMARY//$NO_ERROR} + FLAKY_SUMMARY=${FLAKY_SUMMARY//$NO_ERROR} + SUMMARY="${SUMMARY} ${DETAILED_SUMMARY} ${FLAKY_SUMMARY}" + + echo "${SUMMARY}" >> $GITHUB_STEP_SUMMARY + echo "SUMMARY=${SUMMARY}" >> $GITHUB_ENV + env: + SUMMARY: ${{ steps.summary.outputs.summary }} + DETAILED_SUMMARY: ${{ steps.summary.outputs.detailed_summary }} + FLAKY_SUMMARY: ${{ steps.summary.outputs.flaky_summary }} + + - name: Publish check with test results + uses: mikepenz/action-junit-report@v4 + with: + check_name: 🧪 Test results # Create a new aggregate check + job_summary: false # No job summary + summary: ${{ env.SUMMARY }} # Use the summary from the previous step (in the check) + report_paths: '*-test-report/*.xml' + update_check: ${{ github.run_attempt > 1}} # Update existing aggregate check on retry + job_name: 🧪 Test results # Need to specify the check_name in case of update