# SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Huawei Inc. ## ## Submits a job to LAVA with CI variables ## .lava-test: interruptible: true image: name: registry.ostc-eu.org/ostc/oniro/bitbake-builder:latest variables: GIT_STRATEGY: none CI_LAVA_INSTANCE: "https://lava.ostc-eu.org/" CI_SQUAD_INSTANCE: "https://squadp.svc.ostc-eu.dev" CI_SQUAD_GROUP_NAME: "" CI_SQUAD_PROJECT_NAME: "" CI_LAVA_JOB_PRIORITY: "medium" # Run the same ltp test suites that using by LKFT project. # Reference: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.98-75-g9f5cb871ceb9/testjobs/ LTP_TST_CMDFILES: "cap_bounds cpuhotplug crypto nptl pty securebits fs controllers hugetlb mm tracing containers io dio syscalls math commands ipc fcntl-locktests filecaps fs_bind fs_perms_simple fsx sched cve" before_script: - test -n "$CI_LAVA_TOKEN" || ( echo "precondition failed - please disable the child job if CI_LAVA_TOKEN not set in gitlab CI/CD variables" && exit 1 ) # Check if the job is configured properly. - test -n "$MACHINE" || ( echo "precondition failed - set MACHINE to the name of the target device for which the image is built" && exit 1 ) - test -n "$CI_BUILD_JOB_NAME" || ( echo "precondition failed - set CI_BUILD_JOB_NAME to the appropriate job name from which LAVA will pick up build artifact" && exit 1 ) - test -n "$CI_LAVA_JOB_DEFINITION" || ( echo "precondition failed - set CI_LAVA_JOB_DEFINITION to the URL of the LAVA test job definition" && exit 1 ) - test -n "$CI_REPORT_JOB_NAME" || ( echo "precondition failed - set CI_REPORT_JOB_NAME to the CI job name which will gather results back from Squad" && exit 1 ) - test -n "$CI_SQUAD_GROUP_NAME" || ( echo "precondition failed - set CI_SQUAD_GROUP_NAME to the squad group name." && exit 1 ) - test -n "$CI_SQUAD_PROJECT_NAME" || ( echo "precondition failed - set CI_SQUAD_PROJECT_NAME to the squad project name." && exit 1 ) # If the test job name contains 'sysota', usage of update job name is # required. - | if [[ -z "$CI_UPDATE_JOB_NAME" ]] && [[ "$CI_JOB_NAME" == *"sysota"* ]]; then echo "precondition failed - jobs with 'sysota' in their name must have CI_UPDATE_JOB_NAME variable with the name of the 'update' CI job that contains rauc bundles" exit 1 fi script: # Build callback URL for the "report" job - curl --silent "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs?per_page=100" > jobs-manual.json - job_id="$(jq -r ".[] | select(.name == \"$CI_REPORT_JOB_NAME\") | .id" jobs-manual.json)" - build_job_id="$(jq -r ".[] | select(.name == \"$CI_BUILD_JOB_NAME\") | .id" jobs-manual.json)" - update_job_id="$(jq -r ".[] | select(.name == \"$CI_UPDATE_JOB_NAME\") | .id" jobs-manual.json)" - CALLBACK_URL="$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/${job_id}/play" # Get the job definition from remote source. - curl --silent "$CI_LAVA_JOB_DEFINITION" > job_def.yaml # Update the job definition with CI data. - sed -i -e 's/@ci_job_id@/'"$CI_JOB_ID"'/' -e 's/@ci_project_id@/'"$CI_PROJECT_ID"'/' -e 's/@ci_pipeline_id@/'"$CI_PIPELINE_ID"'/' -e 's/@ci_lava_job_priority@/'"$CI_LAVA_JOB_PRIORITY"'/' -e 's,@ci_pipeline_url@,'"$CI_PIPELINE_URL"',' -e 's,@update_job_id@,'"$update_job_id"',' -e 's/@build_job_id@/'"$build_job_id"'/' job_def.yaml # Update the job with device configuration - sed -i -e 's/@BOARD_RAM_SIZE@/'"$BOARD_RAM_SIZE"'/g' job_def.yaml # Generate test jobs. - | set -x rm -rf lava_jobs && mkdir lava_jobs # Generate job definitions for zephyr build if echo "${CI_BUILD_JOB_NAME}" | grep -i "zephyr" | grep -vi "twister"; then for image in $(find artifacts/images/${MACHINE} -type f -name "*.elf" -exec basename {} \;); do image_basename=$(basename "${image}" ".elf") echo "--- Generating lava job definition ${image_basename}.yaml ---" sed "s/@image_basename@/$image_basename/" job_def.yaml | tee lava_jobs/"${image_basename}".yaml done # Generate job definitions for linux LTP test. elif grep -q "@TST_CMDFILES@" job_def.yaml; then for test_cmdfile in ${LTP_TST_CMDFILES}; do ltp_job_name="ltp-${test_cmdfile}.yaml" echo "--- Generating lava job definition ${ltp_job_name} ---" sed "s/@TST_CMDFILES@/${test_cmdfile}/" job_def.yaml | tee lava_jobs/"${ltp_job_name}" done else mv job_def.yaml lava_jobs/ fi set +x # Submit the jobs to SQUAD. - | for job_def in $(find lava_jobs/ -name "*.yaml"); do echo $CI_SQUAD_INSTANCE/api/submitjob/$CI_SQUAD_GROUP_NAME/$CI_SQUAD_PROJECT_NAME/$CI_PIPELINE_ID/$MACHINE --header "Auth-Token: $CI_SQUAD_TOKEN" --form "backend=oniro_lava" --form "definition=@${job_def}" curl $CI_SQUAD_INSTANCE/api/submitjob/$CI_SQUAD_GROUP_NAME/$CI_SQUAD_PROJECT_NAME/$CI_PIPELINE_ID/$MACHINE --header "Auth-Token: $CI_SQUAD_TOKEN" --form "backend=oniro_lava" --form "definition=@${job_def}" done # Attach a callback to this build to trigger the lava-report job squad_build_id="$(curl --silent "$CI_SQUAD_INSTANCE/api/builds/?version=$CI_PIPELINE_ID" | jq -r '.results[0].id')" curl --silent \ -X POST "$CI_SQUAD_INSTANCE/api/builds/$squad_build_id/callbacks/" \ -H "Authorization: Token $CI_SQUAD_TOKEN" \ -F "callback_url=$CALLBACK_URL" \ -F "callback_record_response=true" artifacts: paths: - lava_jobs/*.yaml rules: - if: '$CI_SQUAD_TOKEN == null' when: never # Run the build when it is scheduled. - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_TYPE == "daily" # Do not run pipelines for draft merge requests unless manually triggered. - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /^(wip|draft):.*/i' when: manual # Run the build when a merge request is created. - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # Run the build when a tag is placed. - if: '$CI_COMMIT_TAG' .lava-report: interruptible: true # Let the pipeline continue running 'lava-badge' job. allow_failure: true image: name: registry.ostc-eu.org/ostc/oniro/bitbake-builder:latest stage: report variables: GIT_STRATEGY: none CI_LAVA_INSTANCE: "https://lava.ostc-eu.org/" CI_SQUAD_INSTANCE: "https://squadp.svc.ostc-eu.dev" script: - | # Get the test_runs_incomplete value from build status. That will tell # us if any of the LAVA jobs failed and we can determine whether the # report job is successful or not. squad_build_id="$(curl --silent "$CI_SQUAD_INSTANCE/api/builds/?version=$CI_PIPELINE_ID" | jq -r '.results[0].id')" curl --silent "$CI_SQUAD_INSTANCE/api/builds/$squad_build_id/testjobs/" > test_jobs.json jq -r '.results | .[] | .name, .environment, .external_url, .job_status | @sh' test_jobs.json \ | xargs printf '------------\nname: %s\ndevice: %s\nurl: %s\nstatus: %s\n' \ | tee job_status.txt if grep -qi "incomplete" job_status.txt; then echo "ERROR: Incomplete test job reported: exit code 1" exit 1 fi rules: - if: '$CI_SQUAD_TOKEN == null' when: never # Run the build when it is scheduled. - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_TYPE == "daily" when: manual # Do not run pipelines for draft merge requests unless manually triggered. - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /^(wip|draft):.*/i' when: manual # Run the build when a merge request is created. - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: manual # Run the build when a tag is placed. - if: '$CI_COMMIT_TAG' when: manual .lava-badge: interruptible: true image: name: registry.ostc-eu.org/ostc/oniro/bitbake-builder:latest stage: report variables: GIT_STRATEGY: none CI_SQUAD_INSTANCE: "https://squadp.svc.ostc-eu.dev" script: - | set -x squad_build_id="$(curl --silent "$CI_SQUAD_INSTANCE/api/builds/?version=$CI_PIPELINE_ID" | jq -r '.results[0].id')" status_uri="$CI_SQUAD_INSTANCE/api/builds/$squad_build_id/status/" pass_percentage="$(curl --silent $status_uri | jq -r '.pass_percentage')" if [ "pass_percentage" != "null" ]; then success_rate=`printf "%.2f" $pass_percentage` else echo "ERROR: Failed to query pass percentage via $status_uri" exit 1 fi anybadge --label=lava-test --value=${success_rate} --suffix='%' --file=lava-test.svg 50=red 60=orange 80=yellow 100=green set +x artifacts: when: always paths: - lava-test.svg rules: # Run the build when it is scheduled. - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_TYPE == "daily" # Do not run pipelines for draft merge requests unless manually triggered. - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /^(wip|draft):.*/i' when: manual