diff --git a/.github/workflows/OCV-PR-4.x-U24-AVX2.yaml b/.github/workflows/OCV-PR-4.x-U24-AVX2.yaml new file mode 100644 index 00000000..98f1c410 --- /dev/null +++ b/.github/workflows/OCV-PR-4.x-U24-AVX2.yaml @@ -0,0 +1,304 @@ +name: OCV PR:4.x U24 AVX2 + +on: + pull_request: + branches: + - main + paths: + - '.github/workflows/OCV-PR-4.x-U24-AVX2.yaml' + workflow_call: + +concurrency: + group: OCV-PR-4.x-U24-AVX2-${{ github.ref }} + cancel-in-progress: true + +env: + EXTRA_CMAKE_OPTIONS: '-DCPU_BASELINE=AVX2 -DBUILD_JAVA=OFF -DOPENCV_ENABLE_NONFREE=ON' + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + PR_AUTHOR_FORK: ${{ github.event.pull_request.head.repo.full_name }} + SOURCE_BRANCH_NAME: ${{ github.head_ref }} + TARGET_BRANCH_NAME: ${{ github.base_ref }} + ANT_HOME: '/usr/share/ant' + GIT_CACHE_DOCKER: '/home/ubuntu/git_cache' + PYTHONPATH: /home/ubuntu/build/python_loader:$PYTHONPATH + OPENCV_TEST_DATA_PATH: '/home/ubuntu/opencv_extra/testdata' + OPENCV_TEST_REQUIRE_DATA: 1 + OPENCV_TEST_CHECK_OPTIONAL_DATA: 1 + OPENCV_DOCKER_WORKDIR: '/home/ubuntu/opencv' + DNN_MODELS: '/home/ubuntu/dnn-models' + PARALLEL_JOBS: 8 + +jobs: + BuildAndTest: + runs-on: opencv-cn-lin-x86-64 + defaults: + run: + shell: bash + container: + image: quay.io/opencv-ci/opencv-ubuntu-24.04:20241031 + volumes: + - /home/opencv-cn/git_cache:/home/ubuntu/git_cache + - /home/opencv-cn/ci_cache/opencv:/home/ubuntu/.ccache + - /home/opencv-cn/binaries_cache:/home/ubuntu/binaries_cache + - /home/opencv-cn/dnn-models:/home/ubuntu/dnn-models + steps: + - name: Brief system information + timeout-minutes: 60 + run: bash ${{ env.GIT_CACHE_DOCKER }}/print_system_information.sh + - name: Define proper HOME path + timeout-minutes: 60 + run: echo "HOME=/home/ubuntu" >> $GITHUB_ENV + - name: Setup infra environment + timeout-minutes: 60 + if: ${{ github.event.repository.name == 'ci-gha-workflow' }} + run: | + echo "TARGET_BRANCH_NAME=4.x" >> $GITHUB_ENV + - name: Setup test environment + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + echo "EXTRA_GTEST_OPTIONS=--skip_unstable=1" >> $GITHUB_ENV + - name: PR info + timeout-minutes: 60 + run: | + echo "PR Author: ${{ env.PR_AUTHOR }}" + echo "PR Author fork: ${{ env.PR_AUTHOR_FORK }}" + echo "Source branch name: ${{ env.SOURCE_BRANCH_NAME }}" + echo "Target branch name: ${{ env.TARGET_BRANCH_NAME }}" + - name: Clean + timeout-minutes: 60 + run: find ${{ env.OPENCV_DOCKER_WORKDIR }} -mindepth 1 -delete + - name: Fetch opencv + timeout-minutes: 60 + run: git clone --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv.git https://github.com/opencv/opencv.git ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Merge opencv with ${{ env.SOURCE_BRANCH_NAME }} branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + cd ${{ env.OPENCV_DOCKER_WORKDIR }} + git pull -v "https://github.com/${{ env.PR_AUTHOR_FORK }}" "${{ env.SOURCE_BRANCH_NAME }}" + - name: Clone opencv_extra + timeout-minutes: 60 + run: git clone --single-branch --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv_extra.git https://github.com/opencv/opencv_extra.git $HOME/opencv_extra + - name: Merge opencv_extra with ${{ env.SOURCE_BRANCH_NAME }} branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + OPENCV_EXTRA_FORK=$(git ls-remote --heads "https://github.com/${{ env.PR_AUTHOR }}/opencv_extra" "${{ env.SOURCE_BRANCH_NAME }}") || true + if [[ ! -z "$OPENCV_EXTRA_FORK" ]]; then + echo "Merge opencv_extra with ${{ env.SOURCE_BRANCH_NAME }} branch" + cd $HOME/opencv_extra + git pull -v "https://github.com/${{ env.PR_AUTHOR }}/opencv_extra" "${{ env.SOURCE_BRANCH_NAME }}" + else + echo "No merge since ${{ env.PR_AUTHOR }}/opencv_extra does not have branch ${{ env.SOURCE_BRANCH_NAME }}" + fi + - name: Extra DNN models update + timeout-minutes: 60 + run: | + DOWNLOAD_MODELS_FILE='download_models.py' + LATEST_SAVED_HASH=$(cat ${{ env.DNN_MODELS }}/dnn/latest-hash-${{ env.TARGET_BRANCH_NAME }}.txt) + LATEST_HASH=$(sha256sum $HOME/opencv_extra/testdata/dnn/$DOWNLOAD_MODELS_FILE | awk '{print $1}') + if [[ $LATEST_HASH == $LATEST_SAVED_HASH ]]; then + echo "DNN models are up to date" + echo "OPENCV_DNN_TEST_DATA_PATH=${{ env.DNN_MODELS }}" >> $GITHUB_ENV + else + echo "Updating DNN models list" + echo "OPENCV_DNN_TEST_DATA_PATH=/home/ubuntu/new-dnn-models" >> $GITHUB_ENV && OPENCV_DNN_TEST_DATA_PATH='/home/ubuntu/new-dnn-models' + mkdir -p "$OPENCV_DNN_TEST_DATA_PATH" + rsync -a --exclude=$DOWNLOAD_MODELS_FILE ${{ env.DNN_MODELS }}/* $OPENCV_DNN_TEST_DATA_PATH + cp $HOME/opencv_extra/testdata/dnn/download_models.py $OPENCV_DNN_TEST_DATA_PATH/dnn + cd $OPENCV_DNN_TEST_DATA_PATH/dnn && python3 download_models.py + fi + - name: Configure OpenCV + timeout-minutes: 60 + run: | + cd $HOME/build + cmake -G Ninja ${{ env.EXTRA_CMAKE_OPTIONS }} ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Build OpenCV + timeout-minutes: 60 + id: build-opencv + run: | + cd $HOME/build + ninja -j ${{ env.PARALLEL_JOBS }} | tee $HOME/build/build-log.txt + - name: Warnings check + timeout-minutes: 60 + run: cd $HOME/build && python3 $HOME/scripts/warnings-handling.py + - name: Accuracy:calib3d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_calib3d --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:core + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_core --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:dnn + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_dnn --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:features2d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_features2d --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:flann + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_flann --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:gapi + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + # G-API bug with GCC 11+: https://github.com/opencv/opencv/issues/19678 + run: cd $HOME/build && xvfb-run -a bin/opencv_test_gapi --gtest_filter='-AsyncAPICancelation/cancel/*' --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:highgui + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_highgui --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:imgcodecs + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_imgcodecs --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:imgproc + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_imgproc --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:ml + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_ml --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:objdetect + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_objdetect --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:photo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_photo --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:stitching + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_stitching --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:video + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_video --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:videoio + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + # OpenCV-GStreamer bug with MPEG: https://github.com/opencv/opencv/issues/25547 + run: cd $HOME/build && xvfb-run -a bin/opencv_test_videoio --gtest_filter='-videoio/videoio_synthetic.write_read_position/9:videoio/videoio_synthetic.write_read_position/12:videoio/videoio_synthetic.write_read_position/25:videoio/videoio_synthetic.write_read_position/28:videoio/videowriter_acceleration.write/40:videoio/videowriter_acceleration.write/42' --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Performance:calib3d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_calib3d --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:core + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_core --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:dnn + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_dnn --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:features2d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_features2d --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:gapi + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_gapi --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:imgcodecs + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_imgcodecs --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:imgproc + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_imgproc --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:objdetect + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_objdetect --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:photo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_photo --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:stitching + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_stitching --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:video + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_video --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:videoio + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_videoio --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + + BuildContrib: + runs-on: opencv-cn-lin-x86-64 + defaults: + run: + shell: bash + container: + image: quay.io/opencv-ci/opencv-ubuntu-24.04:20241031 + volumes: + - /home/opencv-cn/git_cache:/home/ubuntu/git_cache + - /home/opencv-cn/ci_cache/opencv:/home/ubuntu/.ccache + - /home/opencv-cn/binaries_cache:/home/ubuntu/binaries_cache + steps: + - name: Brief system information + timeout-minutes: 60 + run: bash ${{ env.GIT_CACHE_DOCKER }}/print_system_information.sh + - name: Define proper HOME path + timeout-minutes: 60 + run: echo "HOME=/home/ubuntu" >> $GITHUB_ENV + - name: Setup infra environment + timeout-minutes: 60 + if: ${{ github.event.repository.name == 'ci-gha-workflow' }} + run: echo "TARGET_BRANCH_NAME=4.x" >> $GITHUB_ENV + - name: PR info + timeout-minutes: 60 + run: | + echo "PR Author: ${{ env.PR_AUTHOR }}" + echo "PR Author fork: ${{ env.PR_AUTHOR_FORK }}" + echo "Source branch name: ${{ env.SOURCE_BRANCH_NAME }}" + echo "Target branch name: ${{ env.TARGET_BRANCH_NAME }}" + - name: Clean + timeout-minutes: 60 + run: find ${{ env.OPENCV_DOCKER_WORKDIR }} -mindepth 1 -delete + - name: Fetch opencv + timeout-minutes: 60 + run: git clone --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv.git https://github.com/opencv/opencv.git ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Merge opencv with a test branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + cd ${{ env.OPENCV_DOCKER_WORKDIR }} + git pull -v "https://github.com/${{ env.PR_AUTHOR_FORK }}" "${{ env.SOURCE_BRANCH_NAME }}" + - name: Clone opencv_contrib + timeout-minutes: 60 + run: git clone --single-branch --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv_contrib.git https://github.com/opencv/opencv_contrib.git $HOME/opencv_contrib + - name: Merge opencv_contrib with ${{ env.SOURCE_BRANCH_NAME }} branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + OPENCV_CONTRIB_FORK=$(git ls-remote --heads "https://github.com/${{ env.PR_AUTHOR }}/opencv_contrib" "${{ env.SOURCE_BRANCH_NAME }}") || true + if [[ ! -z "$OPENCV_CONTRIB_FORK" ]]; then + echo "Merge opencv_contrib with ${{ env.SOURCE_BRANCH_NAME }} branch" + cd $HOME/opencv_contrib + git pull -v "https://github.com/${{ env.PR_AUTHOR }}/opencv_contrib" "${{ env.SOURCE_BRANCH_NAME }}" + else + echo "No merge since ${{ env.PR_AUTHOR }}/opencv_contrib does not have branch ${{ env.SOURCE_BRANCH_NAME }}" + fi + - name: Configure OpenCV Contrib + timeout-minutes: 60 + run: | + cd $HOME/build + cmake -G Ninja ${{ env.EXTRA_CMAKE_OPTIONS }} -DOPENCV_EXTRA_MODULES_PATH=$HOME/opencv_contrib/modules ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Build OpenCV Contrib + timeout-minutes: 60 + run: | + cd $HOME/build + ninja -j ${{ env.PARALLEL_JOBS }} | tee $HOME/build/build-log.txt + - name: Warnings check + timeout-minutes: 60 + run: cd $HOME/build && python3 $HOME/scripts/warnings-handling.py diff --git a/.github/workflows/OCV-PR-5.x-U24-AVX2.yaml b/.github/workflows/OCV-PR-5.x-U24-AVX2.yaml new file mode 100644 index 00000000..bbcba2b4 --- /dev/null +++ b/.github/workflows/OCV-PR-5.x-U24-AVX2.yaml @@ -0,0 +1,310 @@ +name: OCV PR:5.x U24 AVX2 + +on: + pull_request: + branches: + - main + paths: + - '.github/workflows/OCV-PR-5.x-U24-AVX2.yaml' + workflow_call: + +concurrency: + group: OCV-PR-5.x-U24-AVX2-${{ github.ref }} + cancel-in-progress: true + +env: + EXTRA_CMAKE_OPTIONS: '-DCPU_BASELINE=AVX2 -DBUILD_JAVA=OFF -DOPENCV_ENABLE_NONFREE=ON' + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + PR_AUTHOR_FORK: ${{ github.event.pull_request.head.repo.full_name }} + SOURCE_BRANCH_NAME: ${{ github.head_ref }} + TARGET_BRANCH_NAME: ${{ github.base_ref }} + ANT_HOME: '/usr/share/ant' + GIT_CACHE_DOCKER: '/home/ubuntu/git_cache' + PYTHONPATH: /home/ubuntu/build/python_loader:$PYTHONPATH + OPENCV_TEST_DATA_PATH: '/home/ubuntu/opencv_extra/testdata' + OPENCV_TEST_REQUIRE_DATA: 1 + OPENCV_TEST_CHECK_OPTIONAL_DATA: 1 + OPENCV_DOCKER_WORKDIR: '/home/ubuntu/opencv' + DNN_MODELS: '/home/ubuntu/dnn-models' + PARALLEL_JOBS: 8 + +jobs: + BuildAndTest: + runs-on: opencv-cn-lin-x86-64 + defaults: + run: + shell: bash + container: + image: quay.io/opencv-ci/opencv-ubuntu-24.04:20241031 + options: --gpus all -m 8G + volumes: + - /home/opencv-cn/git_cache:/home/ubuntu/git_cache + - /home/opencv-cn/ci_cache/opencv:/home/ubuntu/.ccache + - /home/opencv-cn/binaries_cache:/home/ubuntu/binaries_cache + - /home/opencv-cn/dnn-models:/home/ubuntu/dnn-models + steps: + - name: Brief system information + timeout-minutes: 60 + run: bash ${{ env.GIT_CACHE_DOCKER }}/print_system_information.sh + - name: Define proper HOME path + timeout-minutes: 60 + run: echo "HOME=/home/ubuntu" >> $GITHUB_ENV + - name: Setup infra environment + timeout-minutes: 60 + if: ${{ github.event.repository.name == 'ci-gha-workflow' }} + run: echo "TARGET_BRANCH_NAME=5.x" >> $GITHUB_ENV + - name: Setup test environment + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + echo "EXTRA_GTEST_OPTIONS=--skip_unstable=1" >> $GITHUB_ENV + - name: PR info + timeout-minutes: 60 + run: | + echo "PR Author: ${{ env.PR_AUTHOR }}" + echo "PR Author fork: ${{ env.PR_AUTHOR_FORK }}" + echo "Source branch name: ${{ env.SOURCE_BRANCH_NAME }}" + echo "Target branch name: ${{ env.TARGET_BRANCH_NAME }}" + - name: Clean + timeout-minutes: 60 + run: find ${{ env.OPENCV_DOCKER_WORKDIR }} -mindepth 1 -delete + - name: Fetch opencv + timeout-minutes: 60 + run: git clone --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv.git https://github.com/opencv/opencv.git ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Merge opencv with ${{ env.SOURCE_BRANCH_NAME }} branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + cd ${{ env.OPENCV_DOCKER_WORKDIR }} + git pull -v "https://github.com/${{ env.PR_AUTHOR_FORK }}" "${{ env.SOURCE_BRANCH_NAME }}" + - name: Clone opencv_extra + timeout-minutes: 60 + run: git clone --single-branch --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv_extra.git https://github.com/opencv/opencv_extra.git $HOME/opencv_extra + - name: Merge opencv_extra with ${{ env.SOURCE_BRANCH_NAME }} branch + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + OPENCV_EXTRA_FORK=$(git ls-remote --heads "https://github.com/${{ env.PR_AUTHOR }}/opencv_extra" "${{ env.SOURCE_BRANCH_NAME }}") || true + if [[ ! -z "$OPENCV_EXTRA_FORK" ]]; then + echo "Merge opencv_extra with ${{ env.SOURCE_BRANCH_NAME }} branch" + cd $HOME/opencv_extra + git pull -v "https://github.com/${{ env.PR_AUTHOR }}/opencv_extra" "${{ env.SOURCE_BRANCH_NAME }}" + else + echo "No merge since ${{ env.PR_AUTHOR }}/opencv_extra does not have branch ${{ env.SOURCE_BRANCH_NAME }}" + fi + - name: Extra DNN models update + timeout-minutes: 60 + run: | + DOWNLOAD_MODELS_FILE='download_models.py' + LATEST_SAVED_HASH=$(cat ${{ env.DNN_MODELS }}/dnn/latest-hash-${{ env.TARGET_BRANCH_NAME }}.txt) + LATEST_HASH=$(sha256sum $HOME/opencv_extra/testdata/dnn/$DOWNLOAD_MODELS_FILE | awk '{print $1}') + if [[ $LATEST_HASH == $LATEST_SAVED_HASH ]]; then + echo "DNN models are up to date" + echo "OPENCV_DNN_TEST_DATA_PATH=${{ env.DNN_MODELS }}" >> $GITHUB_ENV + else + echo "Updating DNN models list" + echo "OPENCV_DNN_TEST_DATA_PATH=/home/ubuntu/new-dnn-models" >> $GITHUB_ENV && OPENCV_DNN_TEST_DATA_PATH='/home/ubuntu/new-dnn-models' + mkdir -p "$OPENCV_DNN_TEST_DATA_PATH" + rsync -a --exclude=$DOWNLOAD_MODELS_FILE ${{ env.DNN_MODELS }}/* $OPENCV_DNN_TEST_DATA_PATH + cp $HOME/opencv_extra/testdata/dnn/download_models.py $OPENCV_DNN_TEST_DATA_PATH/dnn + cd $OPENCV_DNN_TEST_DATA_PATH/dnn && python3 download_models.py + fi + - name: Configure OpenCV + timeout-minutes: 60 + run: | + cd $HOME/build + cmake -G Ninja ${{ env.EXTRA_CMAKE_OPTIONS }} ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Build OpenCV + timeout-minutes: 60 + id: build-opencv + run: | + cd $HOME/build + ninja -j ${{ env.PARALLEL_JOBS }} | tee $HOME/build/build-log.txt + - name: Warnings check + timeout-minutes: 60 + run: cd $HOME/build && python3 $HOME/scripts/warnings-handling.py + - name: Accuracy:3d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_3d --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:calib + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_calib --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:core + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_core --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:DNN_AUTO + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_dnn --test_threads=$PARALLEL_JOBS ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:DNN_Classic + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: export OPENCV_FORCE_DNN_ENGINE=1 && cd $HOME/build && xvfb-run -a bin/opencv_test_dnn --test_threads=$PARALLEL_JOBS ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:features + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_features --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:flann + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_flann --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:highgui + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_highgui --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:imgcodecs + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_imgcodecs --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:imgproc + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_imgproc --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:objdetect + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_objdetect --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:photo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_photo --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:stereo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_stereo --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:stitching + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_stitching --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:video + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_test_video --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Accuracy:videoio + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + # OpenCV-GStreamer bug with MPEG: https://github.com/opencv/opencv/issues/25547 + run: cd $HOME/build && xvfb-run -a bin/opencv_test_videoio --gtest_filter='-videoio/videoio_synthetic.write_read_position/9:videoio/videoio_synthetic.write_read_position/12:videoio/videoio_synthetic.write_read_position/25:videoio/videoio_synthetic.write_read_position/28:videoio/videowriter_acceleration.write/40:videoio/videowriter_acceleration.write/42' --test_threads=${{ env.PARALLEL_JOBS }} ${{ env.EXTRA_GTEST_OPTIONS }} + - name: Performance:3d + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_3d --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:calib + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_calib --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:core + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_core --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:dnn + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_dnn --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:features + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_features --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:imgcodecs + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_imgcodecs --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:imgproc + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_imgproc --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:objdetect + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_objdetect --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:photo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_photo --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:stereo + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_stereo --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:stitching + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_stitching --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:video + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_video --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + - name: Performance:videoio + timeout-minutes: 60 + if: ${{ always() && steps.build-opencv.outcome == 'success' }} + run: cd $HOME/build && xvfb-run -a bin/opencv_perf_videoio --perf_impl=plain --perf_min_samples=1 --perf_force_samples=1 --perf_verify_sanity --skip_unstable=1 --perf_threads=${{ env.PARALLEL_JOBS }} + + BuildContrib: + runs-on: opencv-cn-lin-x86-64 + defaults: + run: + shell: bash + container: + image: quay.io/opencv-ci/opencv-ubuntu-24.04:20241031 + volumes: + - /home/opencv-cn/git_cache:/home/ubuntu/git_cache + - /home/opencv-cn/ci_cache/opencv:/home/ubuntu/.ccache + - /home/opencv-cn/binaries_cache:/home/ubuntu/binaries_cache + steps: + - name: Brief system information + timeout-minutes: 60 + run: bash ${{ env.GIT_CACHE_DOCKER }}/print_system_information.sh + - name: Define proper HOME path + timeout-minutes: 60 + run: echo "HOME=/home/ubuntu" >> $GITHUB_ENV + - name: Setup infra environment + timeout-minutes: 60 + if: ${{ github.event.repository.name == 'ci-gha-workflow' }} + run: echo "TARGET_BRANCH_NAME=5.x" >> $GITHUB_ENV + - name: PR info + timeout-minutes: 60 + run: | + echo "PR Author: ${{ env.PR_AUTHOR }}" + echo "PR Author fork: ${{ env.PR_AUTHOR_FORK }}" + echo "Source branch name: ${{ env.SOURCE_BRANCH_NAME }}" + echo "Target branch name: ${{ env.TARGET_BRANCH_NAME }}" + - name: Clean + timeout-minutes: 60 + run: find ${{ env.OPENCV_DOCKER_WORKDIR }} -mindepth 1 -delete + - name: Fetch opencv + timeout-minutes: 60 + run: git clone --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv.git https://github.com/opencv/opencv.git ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Merge opencv with a test branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + cd ${{ env.OPENCV_DOCKER_WORKDIR }} + git pull -v "https://github.com/${{ env.PR_AUTHOR_FORK }}" "${{ env.SOURCE_BRANCH_NAME }}" + - name: Clone opencv_contrib + timeout-minutes: 60 + run: git clone --single-branch --branch ${{ env.TARGET_BRANCH_NAME }} --reference ${{ env.GIT_CACHE_DOCKER }}/opencv_contrib.git https://github.com/opencv/opencv_contrib.git $HOME/opencv_contrib + - name: Merge opencv_contrib with ${{ env.SOURCE_BRANCH_NAME }} branch + timeout-minutes: 60 + if: ${{ github.event.repository.name != 'ci-gha-workflow' }} + run: | + OPENCV_CONTRIB_FORK=$(git ls-remote --heads "https://github.com/${{ env.PR_AUTHOR }}/opencv_contrib" "${{ env.SOURCE_BRANCH_NAME }}") || true + if [[ ! -z "$OPENCV_CONTRIB_FORK" ]]; then + echo "Merge opencv_contrib with ${{ env.SOURCE_BRANCH_NAME }} branch" + cd $HOME/opencv_contrib + git pull -v "https://github.com/${{ env.PR_AUTHOR }}/opencv_contrib" "${{ env.SOURCE_BRANCH_NAME }}" + else + echo "No merge since ${{ env.PR_AUTHOR }}/opencv_contrib does not have branch ${{ env.SOURCE_BRANCH_NAME }}" + fi + - name: Configure OpenCV Contrib + timeout-minutes: 60 + run: | + cd $HOME/build + cmake -G Ninja ${{ env.EXTRA_CMAKE_OPTIONS }} -DOPENCV_EXTRA_MODULES_PATH=$HOME/opencv_contrib/modules ${{ env.OPENCV_DOCKER_WORKDIR }} + - name: Build OpenCV Contrib + timeout-minutes: 60 + run: | + cd $HOME/build + ninja -j ${{ env.PARALLEL_JOBS }} | tee $HOME/build/build-log.txt + - name: Warnings check + timeout-minutes: 60 + run: cd $HOME/build && python3 $HOME/scripts/warnings-handling.py