Commit bfb495d3 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Enable CI for original float code

parent d631e089
Loading
Loading
Loading
Loading
Loading

.gitlab-ci.yml

0 → 100644
+594 −0
Original line number Diff line number Diff line
variables:
  TESTV_DIR: "/usr/local/testv"
  LTV_DIR: "/usr/local/ltv"
  EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop"
  REFERENCE_BRANCH: "ivas-float-update"
  BUILD_OUTPUT: "build_output.txt"
  SCRIPTS_DIR: "/usr/local/scripts"
  EXIT_CODE_NON_BE: 123
  EXIT_CODE_FAIL: 1
  LONG_TEST_SUITE: "tests/test_param_file_ltv.py tests/renderer"
  SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection"
  TEST_SUITE: ""
  DUT_ENCODER_PATH: "./IVAS_cod"
  DUT_DECODER_PATH: "./IVAS_dec"
  LEVEL_SCALING: "1.0"
  IVAS_PIPELINE_NAME: ''
  BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch"
  PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm"
  MANUAL_PIPELINE_TYPE:
    description: "Type for the manual pipeline run. Use 'pytest-mld' to run MLD test against reference float codec." # Not implemented yet, but may be good to have a manual pipeline trigger
    value: 'default'
    options:
      - 'default'
      - 'pytest-mld'
      - 'pytest-mld-interop'
      - 'pytest-mld-long'
      - 'pytest-saturation-smoke-test'
      - 'evs-26444'
      - 'sanitizer-stv'


default:
  interruptible: true # Make all jobs by default interruptible

workflow:
  name: '$IVAS_PIPELINE_NAME'
  rules:
    # see https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      variables:
        IVAS_PIPELINE_NAME: 'MR pipeline: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME'
    ### disabled for now because pipeline setup is redundant with MR pipeline with current workflow
    # - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main
    #   variables:
    #     IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing
      variables:
        IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld'
      variables:
        IVAS_PIPELINE_NAME: 'Run MLD tool against float ref: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld-interop'
      variables:
        IVAS_PIPELINE_NAME: 'Run MLD tool agains float ref - interop: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld-long'
      variables:
        IVAS_PIPELINE_NAME: 'Run MLD tool against float ref (long test vectors): $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-saturation-smoke-test'
      variables:
        IVAS_PIPELINE_NAME: 'Run saturation smoke-test: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'evs-26444'
      variables:
        IVAS_PIPELINE_NAME: 'EVS 26.444 test: $CI_COMMIT_BRANCH'
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'sanitizer-stv'
      variables:
        IVAS_PIPELINE_NAME: 'Short testvectors sanitizers'
    - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch
      variables:
        IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH'        


stages:
  - build
  - test

# ---------------------------------------------------------------
# Generic script anchors
# ---------------------------------------------------------------

# These can be used later on to do common tasks

# Prints useful information for every job and should be used at the beginning of each job
.print-common-info: &print-common-info
  - |
    echo "Printing common information for build job."
    echo "Current job is run on commit $CI_COMMIT_SHA"
    echo "Commit time was $CI_COMMIT_TIMESTAMP"
    date | xargs echo "System time is"

.setup-codec: &setup-codec
  - current_commit_sha=$(git rev-parse HEAD)
  ### build reference binaries
  - git checkout $REFERENCE_BRANCH
  - git pull
  - make clean
  - make -j
  - mv ./IVAS_cod ./IVAS_cod_ref
  - mv ./IVAS_dec ./IVAS_dec_ref
  - mv ./IVAS_rend ./IVAS_rend_ref

  ### build test binaries
  - git checkout $current_commit_sha
  - make clean
  - make -j


.mld-test-setup-codec: &mld-test-setup-codec
  - *setup-codec

  ### prepare pytest
  # create short test vectors
  - python3 tests/create_short_testvectors.py
  # create references
  - exit_code=0
  - python3 -m pytest $TEST_SUITE -v --update_ref 1 -m create_ref --create_ref -n auto || exit_code=$? 
  - python3 -m pytest $TEST_SUITE -v --update_ref 1 -m create_ref_part2 -n auto || exit_code=$? # Catch exit code to prevent halt in case this step produces zero tests


.update-scripts-repo: &update-scripts-repo
  - cd $SCRIPTS_DIR
  - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO
  - git remote prune origin
  - git branch
  - git fetch
  - git checkout $BASOP_CI_BRANCH_PC_REPO
  - git pull
  - cd -
  - cp -r $SCRIPTS_DIR/ci .
  - cp -r $SCRIPTS_DIR/scripts .
  - cp -r $SCRIPTS_DIR/tests .
  - cp $SCRIPTS_DIR/pytest.ini .

.apply-testv-scaling: &apply-testv-scaling
  - echo "Applying level scaling in scripts/testv using scale=$LEVEL_SCALING"
  - tests/scale_pcm.py ./scripts/testv/ $LEVEL_SCALING

.update-ltv-repo: &update-ltv-repo
  - cd $LTV_DIR
  - git pull
  - cd -
  
.copy-ltv-files-to-testv-dir: &copy-ltv-files-to-testv-dir
    - cp "$LTV_DIR"/*.wav scripts/testv/
    - cp "$LTV_DIR"/*.met scripts/testv/
    - cp "$LTV_DIR"/*.csv scripts/testv/

.rules-pytest-mld:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-mld"
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'schedule'
      when: never

.rules-pytest-mld-long:
  rules:
    - if: $PYTEST_MLD_LONG # Set by scheduled pipeline
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-mld-long"
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never


.rules-pytest-mld-interop:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-mld-interop"
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never

.rules-pytest-saturation-smoke-test:
  rules:
    - if: $PYTEST_SMOKE_TEST # Set by scheduled pipeline
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-saturation-smoke-test"
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never

# ---------------------------------------------------------------
# Job templates
# ---------------------------------------------------------------

# templates to define stages and platforms
.test-job-linux:
  tags:
    - ivas-basop-linux

.build-job-linux:
  stage: build
  timeout: "2 minutes"
  needs: []
  tags:
    - ivas-basop-linux

# template for test jobs on linux that need the TESTV_DIR
.test-job-linux-needs-testv-dir:
  extends: .test-job-linux
  before_script:
    - *update-scripts-repo
    - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi
    - cp -r scripts/testv/* $TESTV_DIR/

.ivas-pytest-mld-anchor: &ivas-pytest-mld-anchor
  stage: test
  needs: ["build-codec-linux-make"]
  timeout: "240 minutes"
  script:
    - *print-common-info
    - *update-scripts-repo
    - if [ $USE_LTV -eq 1 ]; then
    -    *update-ltv-repo
    -    *copy-ltv-files-to-testv-dir
    - fi
    - python3 ci/remove_unsupported_testcases.py $PRM_FILES
    - if [ $LEVEL_SCALING != "1.0" ];then
    -   *apply-testv-scaling
    - fi
    - *mld-test-setup-codec

    ### run pytest
    - exit_code=0
    # timeout of 15 min per individual testcase - hopefully too much, but better be safe for now
    - testcase_timeout=900
    - python3 -m pytest $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$?
    - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true

    - python3 scripts/parse_mld_xml.py report-junit.xml mld.csv

    - if [ $zero_errors != 1 ]; then echo "Run errors encountered!"; exit $EXIT_CODE_FAIL; fi
    - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_NON_BE; fi
    - exit 0

  allow_failure:
    exit_codes:
      - 123
  artifacts:
    name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results"
    expire_in: 1 week
    when: always
    paths:
      - report-junit.xml
      - report.html
      - mld.csv
    expose_as: "pytest mld results"
    reports:
      junit:
        - report-junit.xml
          

.ivas-pytest-sanitizers-anchor: &ivas-pytest-sanitizers-anchor
  stage: test
  needs: ["build-codec-linux-make"]
  timeout: "90 minutes"
  rules:
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
      when: never
    - if: $CI_PIPELINE_SOURCE == 'schedule' && $IVAS_PYTEST_MSAN
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "sanitizer-stv"
  script:
    - *print-common-info
    - *update-scripts-repo
    - python3 ci/remove_unsupported_testcases.py $PRM_FILES
    - *setup-codec
    - make clean
    - make -j CLANG=$CLANG_NUM
    - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi
    - testcase_timeout=300
    - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec
  artifacts:
    name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results"
    when: always
    expire_in: "2 weeks"
    paths:
      - report-junit.xml
      - report.html
    reports:
      junit:
        - report-junit.xml

# ---------------------------------------------------------------
# Build jobs
# ---------------------------------------------------------------

# ensure that codec builds on linux
build-codec-linux-make:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'web'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main
    - if: $CI_PIPELINE_SOURCE == 'schedule'
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
  extends:
    - .build-job-linux
  script:
    - *print-common-info
    - make -j

# ensure that codec builds on linux with instrumentation active
build-codec-linux-instrumented-make:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'web'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main
    - if: $CI_PIPELINE_SOURCE == 'schedule'
    - if: $CI_PIPELINE_SOURCE == 'push'
      when: never
  extends:
    - .build-job-linux
  script:
    - *print-common-info
    - sed -i".bak" "s/\/\*#define WMOPS 1\*\//#define WMOPS 1/g" lib_com/count.h
    - make -j

# ---------------------------------------------------------------
# Short test jobs 
# ---------------------------------------------------------------

#ivas-pytest-mld-enc-dec:
#  extends:
#    - .rules-pytest-mld
#    - .test-job-linux
#  before_script:
#    - USE_LTV=0
#    - TEST_SUITE="$SHORT_TEST_SUITE"
#    - LEVEL_SCALING=1.0
#  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-dec:
  extends:
    - .rules-pytest-mld
    - .test-job-linux    
  before_script:
    - USE_LTV=0
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=1.0
  <<: *ivas-pytest-mld-anchor
  
#ivas-pytest-mld-enc-dec-lev-10:
#  extends:
#    - .rules-pytest-mld
#    - .test-job-linux    
#  before_script:
#    - USE_LTV=0  
#    - TEST_SUITE="$SHORT_TEST_SUITE"
#    - LEVEL_SCALING=0.3162
#  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-dec-lev-10:
  extends:
    - .rules-pytest-mld
    - .test-job-linux    
  before_script:
    - USE_LTV=0  
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=0.3162
  <<: *ivas-pytest-mld-anchor

#ivas-pytest-mld-enc-dec-lev+10:
#  extends:
#    - .rules-pytest-mld
#    - .test-job-linux    
#  before_script:
#    - USE_LTV=0  
#    - TEST_SUITE="$SHORT_TEST_SUITE"
#    - LEVEL_SCALING=3.162
#  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-dec-lev+10:
  extends:
    - .rules-pytest-mld
    - .test-job-linux    
  before_script:
    - USE_LTV=0  
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=3.162
  <<: *ivas-pytest-mld-anchor

ivas-pytest-mld-long-enc-fx-dec-flt-interop:
  extends:
    - .rules-pytest-mld-interop
    - .test-job-linux
  before_script:
    - USE_LTV=0
    - DUT_DECODER_PATH=./IVAS_dec_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=1.0
  <<: *ivas-pytest-mld-anchor

ivas-pytest-mld-long-enc-fx-dec-flt-lev-10-interop:
  extends:
    - .rules-pytest-mld-interop
    - .test-job-linux
  before_script:
    - USE_LTV=0
    - DUT_DECODER_PATH=./IVAS_dec_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=0.3162
  <<: *ivas-pytest-mld-anchor

ivas-pytest-mld-long-enc-fx-dec-flt-lev+10-interop:
  extends:
    - .rules-pytest-mld-interop
    - .test-job-linux
  before_script:
    - USE_LTV=0
    - DUT_DECODER_PATH=./IVAS_dec_ref
    - TEST_SUITE="$SHORT_TEST_SUITE"
    - LEVEL_SCALING=3.162
  <<: *ivas-pytest-mld-anchor

ivas-pytest-dec-msan:
  extends:
    - .test-job-linux
  before_script:
    - CLANG_NUM=1
  <<: *ivas-pytest-sanitizers-anchor

ivas-pytest-dec-asan:
  extends:
    - .test-job-linux
  before_script:
    - CLANG_NUM=2
  <<: *ivas-pytest-sanitizers-anchor

ivas-pytest-dec-usan:
  extends:
    - .test-job-linux
  before_script:
    - CLANG_NUM=3
  <<: *ivas-pytest-sanitizers-anchor

# ---------------------------------------------------------------
# Long test jobs 
# ---------------------------------------------------------------

ivas-pytest-mld-long-enc-dec:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=1.0
  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-long-dec:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=1.0
  <<: *ivas-pytest-mld-anchor
  
ivas-pytest-mld-long-enc-dec-lev-10:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=0.3162
  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-long-dec-lev-10:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=0.3162
  <<: *ivas-pytest-mld-anchor

ivas-pytest-mld-long-enc-dec-lev+10:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=3.162
  <<: *ivas-pytest-mld-anchor  
  
ivas-pytest-mld-long-dec-lev+10:
  extends:
    - .rules-pytest-mld-long
    - .test-job-linux    
  before_script:
    - USE_LTV=1  
    - DUT_ENCODER_PATH=./IVAS_cod_ref
    - TEST_SUITE="$LONG_TEST_SUITE"
    - LEVEL_SCALING=3.162
  <<: *ivas-pytest-mld-anchor

ivas-smoke-test-saturation:
  extends:
    - .rules-pytest-saturation-smoke-test
    - .test-job-linux-needs-testv-dir
  script:
    - USE_LTV=1
    - LEVEL_SCALING=32768

    - *print-common-info
    - *update-scripts-repo
    - if [ $USE_LTV -eq 1 ]; then
    -    *update-ltv-repo
    -    *copy-ltv-files-to-testv-dir
    - fi
    - if [ $LEVEL_SCALING != "1.0" ];then
    -   *apply-testv-scaling
    - fi
    - cp -r scripts/testv/* $TESTV_DIR/

    # skip prepare_mem_dryrun.py script in smoke_test.sh
    - sed -i 's/python3 .\/scripts\/prepare_mem_dryrun.py/#python3 .\/scripts\/prepare_mem_dryrun.py/g' ci/smoke_test.sh

    - bash ci/smoke_test.sh
    ### analyze for failures
    - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_plc.txt ] || ! [ -s smoke_test_output_jbm_noEXT.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi
    - ret_val=0
    - if cat smoke_test_output.txt | grep -c "failed" ; then echo "Smoke test without PLC failed"; ret_val=1; fi
    - if cat smoke_test_output_plc.txt | grep -c "failed"; then echo "Smoke test with PLC failed"; ret_val=1; fi
    - if cat smoke_test_output_jbm_noEXT.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi
    - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi
    - exit $ret_val
  artifacts:
    name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results"
    expire_in: 1 week
    when: always
    paths:
      - smoke_test_output.txt
      - smoke_test_output_plc.txt
      - smoke_test_output_jbm_noEXT.txt
      - smoke_test_output_hrtf.txt
    expose_as: "saturation smoke test results"

# ---------------------------------------------------------------
# EVS 26.444 test job
# ---------------------------------------------------------------

# check bitexactness to EVS
be-2-evs-26444:
  extends:
    - .test-job-linux
  rules:
    - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "evs-26444"
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"
  tags:
    - be-2-evs-basop
  stage: test
  timeout: "120 minutes" # To be revisited
  script:
    - *print-common-info
    - *update-scripts-repo    
    - sed -i".bak" "s/\(#define EVS_FLOAT\)/\/\/\1/" lib_com/options.h
    - make -j

    # copy over to never change the testvector dir
    - cp -r $EVS_BE_TEST_DIR_BASOP ./evs_be_test
    - mkdir -p ./evs_be_test/output/decoded ./evs_be_test/output/bitstreams

    - exit_code=0
    - python3 -m pytest tests/test_26444.py -v --html=report.html --self-contained-html --junit-xml=report-junit.xml -n auto || exit_code=$?
    - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_FAIL; fi
    - exit 0
    
  artifacts:
    name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results"
    expire_in: 1 week
    when: always
    paths:
      - report-junit.xml
      - report.html
    expose_as: "EVS 26444 result"
    reports:
      junit:
        - report-junit.xml