From df1777abbeebf95ad350b7d0d4f9373c741b6c25 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 08:32:42 +0200 Subject: [PATCH 01/14] CVS-188020_pre_commit_doc_tests --- ci/build_test_OnCommit.groovy | 79 ++++++++++++++++++++++++++--------- ci/check_md_code_changes.sh | 55 ++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 19 deletions(-) create mode 100644 ci/check_md_code_changes.sh diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index e68487d636..fc50e26df7 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -2,9 +2,11 @@ def image_build_needed = "false" def win_image_build_needed = "false" def client_test_needed = "false" def export_models_changed = "false" +def doc_changed_files = "" def shortCommit = "" def agent_name_windows = "" def agent_name_linux = "" +def agent_name_linux_doc = "ovms_ptl" pipeline { agent { @@ -26,11 +28,14 @@ pipeline { echo shortCommit echo sh(script: 'env|sort', returnStdout: true) def git_diff = "" + def diffBase = "" if (env.CHANGE_ID){ // PR - check changes between target branch sh 'git fetch origin ${CHANGE_TARGET}' - git_diff = sh (script: "git diff --name-only \$(git merge-base FETCH_HEAD HEAD)", returnStdout: true).trim() + diffBase = sh(script: 'git merge-base FETCH_HEAD HEAD', returnStdout: true).trim() + git_diff = sh (script: "git diff --name-only ${diffBase}", returnStdout: true).trim() println("git diff:\n${git_diff}") } else { // branches without PR - check changes in last commit + diffBase = 'HEAD^' git_diff = sh (script: "git diff --name-only HEAD^..HEAD", returnStdout: true).trim() } def matched = (git_diff =~ /src|third_party|external|(\n|^)Dockerfile|(\n|^)Makefile|\.c|\.h|\.bazel|\.bzl|\.groovy|BUILD|create_package\.sh|WORKSPACE|(\n|^)run_unit_tests\.sh|versions\.mk/) @@ -41,7 +46,7 @@ pipeline { if (matched){ client_test_needed = "true" } - def export_models_matched = (git_diff =~ /(\n|^)(demos\/common\/export_models\/|prepare_llm_models\.sh$)/) + def export_models_matched = (git_diff =~ /(\n|^)(demos\/common\/export_models\/|prepare_llm_models\.sh$)/) if (export_models_matched){ export_models_changed = "true" } @@ -49,6 +54,7 @@ pipeline { if (win_matched){ win_image_build_needed = "true" } + doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() } } } @@ -108,15 +114,15 @@ pipeline { OVMS_BAZEL_REMOTE_CACHE_URL = "${env.OVMS_BAZEL_REMOTE_CACHE_URL ?: 'http://mclx-23.sclab.intel.com:8666'}" } steps { - script { - def runTestsFlag = export_models_changed == "true" ? "1" : "0" - sh "echo 'Build linux RUN_TESTS=${runTestsFlag} (export_models_changed=${export_models_changed})'" - sh "echo build --remote_cache=${env.OVMS_BAZEL_REMOTE_CACHE_URL} > .user.bazelrc" - sh "echo test:linux --test_env https_proxy=${env.HTTPS_PROXY} >> .user.bazelrc" - sh "echo test:linux --test_env http_proxy=${env.HTTP_PROXY} >> .user.bazelrc" - sh "make ovms_builder_image RUN_TESTS=${runTestsFlag} OPTIMIZE_BUILDING_TESTS=1 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" - } - } + script { + def runTestsFlag = export_models_changed == "true" ? "1" : "0" + sh "echo 'Build linux RUN_TESTS=${runTestsFlag} (export_models_changed=${export_models_changed})'" + sh "echo build --remote_cache=${env.OVMS_BAZEL_REMOTE_CACHE_URL} > .user.bazelrc" + sh "echo test:linux --test_env https_proxy=${env.HTTPS_PROXY} >> .user.bazelrc" + sh "echo test:linux --test_env http_proxy=${env.HTTP_PROXY} >> .user.bazelrc" + sh "make ovms_builder_image RUN_TESTS=${runTestsFlag} OPTIMIZE_BUILDING_TESTS=1 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + } + } } stage('Build windows') { agent { @@ -152,8 +158,20 @@ pipeline { } } } - stage("Release image and tests in parallel") { + stage('Build linux release image') { + agent { + label "${agent_name_linux}" + } when { expression { image_build_needed == "true" } } + steps { + sh "make release_image RUN_TESTS=0 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + sh "make run_lib_files_test BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" + sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" + stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' + sh "rm -f ovms_release_image.tar.gz" + } + } + stage("Release image and tests in parallel") { options { timeout(time: 120, unit: 'MINUTES') } @@ -162,6 +180,7 @@ pipeline { agent { label "${agent_name_linux}" } + when { expression { image_build_needed == "true" } } steps { script { println "Running unit tests: NODE_NAME = ${env.NODE_NAME}" @@ -179,15 +198,11 @@ pipeline { agent { label "${agent_name_linux}" } + when { expression { image_build_needed == "true" } } steps { - sh "make release_image RUN_TESTS=0 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" - sh "make run_lib_files_test BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" script { - dir ('internal_tests'){ - checkout scmGit( - branches: [[name: 'develop']], - userRemoteConfigs: [[credentialsId: 'workflow-lab', - url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + dir ('internal_tests'){ + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" pwd = sh(returnStdout:true, script: "pwd").strip() sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional && TT_ON_COMMIT_TESTS=True TT_XDIST_WORKERS=10 TT_BASE_OS=redhat TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" @@ -195,6 +210,32 @@ pipeline { } } } + stage("Documentation tests") { + agent { + label "${agent_name_linux_doc}" + } + when { expression { doc_changed_files } } + steps { + script { + dir ('documentation_tests') { + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + sh "pwd" + pwd = sh(returnStdout:true, script: "pwd").strip() + doc_changed_files_str = doc_changed_files.split('\n').join(' or ') + sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" + if ( image_build_needed == "true" ) { + unstash 'ovms-release-image' + sh "gunzip -c ovms_release_image.tar.gz | docker load" + sh "rm -f ovms_release_image.tar.gz" + sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests/non_functional/documentation -k '${doc_changed_files_str}'" + } else { + sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat make tests/non_functional/documentation -k '${doc_changed_files_str}'" + } + + } + } + } + } stage('Test windows') { agent { label "${agent_name_windows}" diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh new file mode 100644 index 0000000000..e6b798d9ac --- /dev/null +++ b/ci/check_md_code_changes.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# Checks git diff for .md files and reports those where changes +# fall inside ```bash, ```bat, or ```console fenced code blocks. +# Usage: ./check_md_code_changes.sh [base_ref] +# base_ref: optional git ref to diff against (default: HEAD) + +set -euo pipefail + +BASE_REF="${1:-HEAD}" + +# Get list of changed .md files +changed_md_files=$(git diff --name-only "$BASE_REF" HEAD -- '*.md') + +if [ -z "$changed_md_files" ]; then + exit 0 +fi + +matched_files=() + +while IFS= read -r file; do + [ -z "$file" ] && continue + + # Extract changed line numbers in the new version from hunk headers + changed_lines=$(git diff "$BASE_REF" HEAD -- "$file" \ + | awk '/^@@/ { + match($0, /\+([0-9]+)(,([0-9]+))?/, arr) + start = arr[1] + count = (arr[3] != "") ? arr[3] : 1 + for (i = start; i < start + count; i++) print i + }') + + if [ -z "$changed_lines" ]; then + continue + fi + + # Use awk to find which lines are inside ```bash/bat/console blocks, + # then check if any of those overlap with changed lines + hit=$(awk -v lines="$changed_lines" ' + BEGIN { + n = split(lines, arr, "\n") + for (i = 1; i <= n; i++) changed[arr[i]] = 1 + } + /^```(bash|bat|console)/ { in_block = 1; next } + /^```/ { in_block = 0; next } + in_block && (NR in changed) { print FILENAME; exit } + ' "$file") + + if [ -n "$hit" ]; then + matched_files+=("$file") + fi +done <<< "$changed_md_files" + +if [ ${#matched_files[@]} -gt 0 ]; then + printf '%s\n' "${matched_files[@]}" +fi From f94e9c8f3f4b29f761f90b291f21415d8cc5e56a Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 08:33:19 +0200 Subject: [PATCH 02/14] doc changes for testing --- demos/embeddings/README.md | 3 +++ demos/person_vehicle_bike_detection/python/README.md | 2 +- demos/universal-sentence-encoder/README.md | 1 + demos/vehicle_analysis_pipeline/python/README.md | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/demos/embeddings/README.md b/demos/embeddings/README.md index a6e2c6d179..2cade8995d 100644 --- a/demos/embeddings/README.md +++ b/demos/embeddings/README.md @@ -16,6 +16,9 @@ Text generation use case is exposed via OpenAI API `embeddings` endpoint. This procedure can be used to pull preconfigured models from OpenVINO organization in HuggingFace Hub +test +test + **CPU** ::::{tab-set} :::{tab-item} OpenVINO/Qwen3-Embedding-0.6B-int8-ov diff --git a/demos/person_vehicle_bike_detection/python/README.md b/demos/person_vehicle_bike_detection/python/README.md index f22ed4a0ac..3da029ae20 100644 --- a/demos/person_vehicle_bike_detection/python/README.md +++ b/demos/person_vehicle_bike_detection/python/README.md @@ -3,7 +3,7 @@ The purpose of this demo is to show how to send data from multiple sources (cameras, video files) to a model served in OpenVINO Model Server. ## Prerequisites - +teststest **Model preparation**: Python 3.9 or higher with pip **Model Server deployment**: Installed Docker Engine or OVMS binary package according to the [baremetal deployment guide](../../../docs/deploying_server_baremetal.md) diff --git a/demos/universal-sentence-encoder/README.md b/demos/universal-sentence-encoder/README.md index ad36dcbcb0..5374f78437 100644 --- a/demos/universal-sentence-encoder/README.md +++ b/demos/universal-sentence-encoder/README.md @@ -14,6 +14,7 @@ rm universal-sentence-encoder-multilingual/1/3.tar.gz Make sure the downloaded model has right permissions ```bash chmod -R 755 universal-sentence-encoder-multilingual +echo "TEST" ``` The model setup should look like this diff --git a/demos/vehicle_analysis_pipeline/python/README.md b/demos/vehicle_analysis_pipeline/python/README.md index eb19a9b04d..7cad1e88e1 100644 --- a/demos/vehicle_analysis_pipeline/python/README.md +++ b/demos/vehicle_analysis_pipeline/python/README.md @@ -31,6 +31,7 @@ Clone the repository and enter vehicle_analysis_pipeline directory ```bash git clone https://github.com/openvinotoolkit/model_server.git cd model_server/demos/vehicle_analysis_pipeline/python +echo "TEST" ``` You can prepare the workspace that contains all the above by just running `make` command. From 7e5abc11adbad50b4901e6ec11271a65726caec2 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 08:46:55 +0200 Subject: [PATCH 03/14] update chmod for sh file --- ci/check_md_code_changes.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 ci/check_md_code_changes.sh diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh old mode 100644 new mode 100755 From fa6a1d24adb30cb7d77a0178122fb80c4aa736dc Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 10:55:22 +0200 Subject: [PATCH 04/14] update execute for sh script --- ci/build_test_OnCommit.groovy | 2 +- ci/check_md_code_changes.sh | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index fc50e26df7..4e3452a0cb 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -38,6 +38,7 @@ pipeline { diffBase = 'HEAD^' git_diff = sh (script: "git diff --name-only HEAD^..HEAD", returnStdout: true).trim() } + doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() def matched = (git_diff =~ /src|third_party|external|(\n|^)Dockerfile|(\n|^)Makefile|\.c|\.h|\.bazel|\.bzl|\.groovy|BUILD|create_package\.sh|WORKSPACE|(\n|^)run_unit_tests\.sh|versions\.mk/) if (matched){ image_build_needed = "true" @@ -54,7 +55,6 @@ pipeline { if (win_matched){ win_image_build_needed = "true" } - doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() } } } diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh index e6b798d9ac..0635a35d10 100755 --- a/ci/check_md_code_changes.sh +++ b/ci/check_md_code_changes.sh @@ -1,4 +1,20 @@ #!/bin/bash +# +# Copyright (c) 2026 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + # Checks git diff for .md files and reports those where changes # fall inside ```bash, ```bat, or ```console fenced code blocks. # Usage: ./check_md_code_changes.sh [base_ref] From 6e4d464209b4cd60e8a492d4f6bc1b443f4b3646 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 11:30:56 +0200 Subject: [PATCH 05/14] updates --- ci/build_test_OnCommit.groovy | 4 ++-- ci/check_md_code_changes.sh | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index 4e3452a0cb..fd76dddbb1 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -227,9 +227,9 @@ pipeline { unstash 'ovms-release-image' sh "gunzip -c ovms_release_image.tar.gz | docker load" sh "rm -f ovms_release_image.tar.gz" - sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests/non_functional/documentation -k '${doc_changed_files_str}'" + sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\" TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" } else { - sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat make tests/non_functional/documentation -k '${doc_changed_files_str}'" + sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\" make tests" } } diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh index 0635a35d10..1ff68e708e 100755 --- a/ci/check_md_code_changes.sh +++ b/ci/check_md_code_changes.sh @@ -18,11 +18,11 @@ # Checks git diff for .md files and reports those where changes # fall inside ```bash, ```bat, or ```console fenced code blocks. # Usage: ./check_md_code_changes.sh [base_ref] -# base_ref: optional git ref to diff against (default: HEAD) +# base_ref: optional git ref to diff against (default: HEAD~1) set -euo pipefail -BASE_REF="${1:-HEAD}" +BASE_REF="${1:-HEAD~1}" # Get list of changed .md files changed_md_files=$(git diff --name-only "$BASE_REF" HEAD -- '*.md') @@ -37,7 +37,7 @@ while IFS= read -r file; do [ -z "$file" ] && continue # Extract changed line numbers in the new version from hunk headers - changed_lines=$(git diff "$BASE_REF" HEAD -- "$file" \ + changed_lines=$(git diff --unified=0 "$BASE_REF" HEAD -- "$file" \ | awk '/^@@/ { match($0, /\+([0-9]+)(,([0-9]+))?/, arr) start = arr[1] From 8c5ef14b1056d65df7874060a7bc865bf4f186bc Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Wed, 3 Jun 2026 15:35:59 +0200 Subject: [PATCH 06/14] added windows stage --- ci/build_test_OnCommit.groovy | 69 ++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index fd76dddbb1..e3dd61efaf 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -3,10 +3,13 @@ def win_image_build_needed = "false" def client_test_needed = "false" def export_models_changed = "false" def doc_changed_files = "" +def doc_changed_files_str = "" def shortCommit = "" def agent_name_windows = "" +def agent_name_windows_doc = "ovms_win_ptl" def agent_name_linux = "" def agent_name_linux_doc = "ovms_ptl" +def enable_doc_tests_unix = true pipeline { agent { @@ -39,6 +42,10 @@ pipeline { git_diff = sh (script: "git diff --name-only HEAD^..HEAD", returnStdout: true).trim() } doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() + if (doc_changed_files) { + doc_changed_files_str = doc_changed_files.split('\n').join(' or ') + } + def matched = (git_diff =~ /src|third_party|external|(\n|^)Dockerfile|(\n|^)Makefile|\.c|\.h|\.bazel|\.bzl|\.groovy|BUILD|create_package\.sh|WORKSPACE|(\n|^)run_unit_tests\.sh|versions\.mk/) if (matched){ image_build_needed = "true" @@ -121,6 +128,15 @@ pipeline { sh "echo test:linux --test_env https_proxy=${env.HTTPS_PROXY} >> .user.bazelrc" sh "echo test:linux --test_env http_proxy=${env.HTTP_PROXY} >> .user.bazelrc" sh "make ovms_builder_image RUN_TESTS=${runTestsFlag} OPTIMIZE_BUILDING_TESTS=1 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + + // release_image + sh "make release_image RUN_TESTS=0 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + sh "make run_lib_files_test BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" + if ( doc_changed_files ) { + sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" + stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' + sh "rm -f ovms_release_image.tar.gz" + } } } } @@ -147,6 +163,7 @@ pipeline { windows.install_dependencies() windows.clean() windows.build() + stash name: 'ovms-windows-package', includes: 'dist\\windows\\ovms.zip' } finally { windows.archive_build_artifacts() } @@ -158,20 +175,7 @@ pipeline { } } } - stage('Build linux release image') { - agent { - label "${agent_name_linux}" - } - when { expression { image_build_needed == "true" } } - steps { - sh "make release_image RUN_TESTS=0 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" - sh "make run_lib_files_test BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" - sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" - stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' - sh "rm -f ovms_release_image.tar.gz" - } - } - stage("Release image and tests in parallel") { + stage("Tests in parallel") { options { timeout(time: 120, unit: 'MINUTES') } @@ -214,23 +218,25 @@ pipeline { agent { label "${agent_name_linux_doc}" } - when { expression { doc_changed_files } } + when { expression { doc_changed_files && enable_doc_tests_unix } } steps { script { dir ('documentation_tests') { checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" pwd = sh(returnStdout:true, script: "pwd").strip() - doc_changed_files_str = doc_changed_files.split('\n').join(' or ') sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" + def cmd_export = "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_ENABLE_UAT_TESTS=True TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\"" + def cmd = "" if ( image_build_needed == "true" ) { unstash 'ovms-release-image' sh "gunzip -c ovms_release_image.tar.gz | docker load" sh "rm -f ovms_release_image.tar.gz" - sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\" TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" + cmd = "${cmd_export} TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" } else { - sh "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\" make tests" + cmd = "${cmd_export} make tests" } + sh cmd } } @@ -261,6 +267,33 @@ pipeline { } } } + stage("Documentation tests windows") { + agent { + label "${agent_name_windows_doc}" + } + when { expression { doc_changed_files } } + steps { + script { + dir ('documentation_tests') { + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() + def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() + def cmd_link_ovms = "mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" + def cmd_requirements = "virtualenv .venv --python=python3.12 && .venv\\Scripts\\activate.bat && pip install -r requirements.txt" + def cmd_export = "set TT_RUN_REGRESSION_TESTS=True && set TT_REGRESSION_WEEKLY_TESTS=True && set TT_BASE_OS=windows && set TT_ENABLE_UAT_TESTS=True" + def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${shortCommit}\"" + def cmd = "" + if ( win_image_build_needed == "true" ) { + unstash 'ovms-windows-package' + cmd = "${cmd_link_ovms} && ${cmd_requirements} && set TT_OVMS_C_RELEASE_ARTIFACTS_PATH=\"dist\\windows\\ovms.zip\" && ${cmd_export} && ${cmd_pytest}" + } else { + cmd = "${cmd_link_ovms} && ${cmd_requirements} && ${cmd_export} && ${cmd_pytest}" + } + bat cmd + } + } + } + } } } } From 3a2d8e158e6f957e40347800d49663c50e530f68 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Fri, 5 Jun 2026 09:46:39 +0200 Subject: [PATCH 07/14] updates --- ci/build_test_OnCommit.groovy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index e3dd61efaf..26b54cb158 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -9,7 +9,7 @@ def agent_name_windows = "" def agent_name_windows_doc = "ovms_win_ptl" def agent_name_linux = "" def agent_name_linux_doc = "ovms_ptl" -def enable_doc_tests_unix = true +def enable_doc_tests_linux = true pipeline { agent { @@ -218,7 +218,7 @@ pipeline { agent { label "${agent_name_linux_doc}" } - when { expression { doc_changed_files && enable_doc_tests_unix } } + when { expression { doc_changed_files && enable_doc_tests_linux } } steps { script { dir ('documentation_tests') { @@ -226,7 +226,7 @@ pipeline { sh "pwd" pwd = sh(returnStdout:true, script: "pwd").strip() sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" - def cmd_export = "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=3 TT_BASE_OS=redhat TT_ENABLE_UAT_TESTS=True TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\"" + def cmd_export = "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=0 TT_TARGET_DEVICE=CPU TT_BASE_OS=redhat TT_ENABLE_UAT_TESTS=True TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\"" def cmd = "" if ( image_build_needed == "true" ) { unstash 'ovms-release-image' @@ -280,8 +280,8 @@ pipeline { def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() def cmd_link_ovms = "mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" def cmd_requirements = "virtualenv .venv --python=python3.12 && .venv\\Scripts\\activate.bat && pip install -r requirements.txt" - def cmd_export = "set TT_RUN_REGRESSION_TESTS=True && set TT_REGRESSION_WEEKLY_TESTS=True && set TT_BASE_OS=windows && set TT_ENABLE_UAT_TESTS=True" - def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${shortCommit}\"" + def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_ENABLE_UAT_TESTS=True\"" + def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" def cmd = "" if ( win_image_build_needed == "true" ) { unstash 'ovms-windows-package' From 2bcb3dd7f4314524fed716a9b90050219bc14110 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Fri, 5 Jun 2026 16:23:45 +0200 Subject: [PATCH 08/14] [doc_changed_files=demos/continuous_batching/README.md]][agent_name_linux_doc=ovms_lnl][agent_name_windows_doc=ovms_win_lnl] add parameters override from commit --- ci/build_test_OnCommit.groovy | 165 ++++++++++++++++++++++------------ 1 file changed, 110 insertions(+), 55 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index 26b54cb158..e2b0649dca 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -8,8 +8,9 @@ def shortCommit = "" def agent_name_windows = "" def agent_name_windows_doc = "ovms_win_ptl" def agent_name_linux = "" -def agent_name_linux_doc = "ovms_ptl" -def enable_doc_tests_linux = true +def agent_name_linux_doc = "ovms_spr" +def disable_doc_tests_linux = false +def disable_doc_tests_windows = false pipeline { agent { @@ -41,27 +42,50 @@ pipeline { diffBase = 'HEAD^' git_diff = sh (script: "git diff --name-only HEAD^..HEAD", returnStdout: true).trim() } - doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() - if (doc_changed_files) { - doc_changed_files_str = doc_changed_files.split('\n').join(' or ') - } - def matched = (git_diff =~ /src|third_party|external|(\n|^)Dockerfile|(\n|^)Makefile|\.c|\.h|\.bazel|\.bzl|\.groovy|BUILD|create_package\.sh|WORKSPACE|(\n|^)run_unit_tests\.sh|versions\.mk/) - if (matched){ + if (git_diff =~ /src|third_party|external|(\n|^)Dockerfile|(\n|^)Makefile|\.c|\.h|\.bazel|\.bzl|\.groovy|BUILD|create_package\.sh|WORKSPACE|(\n|^)run_unit_tests\.sh|versions\.mk/) { image_build_needed = "true" } - matched = (git_diff =~ /(\n|^)client/) - if (matched){ + if (git_diff =~ /(\n|^)client/) { client_test_needed = "true" } - def export_models_matched = (git_diff =~ /(\n|^)(demos\/common\/export_models\/|prepare_llm_models\.sh$)/) - if (export_models_matched){ + if (git_diff =~ /(\n|^)(demos\/common\/export_models\/|prepare_llm_models\.sh$)/) { export_models_changed = "true" - } - def win_matched = (git_diff =~ /src|third_party|external|ci|test_install_ovms_service_windows\\.py|\.c|\.h|\.bazel|\.bzl|BUILD|WORKSPACE|\.bat|\.groovy/) - if (win_matched){ + } + if (git_diff =~ /src|third_party|external|ci|test_install_ovms_service_windows\\.py|\.c|\.h|\.bazel|\.bzl|BUILD|WORKSPACE|\.bat|\.groovy/) { win_image_build_needed = "true" } + + // Override flags from commit message, e.g. [disable_doc_tests_linux] + def commitMsg = sh(returnStdout: true, script: "git log -1 --pretty=format:'%B'").trim() + if (commitMsg =~ /\[disable_doc_tests_linux\]/) { + disable_doc_tests_linux = true + println "Commit override: disable_doc_tests_linux = true" + } + if (commitMsg =~ /\[disable_doc_tests_windows\]/) { + disable_doc_tests_windows = true + println "Commit override: disable_doc_tests_windows = true" + } + def agentLinuxDocMatch = (commitMsg =~ /\[agent_name_linux_doc=([^\]]+)\]/) + if (agentLinuxDocMatch) { + agent_name_linux_doc = agentLinuxDocMatch[0][1] + println "Commit override: agent_name_linux_doc = ${agent_name_linux_doc}" + } + def agentWindowsDocMatch = (commitMsg =~ /\[agent_name_windows_doc=([^\]]+)\]/) + if (agentWindowsDocMatch) { + agent_name_windows_doc = agentWindowsDocMatch[0][1] + println "Commit override: agent_name_windows_doc = ${agent_name_windows_doc}" + } + def docChangedFilesMatch = (commitMsg =~ /\[doc_changed_files=([^\]]+)\]/) + if (docChangedFilesMatch) { + doc_changed_files = docChangedFilesMatch[0][1].replaceAll(' ', '\n') + println "Commit override: doc_changed_files = ${doc_changed_files}" + } else { + doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() + } + if (doc_changed_files) { + doc_changed_files_str = doc_changed_files.split('\n').join(' or ') + } } } } @@ -136,6 +160,10 @@ pipeline { sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' sh "rm -f ovms_release_image.tar.gz" + + sh "docker save openvino/model_server-gpu:${shortCommit} | gzip > ovms_release_image_gpu.tar.gz" + stash name: 'ovms-release-image-gpu', includes: 'ovms_release_image_gpu.tar.gz' + sh "rm -f ovms_release_image_gpu.tar.gz" } } } @@ -206,7 +234,7 @@ pipeline { steps { script { dir ('internal_tests'){ - checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" pwd = sh(returnStdout:true, script: "pwd").strip() sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional && TT_ON_COMMIT_TESTS=True TT_XDIST_WORKERS=10 TT_BASE_OS=redhat TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" @@ -215,29 +243,46 @@ pipeline { } } stage("Documentation tests") { - agent { - label "${agent_name_linux_doc}" + agent none + when { + expression { doc_changed_files && !disable_doc_tests_linux } + beforeAgent true } - when { expression { doc_changed_files && enable_doc_tests_linux } } steps { - script { - dir ('documentation_tests') { - checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) - sh "pwd" - pwd = sh(returnStdout:true, script: "pwd").strip() - sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" - def cmd_export = "TT_RUN_REGRESSION_TESTS=True TT_REGRESSION_WEEKLY_TESTS=True TT_XDIST_WORKERS=0 TT_TARGET_DEVICE=CPU TT_BASE_OS=redhat TT_ENABLE_UAT_TESTS=True TT_PYTEST_PARAMS=\"tests/non_functional/documentation -k '${doc_changed_files_str}'\"" - def cmd = "" - if ( image_build_needed == "true" ) { - unstash 'ovms-release-image' - sh "gunzip -c ovms_release_image.tar.gz | docker load" - sh "rm -f ovms_release_image.tar.gz" - cmd = "${cmd_export} TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" - } else { - cmd = "${cmd_export} make tests" - } - sh cmd + node(agent_name_linux_doc) { + checkout scm + script { + dir ('documentation_tests') { + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + sh "pwd" + pwd = sh(returnStdout:true, script: "pwd").strip() + ovms_c_repo_path = sh(returnStdout:true, script: "cd .. && pwd").strip() + sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" + def cmd_venv_activate = ". .venv/bin/activate" + def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU && export TT_BASE_OS=redhat && export TT_ENABLE_UAT_TESTS=True && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}" + def cmd_pytest = "pytest tests/non_functional/documentation -k '${doc_changed_files_str}' -n 0 --dist loadgroup" + def cmd = "" + if ( image_build_needed == "true" ) { + unstash 'ovms-release-image' + sh "gunzip -c ovms_release_image.tar.gz | docker load" + sh "rm -f ovms_release_image.tar.gz" + unstash 'ovms-release-image-gpu' + sh "gunzip -c ovms_release_image_gpu.tar.gz | docker load" + sh "rm -f ovms_release_image_gpu.tar.gz" + + cmd = "${cmd_venv_activate} && ${cmd_export} && export TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} && export TT_OVMS_IMAGE_LOCAL=True && ${cmd_pytest}" + } else { + cmd = "${cmd_venv_activate} && ${cmd_export} && ${cmd_pytest}" + } + try { + sh cmd + } finally { + // Always save artifacts + zip zipFile: 'documentation_tests_linux_logs.zip', glob: 'test_log/**,test_log_build/**', allowEmpty: true + archiveArtifacts(artifacts: 'documentation_tests_linux_logs.zip', allowEmptyArchive: true) + } + } } } } @@ -268,28 +313,38 @@ pipeline { } } stage("Documentation tests windows") { - agent { - label "${agent_name_windows_doc}" + agent none + when { + expression { doc_changed_files && !disable_doc_tests_windows } + beforeAgent true } - when { expression { doc_changed_files } } steps { - script { - dir ('documentation_tests') { - checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) - def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() - def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() - def cmd_link_ovms = "mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" - def cmd_requirements = "virtualenv .venv --python=python3.12 && .venv\\Scripts\\activate.bat && pip install -r requirements.txt" - def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_ENABLE_UAT_TESTS=True\"" - def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" - def cmd = "" - if ( win_image_build_needed == "true" ) { - unstash 'ovms-windows-package' - cmd = "${cmd_link_ovms} && ${cmd_requirements} && set TT_OVMS_C_RELEASE_ARTIFACTS_PATH=\"dist\\windows\\ovms.zip\" && ${cmd_export} && ${cmd_pytest}" - } else { - cmd = "${cmd_link_ovms} && ${cmd_requirements} && ${cmd_export} && ${cmd_pytest}" + node(agent_name_windows_doc) { + checkout scm + script { + dir ('documentation_tests') { + checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() + def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() + def cmd_link_ovms = "if exist ${current_path}\\tests\\functional rmdir ${current_path}\\tests\\functional && mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" + def cmd_requirements = "virtualenv .venv --python=python3.12 && .venv\\Scripts\\activate.bat && pip install -r requirements.txt" + def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\"" + def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" + def cmd = "" + if ( win_image_build_needed == "true" ) { + unstash 'ovms-windows-package' + cmd = "${cmd_link_ovms} && ${cmd_requirements} && set TT_OVMS_C_RELEASE_ARTIFACTS_PATH=\"dist\\windows\\ovms.zip\" && ${cmd_export} && ${cmd_pytest}" + } else { + cmd = "${cmd_link_ovms} && ${cmd_requirements} && ${cmd_export} && ${cmd_pytest}" + } + try { + bat cmd + } finally { + // Always save artifacts + zip zipFile: 'documentation_tests_windows_logs.zip', glob: 'test_log/**,test_log_build/**', allowEmpty: true + archiveArtifacts(artifacts: 'documentation_tests_windows_logs.zip', allowEmptyArchive: true) + } } - bat cmd } } } From cfeb8ab9a7a416499b20fc4d4acfcbadaa0a8f49 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Mon, 8 Jun 2026 12:13:59 +0200 Subject: [PATCH 09/14] [doc_changed_files_linux=demos/continuous_batching/README.md][doc_changed_files_windows=demos/continuous_batching/README.md][agent_name_linux_doc=ovms_lnl] updates --- ci/build_test_OnCommit.groovy | 79 +++++++++++++++++++---------------- ci/check_md_code_changes.sh | 20 ++++++--- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index e2b0649dca..af01372517 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -2,13 +2,13 @@ def image_build_needed = "false" def win_image_build_needed = "false" def client_test_needed = "false" def export_models_changed = "false" -def doc_changed_files = "" -def doc_changed_files_str = "" +def doc_changed_files_linux = "" +def doc_changed_files_windows = "" def shortCommit = "" def agent_name_windows = "" def agent_name_windows_doc = "ovms_win_ptl" def agent_name_linux = "" -def agent_name_linux_doc = "ovms_spr" +def agent_name_linux_doc = "ovms_ptl" def disable_doc_tests_linux = false def disable_doc_tests_windows = false @@ -76,15 +76,19 @@ pipeline { agent_name_windows_doc = agentWindowsDocMatch[0][1] println "Commit override: agent_name_windows_doc = ${agent_name_windows_doc}" } - def docChangedFilesMatch = (commitMsg =~ /\[doc_changed_files=([^\]]+)\]/) - if (docChangedFilesMatch) { - doc_changed_files = docChangedFilesMatch[0][1].replaceAll(' ', '\n') - println "Commit override: doc_changed_files = ${doc_changed_files}" + def docChangedFilesLinuxMatch = (commitMsg =~ /\[doc_changed_files_linux=([^\]]+)\]/) + if (docChangedFilesLinuxMatch) { + doc_changed_files_linux = docChangedFilesLinuxMatch[0][1].replaceAll(' ', '\n') + println "Commit override: doc_changed_files_linux = ${doc_changed_files_linux}" } else { - doc_changed_files = sh (script: "./ci/check_md_code_changes.sh ${diffBase}", returnStdout: true).trim() + doc_changed_files_linux = sh (script: "./ci/check_md_code_changes.sh linux ${diffBase}", returnStdout: true).trim() } - if (doc_changed_files) { - doc_changed_files_str = doc_changed_files.split('\n').join(' or ') + def docChangedFilesWindowsMatch = (commitMsg =~ /\[doc_changed_files_windows=([^\]]+)\]/) + if (docChangedFilesWindowsMatch) { + doc_changed_files_windows = docChangedFilesWindowsMatch[0][1].replaceAll(' ', '\n') + println "Commit override: doc_changed_files_windows = ${doc_changed_files_windows}" + } else { + doc_changed_files_windows = sh (script: "./ci/check_md_code_changes.sh windows ${diffBase}", returnStdout: true).trim() } } } @@ -151,12 +155,12 @@ pipeline { sh "echo build --remote_cache=${env.OVMS_BAZEL_REMOTE_CACHE_URL} > .user.bazelrc" sh "echo test:linux --test_env https_proxy=${env.HTTPS_PROXY} >> .user.bazelrc" sh "echo test:linux --test_env http_proxy=${env.HTTP_PROXY} >> .user.bazelrc" - sh "make ovms_builder_image RUN_TESTS=${runTestsFlag} OPTIMIZE_BUILDING_TESTS=1 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + sh "make ovms_builder_image RUN_TESTS=${runTestsFlag} OPTIMIZE_BUILDING_TESTS=1 OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" // release_image - sh "make release_image RUN_TESTS=0 OV_USE_BINARY=0 BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" - sh "make run_lib_files_test BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" - if ( doc_changed_files ) { + sh "make release_image RUN_TESTS=0 GPU=1 NPU=1 OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" + // sh "make run_lib_files_test OVMS_CPP_IMAGE_TAG=${shortCommit}" + if ( doc_changed_files_linux ) { sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' sh "rm -f ovms_release_image.tar.gz" @@ -191,7 +195,9 @@ pipeline { windows.install_dependencies() windows.clean() windows.build() - stash name: 'ovms-windows-package', includes: 'dist\\windows\\ovms.zip' + if ( doc_changed_files_windows ) { + stash name: 'ovms-windows-package', includes: 'dist\\windows\\ovms.zip' + } } finally { windows.archive_build_artifacts() } @@ -217,7 +223,7 @@ pipeline { script { println "Running unit tests: NODE_NAME = ${env.NODE_NAME}" try { - sh "make run_unit_tests TEST_LLM_PATH=${HOME}/ovms_models/llm_models_ovms/OVMS_C BASE_OS=redhat OVMS_CPP_IMAGE_TAG=${shortCommit}" + sh "make run_unit_tests TEST_LLM_PATH=${HOME}/ovms_models/llm_models_ovms/OVMS_C OVMS_CPP_IMAGE_TAG=${shortCommit}" } finally { archiveArtifacts allowEmptyArchive: true, artifacts: "test_logs.tar.gz" @@ -236,8 +242,8 @@ pipeline { dir ('internal_tests'){ checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" - pwd = sh(returnStdout:true, script: "pwd").strip() - sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional && TT_ON_COMMIT_TESTS=True TT_XDIST_WORKERS=10 TT_BASE_OS=redhat TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" + def pwd = sh(returnStdout:true, script: "pwd").strip() + sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional && TT_ON_COMMIT_TESTS=True TT_XDIST_WORKERS=10 TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" } } } @@ -245,7 +251,7 @@ pipeline { stage("Documentation tests") { agent none when { - expression { doc_changed_files && !disable_doc_tests_linux } + expression { doc_changed_files_linux && !disable_doc_tests_linux } beforeAgent true } steps { @@ -255,11 +261,12 @@ pipeline { dir ('documentation_tests') { checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" - pwd = sh(returnStdout:true, script: "pwd").strip() - ovms_c_repo_path = sh(returnStdout:true, script: "cd .. && pwd").strip() + def pwd = sh(returnStdout:true, script: "pwd").strip() + def ovms_c_repo_path = sh(returnStdout:true, script: "cd .. && pwd").strip() + def doc_changed_files_str = doc_changed_files_linux.split('\n').join(' or ') sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" def cmd_venv_activate = ". .venv/bin/activate" - def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU && export TT_BASE_OS=redhat && export TT_ENABLE_UAT_TESTS=True && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}" + def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU,GPU,NPU && export TT_ENABLE_UAT_TESTS=True && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path} && export TT_WAIT_FOR_MESSAGES_TIMEOUT=1500" def cmd_pytest = "pytest tests/non_functional/documentation -k '${doc_changed_files_str}' -n 0 --dist loadgroup" def cmd = "" if ( image_build_needed == "true" ) { @@ -267,11 +274,7 @@ pipeline { sh "gunzip -c ovms_release_image.tar.gz | docker load" sh "rm -f ovms_release_image.tar.gz" - unstash 'ovms-release-image-gpu' - sh "gunzip -c ovms_release_image_gpu.tar.gz | docker load" - sh "rm -f ovms_release_image_gpu.tar.gz" - - cmd = "${cmd_venv_activate} && ${cmd_export} && export TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} && export TT_OVMS_IMAGE_LOCAL=True && ${cmd_pytest}" + cmd = "${cmd_venv_activate} && ${cmd_export} && export TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} && export TT_OVMS_IMAGE_LOCAL=True && export TT_FORCE_USE_OVMS_IMAGE=True && ${cmd_pytest}" } else { cmd = "${cmd_venv_activate} && ${cmd_export} && ${cmd_pytest}" } @@ -279,7 +282,7 @@ pipeline { sh cmd } finally { // Always save artifacts - zip zipFile: 'documentation_tests_linux_logs.zip', glob: 'test_log/**,test_log_build/**', allowEmpty: true + zip zipFile: 'documentation_tests_linux_logs.zip', glob: 'test_log/**,test_log_build/**', overwrite: true archiveArtifacts(artifacts: 'documentation_tests_linux_logs.zip', allowEmptyArchive: true) } } @@ -315,7 +318,7 @@ pipeline { stage("Documentation tests windows") { agent none when { - expression { doc_changed_files && !disable_doc_tests_windows } + expression { doc_changed_files_windows && !disable_doc_tests_windows } beforeAgent true } steps { @@ -324,24 +327,28 @@ pipeline { script { dir ('documentation_tests') { checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + def doc_changed_files_str = doc_changed_files_windows.split('\n').join(' or ') def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() - def cmd_link_ovms = "if exist ${current_path}\\tests\\functional rmdir ${current_path}\\tests\\functional && mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" - def cmd_requirements = "virtualenv .venv --python=python3.12 && .venv\\Scripts\\activate.bat && pip install -r requirements.txt" - def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\"" - def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 3 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" + def cmd_link_ovms = "(if exist ${current_path}\\tests\\functional rmdir ${current_path}\\tests\\functional) && mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" + def cmd_requirements = "(if not exist .venv virtualenv .venv --python=python3.12) && call .venv\\Scripts\\activate.bat && pip install -r requirements.txt" + def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\" && set \"TT_WAIT_FOR_MESSAGES_TIMEOUT=1500\"" + def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 0 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" def cmd = "" if ( win_image_build_needed == "true" ) { unstash 'ovms-windows-package' - cmd = "${cmd_link_ovms} && ${cmd_requirements} && set TT_OVMS_C_RELEASE_ARTIFACTS_PATH=\"dist\\windows\\ovms.zip\" && ${cmd_export} && ${cmd_pytest}" + cmd = "${cmd_link_ovms} && ${cmd_requirements} && ${cmd_export} && set \"TT_OVMS_C_RELEASE_ARTIFACTS_PATH=dist\\windows\\ovms.zip\" && ${cmd_pytest}" } else { cmd = "${cmd_link_ovms} && ${cmd_requirements} && ${cmd_export} && ${cmd_pytest}" } try { - bat cmd + def exitCode = bat(returnStatus: true, script: cmd) + if (exitCode != 0) { + error "Documentation tests windows command failed with exit code ${exitCode}" + } } finally { // Always save artifacts - zip zipFile: 'documentation_tests_windows_logs.zip', glob: 'test_log/**,test_log_build/**', allowEmpty: true + zip zipFile: 'documentation_tests_windows_logs.zip', glob: 'test_log/**,test_log_build/**', overwrite: true archiveArtifacts(artifacts: 'documentation_tests_windows_logs.zip', allowEmptyArchive: true) } } diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh index 1ff68e708e..af2a4a9fcd 100755 --- a/ci/check_md_code_changes.sh +++ b/ci/check_md_code_changes.sh @@ -16,13 +16,21 @@ # # Checks git diff for .md files and reports those where changes -# fall inside ```bash, ```bat, or ```console fenced code blocks. -# Usage: ./check_md_code_changes.sh [base_ref] +# fall inside fenced code blocks. +# Usage: ./check_md_code_changes.sh [base_ref] +# platform: "linux" (checks bash+console) or "windows" (checks bat+console) # base_ref: optional git ref to diff against (default: HEAD~1) set -euo pipefail -BASE_REF="${1:-HEAD~1}" +PLATFORM="${1:-linux}" +BASE_REF="${2:-HEAD~1}" + +case "$PLATFORM" in + linux) BLOCK_PATTERN='^```(bash|console)' ;; + windows) BLOCK_PATTERN='^```(bat|console)' ;; + *) echo "Error: platform must be 'linux' or 'windows'" >&2; exit 1 ;; +esac # Get list of changed .md files changed_md_files=$(git diff --name-only "$BASE_REF" HEAD -- '*.md') @@ -51,13 +59,13 @@ while IFS= read -r file; do # Use awk to find which lines are inside ```bash/bat/console blocks, # then check if any of those overlap with changed lines - hit=$(awk -v lines="$changed_lines" ' + hit=$(awk -v lines="$changed_lines" -v pattern="$BLOCK_PATTERN" ' BEGIN { n = split(lines, arr, "\n") for (i = 1; i <= n; i++) changed[arr[i]] = 1 } - /^```(bash|bat|console)/ { in_block = 1; next } - /^```/ { in_block = 0; next } + $0 ~ pattern { in_block = 1; next } + /^```/ { in_block = 0; next } in_block && (NR in changed) { print FILENAME; exit } ' "$file") From 036d60fed68296df76eb745abc40309471e73f32 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Mon, 8 Jun 2026 15:55:22 +0200 Subject: [PATCH 10/14] [agent_name_linux_doc=ovms_lnl] updates --- ci/build_test_OnCommit.groovy | 36 ++++++++++++++++++----------- demos/continuous_batching/README.md | 1 + docs/llm/quickstart.md | 1 + 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index af01372517..fd8d7a459d 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -66,26 +66,34 @@ pipeline { disable_doc_tests_windows = true println "Commit override: disable_doc_tests_windows = true" } - def agentLinuxDocMatch = (commitMsg =~ /\[agent_name_linux_doc=([^\]]+)\]/) - if (agentLinuxDocMatch) { - agent_name_linux_doc = agentLinuxDocMatch[0][1] + def agentLinuxDocMatcher = (commitMsg =~ /\[agent_name_linux_doc=([^\]]+)\]/) + def agentLinuxDocValue = agentLinuxDocMatcher ? agentLinuxDocMatcher[0][1] : null + agentLinuxDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint + if (agentLinuxDocValue) { + agent_name_linux_doc = agentLinuxDocValue println "Commit override: agent_name_linux_doc = ${agent_name_linux_doc}" } - def agentWindowsDocMatch = (commitMsg =~ /\[agent_name_windows_doc=([^\]]+)\]/) - if (agentWindowsDocMatch) { - agent_name_windows_doc = agentWindowsDocMatch[0][1] + def agentWindowsDocMatcher = (commitMsg =~ /\[agent_name_windows_doc=([^\]]+)\]/) + def agentWindowsDocValue = agentWindowsDocMatcher ? agentWindowsDocMatcher[0][1] : null + agentWindowsDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint + if (agentWindowsDocValue) { + agent_name_windows_doc = agentWindowsDocValue println "Commit override: agent_name_windows_doc = ${agent_name_windows_doc}" } - def docChangedFilesLinuxMatch = (commitMsg =~ /\[doc_changed_files_linux=([^\]]+)\]/) - if (docChangedFilesLinuxMatch) { - doc_changed_files_linux = docChangedFilesLinuxMatch[0][1].replaceAll(' ', '\n') + def docChangedFilesLinuxMatcher = (commitMsg =~ /\[doc_changed_files_linux=([^\]]+)\]/) + def docChangedFilesLinuxValue = docChangedFilesLinuxMatcher ? docChangedFilesLinuxMatcher[0][1] : null + docChangedFilesLinuxMatcher = null // Matcher is not serializable; null it before CPS checkpoint + if (docChangedFilesLinuxValue) { + doc_changed_files_linux = docChangedFilesLinuxValue.replaceAll(' ', '\n') println "Commit override: doc_changed_files_linux = ${doc_changed_files_linux}" } else { doc_changed_files_linux = sh (script: "./ci/check_md_code_changes.sh linux ${diffBase}", returnStdout: true).trim() } - def docChangedFilesWindowsMatch = (commitMsg =~ /\[doc_changed_files_windows=([^\]]+)\]/) - if (docChangedFilesWindowsMatch) { - doc_changed_files_windows = docChangedFilesWindowsMatch[0][1].replaceAll(' ', '\n') + def docChangedFilesWindowsMatcher = (commitMsg =~ /\[doc_changed_files_windows=([^\]]+)\]/) + def docChangedFilesWindowsValue = docChangedFilesWindowsMatcher ? docChangedFilesWindowsMatcher[0][1] : null + docChangedFilesWindowsMatcher = null // Matcher is not serializable; null it before CPS checkpoint + if (docChangedFilesWindowsValue) { + doc_changed_files_windows = docChangedFilesWindowsValue.replaceAll(' ', '\n') println "Commit override: doc_changed_files_windows = ${doc_changed_files_windows}" } else { doc_changed_files_windows = sh (script: "./ci/check_md_code_changes.sh windows ${diffBase}", returnStdout: true).trim() @@ -266,7 +274,7 @@ pipeline { def doc_changed_files_str = doc_changed_files_linux.split('\n').join(' or ') sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" def cmd_venv_activate = ". .venv/bin/activate" - def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU,GPU,NPU && export TT_ENABLE_UAT_TESTS=True && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path} && export TT_WAIT_FOR_MESSAGES_TIMEOUT=1500" + def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU,GPU,NPU && export TT_ENABLE_UAT_TESTS=True && export TT_ENABLE_SMOKE_TESTS=False && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path} && export TT_WAIT_FOR_MESSAGES_TIMEOUT=1500" def cmd_pytest = "pytest tests/non_functional/documentation -k '${doc_changed_files_str}' -n 0 --dist loadgroup" def cmd = "" if ( image_build_needed == "true" ) { @@ -332,7 +340,7 @@ pipeline { def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() def cmd_link_ovms = "(if exist ${current_path}\\tests\\functional rmdir ${current_path}\\tests\\functional) && mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" def cmd_requirements = "(if not exist .venv virtualenv .venv --python=python3.12) && call .venv\\Scripts\\activate.bat && pip install -r requirements.txt" - def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\" && set \"TT_WAIT_FOR_MESSAGES_TIMEOUT=1500\"" + def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_DISABLE_DMESG_LOG_MONITOR=True\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\" && set \"TT_WAIT_FOR_MESSAGES_TIMEOUT=1500\" && set \"PYTHONUTF8=1\" && set \"PYTHONIOENCODING=utf-8\"" def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 0 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" def cmd = "" if ( win_image_build_needed == "true" ) { diff --git a/demos/continuous_batching/README.md b/demos/continuous_batching/README.md index dfc6fef039..3dd938a3f3 100644 --- a/demos/continuous_batching/README.md +++ b/demos/continuous_batching/README.md @@ -174,6 +174,7 @@ Windows Powershell Windows Command Prompt ```bat +echo "TEST" curl -s http://localhost:8000/v3/responses -H "Content-Type: application/json" -d "{\"model\": \"Qwen3-30B-A3B-Instruct-2507-int4-ov\", \"max_output_tokens\": 30, \"input\": \"What is OpenVINO?\"}" ``` ::: diff --git a/docs/llm/quickstart.md b/docs/llm/quickstart.md index 9af528b60a..5b76ddfc9b 100644 --- a/docs/llm/quickstart.md +++ b/docs/llm/quickstart.md @@ -167,6 +167,7 @@ The `tokenize` endpoint provides a simple API for tokenizing input text using th Example usage: ```console +echo "TEST" curl http://localhost:8000/v3/tokenize -H "Content-Type: application/json" -d "{ \"model\": \"Qwen/Qwen3-8B\", \"text\": \"hello world\"}" ``` Response: From 83a1143a58496de7b2c31a2e5e2a9582689b4f8d Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Mon, 8 Jun 2026 16:19:48 +0200 Subject: [PATCH 11/14] [agent_name_linux_doc=ovms_lnl] enable run_lib_files_test --- ci/build_test_OnCommit.groovy | 2 +- tests/file_lists/lib_files.txt | 79 ++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index fd8d7a459d..a62c9d2795 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -167,7 +167,7 @@ pipeline { // release_image sh "make release_image RUN_TESTS=0 GPU=1 NPU=1 OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" - // sh "make run_lib_files_test OVMS_CPP_IMAGE_TAG=${shortCommit}" + sh "make run_lib_files_test OVMS_CPP_IMAGE_TAG=${shortCommit}" if ( doc_changed_files_linux ) { sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' diff --git a/tests/file_lists/lib_files.txt b/tests/file_lists/lib_files.txt index c7740691ff..8c3468c5bc 100644 --- a/tests/file_lists/lib_files.txt +++ b/tests/file_lists/lib_files.txt @@ -1,43 +1,47 @@ custom_nodes +libOpenCL.so->libOpenCL.so.1.0.0 +libOpenCL.so.1->libOpenCL.so.1.0.0 +libOpenCL.so.1.0.0 libazurestorage.so libazurestorage.so.7->libazurestorage.so libazurestorage.so.7.5->libazurestorage.so libcpprest.so libcpprest.so.2.10->libcpprest.so -libopencv_calib3d.so->libopencv_calib3d.so.410 -libopencv_calib3d.so.4.10.0 -libopencv_calib3d.so.410->libopencv_calib3d.so.4.10.0 -libopencv_core.so->libopencv_core.so.410 -libopencv_core.so.4.10.0 -libopencv_core.so.410->libopencv_core.so.4.10.0 -libopencv_features2d.so->libopencv_features2d.so.410 -libopencv_features2d.so.4.10.0 -libopencv_features2d.so.410->libopencv_features2d.so.4.10.0 -libopencv_flann.so->libopencv_flann.so.410 -libopencv_flann.so.4.10.0 -libopencv_flann.so.410->libopencv_flann.so.4.10.0 -libopencv_highgui.so->libopencv_highgui.so.410 -libopencv_highgui.so.4.10.0 -libopencv_highgui.so.410->libopencv_highgui.so.4.10.0 -libopencv_imgcodecs.so->libopencv_imgcodecs.so.410 -libopencv_imgcodecs.so.4.10.0 -libopencv_imgcodecs.so.410->libopencv_imgcodecs.so.4.10.0 -libopencv_imgproc.so->libopencv_imgproc.so.410 -libopencv_imgproc.so.4.10.0 -libopencv_imgproc.so.410->libopencv_imgproc.so.4.10.0 -libopencv_optflow.so->libopencv_optflow.so.410 -libopencv_optflow.so.4.10.0 -libopencv_optflow.so.410->libopencv_optflow.so.4.10.0 -libopencv_video.so->libopencv_video.so.410 -libopencv_video.so.4.10.0 -libopencv_video.so.410->libopencv_video.so.4.10.0 -libopencv_videoio.so->libopencv_videoio.so.410 -libopencv_videoio.so.4.10.0 -libopencv_videoio.so.410->libopencv_videoio.so.4.10.0 -libopencv_ximgproc.so->libopencv_ximgproc.so.410 -libopencv_ximgproc.so.4.10.0 -libopencv_ximgproc.so.410->libopencv_ximgproc.so.4.10.0 +libgit2.so +libopencv_calib3d.so->libopencv_calib3d.so.413 +libopencv_calib3d.so.4.13.0 +libopencv_calib3d.so.413->libopencv_calib3d.so.4.13.0 +libopencv_core.so->libopencv_core.so.413 +libopencv_core.so.4.13.0 +libopencv_core.so.413->libopencv_core.so.4.13.0 +libopencv_features2d.so->libopencv_features2d.so.413 +libopencv_features2d.so.4.13.0 +libopencv_features2d.so.413->libopencv_features2d.so.4.13.0 +libopencv_flann.so->libopencv_flann.so.413 +libopencv_flann.so.4.13.0 +libopencv_flann.so.413->libopencv_flann.so.4.13.0 +libopencv_highgui.so->libopencv_highgui.so.413 +libopencv_highgui.so.4.13.0 +libopencv_highgui.so.413->libopencv_highgui.so.4.13.0 +libopencv_imgcodecs.so->libopencv_imgcodecs.so.413 +libopencv_imgcodecs.so.4.13.0 +libopencv_imgcodecs.so.413->libopencv_imgcodecs.so.4.13.0 +libopencv_imgproc.so->libopencv_imgproc.so.413 +libopencv_imgproc.so.4.13.0 +libopencv_imgproc.so.413->libopencv_imgproc.so.4.13.0 +libopencv_optflow.so->libopencv_optflow.so.413 +libopencv_optflow.so.4.13.0 +libopencv_optflow.so.413->libopencv_optflow.so.4.13.0 +libopencv_video.so->libopencv_video.so.413 +libopencv_video.so.4.13.0 +libopencv_video.so.413->libopencv_video.so.4.13.0 +libopencv_videoio.so->libopencv_videoio.so.413 +libopencv_videoio.so.4.13.0 +libopencv_videoio.so.413->libopencv_videoio.so.4.13.0 +libopencv_ximgproc.so->libopencv_ximgproc.so.413 +libopencv_ximgproc.so.4.13.0 +libopencv_ximgproc.so.413->libopencv_ximgproc.so.4.13.0 libopenvino.so->libopenvino.so.2630 libopenvino.so.2026.3.0 libopenvino.so.2630->libopenvino.so.2026.3.0 @@ -46,15 +50,17 @@ libopenvino_auto_plugin.so libopenvino_c.so->libopenvino_c.so.2630 libopenvino_c.so.2026.3.0 libopenvino_c.so.2630->libopenvino_c.so.2026.3.0 +libopenvino_genai.so->libopenvino_genai.so.2630 +libopenvino_genai.so.2026.3.0.0 +libopenvino_genai.so.2630->libopenvino_genai.so.2026.3.0.0 libopenvino_hetero_plugin.so libopenvino_intel_cpu_plugin.so libopenvino_intel_gpu_plugin.so +libopenvino_intel_npu_compiler.so +libopenvino_intel_npu_compiler_loader.so libopenvino_intel_npu_plugin.so libopenvino_ir_frontend.so.2026.3.0 libopenvino_ir_frontend.so.2630->libopenvino_ir_frontend.so.2026.3.0 -libopenvino_jax_frontend.so->libopenvino_jax_frontend.so.2630 -libopenvino_jax_frontend.so.2026.3.0 -libopenvino_jax_frontend.so.2630->libopenvino_jax_frontend.so.2026.3.0 libopenvino_onnx_frontend.so->libopenvino_onnx_frontend.so.2630 libopenvino_onnx_frontend.so.2026.3.0 libopenvino_onnx_frontend.so.2630->libopenvino_onnx_frontend.so.2026.3.0 @@ -74,3 +80,4 @@ libopenvino_tokenizers.so libtbb.so->libtbb.so.12 libtbb.so.12->libtbb.so.12.13 libtbb.so.12.13 +python From b2e81ac526da89ab79d63ded4ad57e605f333953 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Tue, 9 Jun 2026 09:59:02 +0200 Subject: [PATCH 12/14] [doc_changed_files_linux=demos/continuous_batching/README.md][doc_changed_files_windows=demos/continuous_batching/README.md][agent_name_linux_doc=ovms_lnl] cleanup --- ci/build_test_OnCommit.groovy | 32 +++++++++++++++---- ci/check_md_code_changes.sh | 14 ++++++-- demos/continuous_batching/README.md | 1 - demos/embeddings/README.md | 3 -- .../python/README.md | 2 +- demos/universal-sentence-encoder/README.md | 1 - .../python/README.md | 1 - docs/llm/quickstart.md | 1 - 8 files changed, 39 insertions(+), 16 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index a62c9d2795..5072e8fa61 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -12,6 +12,20 @@ def agent_name_linux_doc = "ovms_ptl" def disable_doc_tests_linux = false def disable_doc_tests_windows = false +// Documentation test commit message overrides: +// +// Disable tests: +// [disable_doc_tests_linux] - Skip the Linux documentation tests stage +// [disable_doc_tests_windows] - Skip the Windows documentation tests stage +// +// Override agent node: +// [agent_name_linux_doc=] - Run Linux doc tests on (default: ovms_ptl) +// [agent_name_windows_doc=] - Run Windows doc tests on (default: ovms_win_ptl) +// +// Override file list (space-separated, converted to pytest -k filter joined with ' or '): +// [doc_changed_files_linux=] - Use instead of auto-detected list (Linux) +// [doc_changed_files_windows=] - Use instead of auto-detected list (Windows) + pipeline { agent { label 'ovmsbuilder' @@ -88,6 +102,11 @@ pipeline { println "Commit override: doc_changed_files_linux = ${doc_changed_files_linux}" } else { doc_changed_files_linux = sh (script: "./ci/check_md_code_changes.sh linux ${diffBase}", returnStdout: true).trim() + if (doc_changed_files_linux) { + println "doc_changed_files_linux = ${doc_changed_files_linux}" + } else { + println "No documentation files changed for linux" + } } def docChangedFilesWindowsMatcher = (commitMsg =~ /\[doc_changed_files_windows=([^\]]+)\]/) def docChangedFilesWindowsValue = docChangedFilesWindowsMatcher ? docChangedFilesWindowsMatcher[0][1] : null @@ -97,6 +116,11 @@ pipeline { println "Commit override: doc_changed_files_windows = ${doc_changed_files_windows}" } else { doc_changed_files_windows = sh (script: "./ci/check_md_code_changes.sh windows ${diffBase}", returnStdout: true).trim() + if (doc_changed_files_windows) { + println "doc_changed_files_windows = ${doc_changed_files_windows}" + } else { + println "No documentation files changed for windows" + } } } } @@ -172,10 +196,6 @@ pipeline { sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' sh "rm -f ovms_release_image.tar.gz" - - sh "docker save openvino/model_server-gpu:${shortCommit} | gzip > ovms_release_image_gpu.tar.gz" - stash name: 'ovms-release-image-gpu', includes: 'ovms_release_image_gpu.tar.gz' - sh "rm -f ovms_release_image_gpu.tar.gz" } } } @@ -248,7 +268,7 @@ pipeline { steps { script { dir ('internal_tests'){ - checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) sh "pwd" def pwd = sh(returnStdout:true, script: "pwd").strip() sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional && TT_ON_COMMIT_TESTS=True TT_XDIST_WORKERS=10 TT_OVMS_IMAGE_NAME=openvino/model_server:${shortCommit} TT_OVMS_IMAGE_LOCAL=True make tests" @@ -334,7 +354,7 @@ pipeline { checkout scm script { dir ('documentation_tests') { - checkout scmGit(branches: [[name: '20260605_test_fixes']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) + checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) def doc_changed_files_str = doc_changed_files_windows.split('\n').join(' or ') def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() diff --git a/ci/check_md_code_changes.sh b/ci/check_md_code_changes.sh index af2a4a9fcd..e1d45a4828 100755 --- a/ci/check_md_code_changes.sh +++ b/ci/check_md_code_changes.sh @@ -27,8 +27,8 @@ PLATFORM="${1:-linux}" BASE_REF="${2:-HEAD~1}" case "$PLATFORM" in - linux) BLOCK_PATTERN='^```(bash|console)' ;; - windows) BLOCK_PATTERN='^```(bat|console)' ;; + linux) BLOCK_PATTERN='^```(bash|console)' ; FENCE_LANGS='bash|console' ;; + windows) BLOCK_PATTERN='^```(bat|console)' ; FENCE_LANGS='bat|console' ;; *) echo "Error: platform must be 'linux' or 'windows'" >&2; exit 1 ;; esac @@ -57,6 +57,16 @@ while IFS= read -r file; do continue fi + # Check if a code block fence was added, removed, or changed type in the diff + # (e.g. ```->```bash, ```console->```, or entirely new/deleted fence) + fence_changed=$(git diff --unified=0 "$BASE_REF" HEAD -- "$file" \ + | grep -qE "^[+-]\`\`\`($FENCE_LANGS)" && echo 1 || true) + + if [ -n "$fence_changed" ]; then + matched_files+=("$file") + continue + fi + # Use awk to find which lines are inside ```bash/bat/console blocks, # then check if any of those overlap with changed lines hit=$(awk -v lines="$changed_lines" -v pattern="$BLOCK_PATTERN" ' diff --git a/demos/continuous_batching/README.md b/demos/continuous_batching/README.md index 3dd938a3f3..dfc6fef039 100644 --- a/demos/continuous_batching/README.md +++ b/demos/continuous_batching/README.md @@ -174,7 +174,6 @@ Windows Powershell Windows Command Prompt ```bat -echo "TEST" curl -s http://localhost:8000/v3/responses -H "Content-Type: application/json" -d "{\"model\": \"Qwen3-30B-A3B-Instruct-2507-int4-ov\", \"max_output_tokens\": 30, \"input\": \"What is OpenVINO?\"}" ``` ::: diff --git a/demos/embeddings/README.md b/demos/embeddings/README.md index 2cade8995d..a6e2c6d179 100644 --- a/demos/embeddings/README.md +++ b/demos/embeddings/README.md @@ -16,9 +16,6 @@ Text generation use case is exposed via OpenAI API `embeddings` endpoint. This procedure can be used to pull preconfigured models from OpenVINO organization in HuggingFace Hub -test -test - **CPU** ::::{tab-set} :::{tab-item} OpenVINO/Qwen3-Embedding-0.6B-int8-ov diff --git a/demos/person_vehicle_bike_detection/python/README.md b/demos/person_vehicle_bike_detection/python/README.md index 3da029ae20..f22ed4a0ac 100644 --- a/demos/person_vehicle_bike_detection/python/README.md +++ b/demos/person_vehicle_bike_detection/python/README.md @@ -3,7 +3,7 @@ The purpose of this demo is to show how to send data from multiple sources (cameras, video files) to a model served in OpenVINO Model Server. ## Prerequisites -teststest + **Model preparation**: Python 3.9 or higher with pip **Model Server deployment**: Installed Docker Engine or OVMS binary package according to the [baremetal deployment guide](../../../docs/deploying_server_baremetal.md) diff --git a/demos/universal-sentence-encoder/README.md b/demos/universal-sentence-encoder/README.md index 5374f78437..ad36dcbcb0 100644 --- a/demos/universal-sentence-encoder/README.md +++ b/demos/universal-sentence-encoder/README.md @@ -14,7 +14,6 @@ rm universal-sentence-encoder-multilingual/1/3.tar.gz Make sure the downloaded model has right permissions ```bash chmod -R 755 universal-sentence-encoder-multilingual -echo "TEST" ``` The model setup should look like this diff --git a/demos/vehicle_analysis_pipeline/python/README.md b/demos/vehicle_analysis_pipeline/python/README.md index 7cad1e88e1..eb19a9b04d 100644 --- a/demos/vehicle_analysis_pipeline/python/README.md +++ b/demos/vehicle_analysis_pipeline/python/README.md @@ -31,7 +31,6 @@ Clone the repository and enter vehicle_analysis_pipeline directory ```bash git clone https://github.com/openvinotoolkit/model_server.git cd model_server/demos/vehicle_analysis_pipeline/python -echo "TEST" ``` You can prepare the workspace that contains all the above by just running `make` command. diff --git a/docs/llm/quickstart.md b/docs/llm/quickstart.md index 5b76ddfc9b..9af528b60a 100644 --- a/docs/llm/quickstart.md +++ b/docs/llm/quickstart.md @@ -167,7 +167,6 @@ The `tokenize` endpoint provides a simple API for tokenizing input text using th Example usage: ```console -echo "TEST" curl http://localhost:8000/v3/tokenize -H "Content-Type: application/json" -d "{ \"model\": \"Qwen/Qwen3-8B\", \"text\": \"hello world\"}" ``` Response: From 4c2c172d4414a9f1d3c5d006c1cda1adf30f4106 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Tue, 9 Jun 2026 10:01:36 +0200 Subject: [PATCH 13/14] [doc_changed_files_linux=demos/continuous_batching/README.md][doc_changed_files_windows=demos/continuous_batching/README.md][agent_name_linux_doc=ovms_lnl] add input validation --- ci/build_test_OnCommit.groovy | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index 5072e8fa61..42ef14740c 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -84,6 +84,9 @@ pipeline { def agentLinuxDocValue = agentLinuxDocMatcher ? agentLinuxDocMatcher[0][1] : null agentLinuxDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (agentLinuxDocValue) { + if (!(agentLinuxDocValue ==~ /[a-zA-Z0-9_-]+/)) { + error "Invalid agent_name_linux_doc override: '${agentLinuxDocValue}'. Only alphanumeric, hyphens and underscores allowed." + } agent_name_linux_doc = agentLinuxDocValue println "Commit override: agent_name_linux_doc = ${agent_name_linux_doc}" } @@ -91,6 +94,9 @@ pipeline { def agentWindowsDocValue = agentWindowsDocMatcher ? agentWindowsDocMatcher[0][1] : null agentWindowsDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (agentWindowsDocValue) { + if (!(agentWindowsDocValue ==~ /[a-zA-Z0-9_-]+/)) { + error "Invalid agent_name_windows_doc override: '${agentWindowsDocValue}'. Only alphanumeric, hyphens and underscores allowed." + } agent_name_windows_doc = agentWindowsDocValue println "Commit override: agent_name_windows_doc = ${agent_name_windows_doc}" } @@ -98,6 +104,12 @@ pipeline { def docChangedFilesLinuxValue = docChangedFilesLinuxMatcher ? docChangedFilesLinuxMatcher[0][1] : null docChangedFilesLinuxMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (docChangedFilesLinuxValue) { + // Validate each entry is a safe .md path (no shell metacharacters) + docChangedFilesLinuxValue.split(' ').each { entry -> + if (!(entry ==~ /[a-zA-Z0-9_\/.\-]+\.md/)) { + error "Invalid doc_changed_files_linux entry: '${entry}'. Must be a .md file path with no special characters." + } + } doc_changed_files_linux = docChangedFilesLinuxValue.replaceAll(' ', '\n') println "Commit override: doc_changed_files_linux = ${doc_changed_files_linux}" } else { @@ -112,6 +124,12 @@ pipeline { def docChangedFilesWindowsValue = docChangedFilesWindowsMatcher ? docChangedFilesWindowsMatcher[0][1] : null docChangedFilesWindowsMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (docChangedFilesWindowsValue) { + // Validate each entry is a safe .md path (no shell metacharacters) + docChangedFilesWindowsValue.split(' ').each { entry -> + if (!(entry ==~ /[a-zA-Z0-9_\/.\-]+\.md/)) { + error "Invalid doc_changed_files_windows entry: '${entry}'. Must be a .md file path with no special characters." + } + } doc_changed_files_windows = docChangedFilesWindowsValue.replaceAll(' ', '\n') println "Commit override: doc_changed_files_windows = ${doc_changed_files_windows}" } else { From 0f5fbfe62acf32c127f80f69eae73aa0f884c828 Mon Sep 17 00:00:00 2001 From: Natalia Groza Date: Tue, 9 Jun 2026 15:49:07 +0200 Subject: [PATCH 14/14] review updates --- ci/build_test_OnCommit.groovy | 80 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/ci/build_test_OnCommit.groovy b/ci/build_test_OnCommit.groovy index 42ef14740c..6b1032cee9 100644 --- a/ci/build_test_OnCommit.groovy +++ b/ci/build_test_OnCommit.groovy @@ -2,13 +2,13 @@ def image_build_needed = "false" def win_image_build_needed = "false" def client_test_needed = "false" def export_models_changed = "false" -def doc_changed_files_linux = "" -def doc_changed_files_windows = "" +def test_doc_files_linux = "" +def test_doc_files_windows = "" def shortCommit = "" def agent_name_windows = "" -def agent_name_windows_doc = "ovms_win_ptl" +def test_agent_windows = "ovms_win_ptl" def agent_name_linux = "" -def agent_name_linux_doc = "ovms_ptl" +def test_agent_linux = "ovms_ptl" def disable_doc_tests_linux = false def disable_doc_tests_windows = false @@ -19,12 +19,12 @@ def disable_doc_tests_windows = false // [disable_doc_tests_windows] - Skip the Windows documentation tests stage // // Override agent node: -// [agent_name_linux_doc=] - Run Linux doc tests on (default: ovms_ptl) -// [agent_name_windows_doc=] - Run Windows doc tests on (default: ovms_win_ptl) +// [test_agent_linux=] - Run Linux doc tests on (default: ovms_ptl) +// [test_agent_windows=] - Run Windows doc tests on (default: ovms_win_ptl) // // Override file list (space-separated, converted to pytest -k filter joined with ' or '): -// [doc_changed_files_linux=] - Use instead of auto-detected list (Linux) -// [doc_changed_files_windows=] - Use instead of auto-detected list (Windows) +// [test_doc_files_linux=] - Use instead of auto-detected list (Linux) +// [test_doc_files_windows=] - Use instead of auto-detected list (Windows) pipeline { agent { @@ -80,62 +80,62 @@ pipeline { disable_doc_tests_windows = true println "Commit override: disable_doc_tests_windows = true" } - def agentLinuxDocMatcher = (commitMsg =~ /\[agent_name_linux_doc=([^\]]+)\]/) + def agentLinuxDocMatcher = (commitMsg =~ /\[test_agent_linux=([^\]]+)\]/) def agentLinuxDocValue = agentLinuxDocMatcher ? agentLinuxDocMatcher[0][1] : null agentLinuxDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (agentLinuxDocValue) { if (!(agentLinuxDocValue ==~ /[a-zA-Z0-9_-]+/)) { - error "Invalid agent_name_linux_doc override: '${agentLinuxDocValue}'. Only alphanumeric, hyphens and underscores allowed." + error "Invalid test_agent_linux override: '${agentLinuxDocValue}'. Only alphanumeric, hyphens and underscores allowed." } - agent_name_linux_doc = agentLinuxDocValue - println "Commit override: agent_name_linux_doc = ${agent_name_linux_doc}" + test_agent_linux = agentLinuxDocValue + println "Commit override: test_agent_linux = ${test_agent_linux}" } - def agentWindowsDocMatcher = (commitMsg =~ /\[agent_name_windows_doc=([^\]]+)\]/) + def agentWindowsDocMatcher = (commitMsg =~ /\[test_agent_windows=([^\]]+)\]/) def agentWindowsDocValue = agentWindowsDocMatcher ? agentWindowsDocMatcher[0][1] : null agentWindowsDocMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (agentWindowsDocValue) { if (!(agentWindowsDocValue ==~ /[a-zA-Z0-9_-]+/)) { - error "Invalid agent_name_windows_doc override: '${agentWindowsDocValue}'. Only alphanumeric, hyphens and underscores allowed." + error "Invalid test_agent_windows override: '${agentWindowsDocValue}'. Only alphanumeric, hyphens and underscores allowed." } - agent_name_windows_doc = agentWindowsDocValue - println "Commit override: agent_name_windows_doc = ${agent_name_windows_doc}" + test_agent_windows = agentWindowsDocValue + println "Commit override: test_agent_windows = ${test_agent_windows}" } - def docChangedFilesLinuxMatcher = (commitMsg =~ /\[doc_changed_files_linux=([^\]]+)\]/) + def docChangedFilesLinuxMatcher = (commitMsg =~ /\[test_doc_files_linux=([^\]]+)\]/) def docChangedFilesLinuxValue = docChangedFilesLinuxMatcher ? docChangedFilesLinuxMatcher[0][1] : null docChangedFilesLinuxMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (docChangedFilesLinuxValue) { // Validate each entry is a safe .md path (no shell metacharacters) docChangedFilesLinuxValue.split(' ').each { entry -> if (!(entry ==~ /[a-zA-Z0-9_\/.\-]+\.md/)) { - error "Invalid doc_changed_files_linux entry: '${entry}'. Must be a .md file path with no special characters." + error "Invalid test_doc_files_linux entry: '${entry}'. Must be a .md file path with no special characters." } } - doc_changed_files_linux = docChangedFilesLinuxValue.replaceAll(' ', '\n') - println "Commit override: doc_changed_files_linux = ${doc_changed_files_linux}" + test_doc_files_linux = docChangedFilesLinuxValue.replaceAll(' ', '\n') + println "Commit override: test_doc_files_linux = ${test_doc_files_linux}" } else { - doc_changed_files_linux = sh (script: "./ci/check_md_code_changes.sh linux ${diffBase}", returnStdout: true).trim() - if (doc_changed_files_linux) { - println "doc_changed_files_linux = ${doc_changed_files_linux}" + test_doc_files_linux = sh (script: "./ci/check_md_code_changes.sh linux ${diffBase}", returnStdout: true).trim() + if (test_doc_files_linux) { + println "test_doc_files_linux = ${test_doc_files_linux}" } else { println "No documentation files changed for linux" } } - def docChangedFilesWindowsMatcher = (commitMsg =~ /\[doc_changed_files_windows=([^\]]+)\]/) + def docChangedFilesWindowsMatcher = (commitMsg =~ /\[test_doc_files_windows=([^\]]+)\]/) def docChangedFilesWindowsValue = docChangedFilesWindowsMatcher ? docChangedFilesWindowsMatcher[0][1] : null docChangedFilesWindowsMatcher = null // Matcher is not serializable; null it before CPS checkpoint if (docChangedFilesWindowsValue) { // Validate each entry is a safe .md path (no shell metacharacters) docChangedFilesWindowsValue.split(' ').each { entry -> if (!(entry ==~ /[a-zA-Z0-9_\/.\-]+\.md/)) { - error "Invalid doc_changed_files_windows entry: '${entry}'. Must be a .md file path with no special characters." + error "Invalid test_doc_files_windows entry: '${entry}'. Must be a .md file path with no special characters." } } - doc_changed_files_windows = docChangedFilesWindowsValue.replaceAll(' ', '\n') - println "Commit override: doc_changed_files_windows = ${doc_changed_files_windows}" + test_doc_files_windows = docChangedFilesWindowsValue.replaceAll(' ', '\n') + println "Commit override: test_doc_files_windows = ${test_doc_files_windows}" } else { - doc_changed_files_windows = sh (script: "./ci/check_md_code_changes.sh windows ${diffBase}", returnStdout: true).trim() - if (doc_changed_files_windows) { - println "doc_changed_files_windows = ${doc_changed_files_windows}" + test_doc_files_windows = sh (script: "./ci/check_md_code_changes.sh windows ${diffBase}", returnStdout: true).trim() + if (test_doc_files_windows) { + println "test_doc_files_windows = ${test_doc_files_windows}" } else { println "No documentation files changed for windows" } @@ -210,7 +210,7 @@ pipeline { // release_image sh "make release_image RUN_TESTS=0 GPU=1 NPU=1 OVMS_CPP_IMAGE_TAG=${shortCommit} BUILD_IMAGE=openvino/model_server-build:${shortCommit}" sh "make run_lib_files_test OVMS_CPP_IMAGE_TAG=${shortCommit}" - if ( doc_changed_files_linux ) { + if ( test_doc_files_linux ) { sh "docker save openvino/model_server:${shortCommit} | gzip > ovms_release_image.tar.gz" stash name: 'ovms-release-image', includes: 'ovms_release_image.tar.gz' sh "rm -f ovms_release_image.tar.gz" @@ -241,7 +241,7 @@ pipeline { windows.install_dependencies() windows.clean() windows.build() - if ( doc_changed_files_windows ) { + if ( test_doc_files_windows ) { stash name: 'ovms-windows-package', includes: 'dist\\windows\\ovms.zip' } } finally { @@ -297,11 +297,11 @@ pipeline { stage("Documentation tests") { agent none when { - expression { doc_changed_files_linux && !disable_doc_tests_linux } + expression { test_doc_files_linux && !disable_doc_tests_linux } beforeAgent true } steps { - node(agent_name_linux_doc) { + node(test_agent_linux) { checkout scm script { dir ('documentation_tests') { @@ -309,11 +309,11 @@ pipeline { sh "pwd" def pwd = sh(returnStdout:true, script: "pwd").strip() def ovms_c_repo_path = sh(returnStdout:true, script: "cd .. && pwd").strip() - def doc_changed_files_str = doc_changed_files_linux.split('\n').join(' or ') + def test_doc_files_str = test_doc_files_linux.split('\n').join(' or ') sh "make create-venv && rm -f tests/functional && ln -s ${pwd}/../tests/functional tests/functional" def cmd_venv_activate = ". .venv/bin/activate" def cmd_export = "export TT_RUN_REGRESSION_TESTS=True && export TT_REGRESSION_WEEKLY_TESTS=True && export TT_TARGET_DEVICE=CPU,GPU,NPU && export TT_ENABLE_UAT_TESTS=True && export TT_ENABLE_SMOKE_TESTS=False && export TT_OVMS_C_REPO_PATH=${ovms_c_repo_path} && export TT_WAIT_FOR_MESSAGES_TIMEOUT=1500" - def cmd_pytest = "pytest tests/non_functional/documentation -k '${doc_changed_files_str}' -n 0 --dist loadgroup" + def cmd_pytest = "pytest tests/non_functional/documentation -k '${test_doc_files_str}' -n 0 --dist loadgroup" def cmd = "" if ( image_build_needed == "true" ) { unstash 'ovms-release-image' @@ -364,22 +364,22 @@ pipeline { stage("Documentation tests windows") { agent none when { - expression { doc_changed_files_windows && !disable_doc_tests_windows } + expression { test_doc_files_windows && !disable_doc_tests_windows } beforeAgent true } steps { - node(agent_name_windows_doc) { + node(test_agent_windows) { checkout scm script { dir ('documentation_tests') { checkout scmGit(branches: [[name: 'develop']], userRemoteConfigs: [[credentialsId: 'workflow-lab', url: 'https://github.com/intel-innersource/frameworks.ai.openvino.model-server.tests.git']]) - def doc_changed_files_str = doc_changed_files_windows.split('\n').join(' or ') + def test_doc_files_str = test_doc_files_windows.split('\n').join(' or ') def current_path = bat(returnStdout: true, script: 'cd').trim().split('\n').last().trim() def ovms_c_repo_path = bat(returnStdout: true, script: 'cd .. && cd').trim().split('\n').last().trim() def cmd_link_ovms = "(if exist ${current_path}\\tests\\functional rmdir ${current_path}\\tests\\functional) && mklink /D ${current_path}\\tests\\functional ${ovms_c_repo_path}\\tests\\functional" def cmd_requirements = "(if not exist .venv virtualenv .venv --python=python3.12) && call .venv\\Scripts\\activate.bat && pip install -r requirements.txt" def cmd_export = "set \"TT_RUN_REGRESSION_TESTS=True\" && set \"TT_REGRESSION_WEEKLY_TESTS=True\" && set \"TT_TARGET_DEVICE=CPU,GPU,NPU\" && set \"TT_BASE_OS=windows\" && set \"TT_OVMS_TYPE=BINARY\" && set \"TT_ENABLE_UAT_TESTS=True\" && set \"TT_ENABLE_SMOKE_TESTS=False\" && set \"TT_DISABLE_DMESG_LOG_MONITOR=True\" && set \"TT_OVMS_C_REPO_PATH=${ovms_c_repo_path}\" && set \"TT_WAIT_FOR_MESSAGES_TIMEOUT=1500\" && set \"PYTHONUTF8=1\" && set \"PYTHONIOENCODING=utf-8\"" - def cmd_pytest = "pytest tests/non_functional/documentation -k \"${doc_changed_files_str}\" -n 0 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" + def cmd_pytest = "pytest tests/non_functional/documentation -k \"${test_doc_files_str}\" -n 0 --dist loadgroup --basetemp=\"C:\\tmp\\pytest-${BRANCH_NAME}-${BUILD_NUMBER}\"" def cmd = "" if ( win_image_build_needed == "true" ) { unstash 'ovms-windows-package'