diff --git a/.ci-builds/.azure-exhaustive-tests.yml b/.ci-builds/.azure-exhaustive-tests.yml deleted file mode 100644 index 92b3b7d6567b..000000000000 --- a/.ci-builds/.azure-exhaustive-tests.yml +++ /dev/null @@ -1,81 +0,0 @@ -# Azure Pipelines configuration for Exhaustive Tests for ICU. -# -# Note: The exhaustive test configuration is in a separate file -# so that it can be run independently from the regular builds. -# -# Only run the exhaustive tests on the main and maint branches, and -# also batch up any pending changes so that we will only have at most -# one build running at a given time (since they take a long time). -trigger: - # batch=true to reduce number of concurrent runs on the same branch: - # https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/trigger?view=azure-pipelines#properties - # potential future feature to supersede batch=true: - # https://learn.microsoft.com/en-us/azure/devops/pipelines/process/stages?view=azure-devops&tabs=yaml#specify-queuing-policies - batch: true - branches: - include: - - main - - maint/maint-* - paths: - include: - - '*' - exclude: - - .github/* - - .ci-builds/.azure-pipelines-icu4c.yml - - .ci-builds/.azure-pipelines-icu4j.yml - - .ci-builds/.azure-valgrind.yml - - docs/* - - tools/* - - vendor/* - - .cpyskip.txt - - .travis.yml - - KEYS - - README.md - -variables: - MAVEN_ARGS: '--show-version --no-transfer-progress' - -jobs: -#------------------------------------------------------------------------- -# Note: The exhaustive tests can take more than 1 hour to complete. -- job: ICU4J_OpenJDK_Ubuntu_2204 - displayName: 'J: Linux OpenJDK (Ubuntu 22.04)' - timeoutInMinutes: 180 - pool: - vmImage: 'ubuntu-22.04' - demands: ant - steps: - - checkout: self - lfs: true - fetchDepth: 10 - - script: | - echo "Building ICU4J" && cd icu4j && mvn install -DICU.exhaustive=10 - displayName: 'Build and Exhaustive Tests' - env: - BUILD: ICU4J - - script: | - cd icu4j && cat `find . -name surefire-reports -type d -exec grep -l -r --include="*.txt" FAILED {} \;` - condition: failed() # only run if the build fails. - displayName: 'List failures (if any)' - timeoutInMinutes: 2 -#------------------------------------------------------------------------- -# Note: The exhaustive tests can take more than 1 hour to complete. -- job: ICU4C_Clang_Exhaustive_Ubuntu_2204 - displayName: 'C: Linux Clang Exhaustive Tests (Ubuntu 22.04)' - timeoutInMinutes: 120 - pool: - vmImage: 'ubuntu-22.04' - steps: - - checkout: self - lfs: true - fetchDepth: 10 - - script: | - cd icu4c/source && ./runConfigureICU Linux && make -j -l2.5 - displayName: 'Build' - - script: | - cd icu4c/source && make check-exhaustive - displayName: 'Exhaustive Tests' - env: - CC: clang - CXX: clang++ -#------------------------------------------------------------------------- diff --git a/.ci-builds/.azure-pipelines-icu4c.yml b/.ci-builds/.azure-pipelines-icu4c.yml index 2c7e675aa0ce..d30e833c70a8 100644 --- a/.ci-builds/.azure-pipelines-icu4c.yml +++ b/.ci-builds/.azure-pipelines-icu4c.yml @@ -67,7 +67,7 @@ jobs: # calling makeconv for it, although the Makefile has appropriate dependencies. - script: | cd icu4c/source && \ - ICU_DATA_FILTER_FILE=../../.ci-builds/data-filter.json ./runConfigureICU Linux && \ + ICU_DATA_FILTER_FILE=../../.github/data-filter.json ./runConfigureICU Linux && \ make -j2 tests && \ \[ ! -d data/out/build/icudt66l/translit \] && \ (cd test/intltest && LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./intltest translit/TransliteratorTest/TestBasicTransliteratorEvenWithoutData) && \ @@ -272,7 +272,7 @@ jobs: - Cmd steps: - powershell: | - $filterPath = $Env:BUILD_SOURCESDIRECTORY + "\.ci-builds\data-filter.json" + $filterPath = $Env:BUILD_SOURCESDIRECTORY + "\.github\data-filter.json" $vstsCommandString = "vso[task.setvariable variable=ICU_DATA_FILTER_FILE]" + $filterPath Write-Host "##$vstsCommandString" - task: VSBuild@1 @@ -667,4 +667,4 @@ jobs: displayName: 'Run Tests (icucheck.bat)' inputs: filename: icu4c/source/allinone/icucheck.bat - arguments: 'x64 Release' + arguments: 'x64 Release' \ No newline at end of file diff --git a/.ci-builds/data-filter.json b/.github/data-filter.json similarity index 100% rename from .ci-builds/data-filter.json rename to .github/data-filter.json diff --git a/.github/workflows/icu4c.yml b/.github/workflows/icu4c.yml index 01a1fda21082..34c30fde8eb0 100644 --- a/.github/workflows/icu4c.yml +++ b/.github/workflows/icu4c.yml @@ -75,6 +75,26 @@ jobs: make install; PATH=$PREFIX/bin:$PATH make -C test/hdrtst check + #gcc 11 with c++ 20 + gcc11-cpp20: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install GCC-11 + run: | + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt update + sudo apt install gcc-11 g++-11 + - name: Build and Test + env: + CC: gcc-11 + CXX: g++-11 + CXXFLAGS: -std=c++20 -fext-numeric-literals + run: | + cd icu4c/source; + ./runConfigureICU Linux + make -j -l4.5 check; + # clang release build with some options to enforce useful constraints. # Includes dependency checker on an in-source, optimized build. # Includes checking @draft etc. API tags vs. ifndef guards like @@ -106,6 +126,12 @@ jobs: run: | cd icu4c; source/test/hdrtst/testtagsguards.sh; + - name: Test C Default locale + run: | + cd icu4c/source/test/cintltst && LANG=C LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestCDefaultLocale + - name: Test C.UTF-8 Default locale + run: | + cd icu4c/source/test/cintltst && LANG=C.UTF-8 LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestCDefaultLocale - name: Make Dist env: CPPFLAGS: -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 @@ -240,6 +266,81 @@ jobs: CPPFLAGS: -fsanitize=thread LDFLAGS: -fsanitize=thread + #------------------------------------------------------ + # Clang Linux with data filter + # Note: This job uses `make -j2` instead of `make -j -l4.5` because with more parallelism (PR #2456) + # this check became flaky. The build apparently was not done copying one or another .ucm file before + # calling makeconv for it, although the Makefile has appropriate dependencies. + clang-datafilter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Extract ICU version + run: | + # Extract ICU version from icuver.txt + icuverContent=$(cat icu4c/source/data/misc/icuver.txt) + icuVersion=$(echo "$icuverContent" | grep -oP 'ICUVersion\{"\K\d+\.\d+\.\d+\.\d+') + majorVersion=$(echo "$icuVersion" | cut -d. -f1) + echo "majorVersion=$majorVersion" + echo "majorVersion=$majorVersion" >> $GITHUB_ENV + - name: Build ICU4C with clang + run: | + cd icu4c/source && \ + ICU_DATA_FILTER_FILE=../../.github/data-filter.json ./runConfigureICU Linux/clang && \ + make -j2 tests && \ + \[ ! -d data/out/build/icudt${majorVersion}l/translit \] && \ + (cd test/intltest && LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./intltest translit/TransliteratorTest/TestBasicTransliteratorEvenWithoutData) && \ + (cd test/cintltst && LANG=C LD_LIBRARY_PATH=../../lib:../../tools/ctestfw ./cintltst /tsutil/cloctst/TestEnglishExemplarCharacters /tsutil/cldrtest/TestCoverage) + + # Clang Linux with CPP 17 + clang-cpp17: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Build ICU4C with CPP 17 + env: + CXXFLAGS: -std=c++17 -Winvalid-constexpr + run: | + cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux/clang && make -j -l4.5 check + + # Clang Linux with LANG: en_US@calendar=gregorian;hours=h12 + clang-lang-with-extn-tags: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Linux Clang - LANG has extension tags + env: + LANG: "en_US@calendar=gregorian;hours=h12" + run: | + cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux/clang && make -j -l4.5 check + + # Clang Linux 16 with CPP20 and treat warnings as errors + clang16-cpp20-warning-as-errors: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + flags: + - '-std=c++20' + - '-std=c++20 -stdlib=libc++' + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Clang-16 + run: | + curl -Ls https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo apt-add-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-16 main' + sudo apt update + sudo apt install -qy clang-16 lld-16 libc++-16-dev libc++abi-16-dev + - name: Clang-16 build and Test + env: + CC: clang-16 + CXX: clang++-16 + # TODO: add '-Werror' after fixing ICU-22873 + CPPFLAGS: '-Wall -Wextra -Wno-strict-prototypes -Wctad-maybe-unsupported' + CXXFLAGS: ${{ matrix.flags }} + run: | + cd icu4c/source && ./runConfigureICU --enable-debug --disable-release Linux/clang && make -j -l4.5 check + # MacOS with clang macos-clang: runs-on: macos-latest @@ -247,11 +348,163 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ICU4C with clang on MacOS + env: + # TODO: add '-Werror' after fixing ICU-22874 + CPPFLAGS: '-Wall -Wextra -Wextra-semi -Wundef -Wnon-virtual-dtor -Wctad-maybe-unsupported' run: | cd icu4c/source; PYTHON=python3 ./runConfigureICU MacOSX; make -j -l4.5 check + # Windows MSVC builds + windows-msvc: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + include: + - test_flags: 'x64 Debug' + build_flags: '/p:Configuration=Debug /p:Platform=x64' + - test_flags: 'x86 Debug' + build_flags: '/p:Configuration=Debug /p:Platform=Win32' + - test_flags: 'arm Release' + build_flags: '/p:Configuration=Release /p:Platform=ARM' + - test_flags: 'x64 Release' + build_flags: '/p:LanguageStandard=stdcpplatest /p:Configuration=Release /p:Platform=x64' + - test_flags: 'x64 Release' + build_flags: '/p:_HAS_EXCEPTIONS=0 /p:Configuration=Release /p:Platform=x64' + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v2 + - name: Build Solution x64 + if: contains(matrix.test_flags, 'arm Release') + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 + - name: Build Solution + run: | + msbuild icu4c/source/allinone/allinone.sln ${{ matrix.build_flags }} + - name: Run ${{ matrix.test_flags }} Tests (icucheck.bat) + if: contains(matrix.test_flags, 'arm Release') == false + run: | + icu4c\source\allinone\icucheck.bat ${{ matrix.test_flags }} + + # Windows data filter build + windows-msvc-datafilter: + runs-on: windows-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set ICU_DATA_FILTER_FILE variable + run: | + $filterPath = "${{ github.workspace }}\.github\data-filter.json" + echo "ICU_DATA_FILTER_FILE=$filterPath" >> $GITHUB_ENV + shell: pwsh + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v2 + - name: Build Solution with Data Filter + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 /p:SkipUWP=true + + # Windows MSVC distribution release + windows-msvc-dist-release: + runs-on: windows-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + include: + - arch: 'x64' + plat: 'x64' + win_ver: 'Win64' + - arch: 'x86' + plat: 'Win32' + win_ver: 'Win32' + - arch: 'arm64' + plat: 'ARM64' + win_ver: 'WinARM64' + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v2 + - name: Build Solution x64 + if: contains(matrix.win_ver, 'ARM64') + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 + - name: Build Solution + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=${{ matrix.plat }} + - name: Run Tests (icucheck.bat) + if: contains(matrix.win_ver, 'ARM64') == false + run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} Release + - name: "Run PowerShell: Distrelease script (${{ matrix.arch }})" + run: | + cd ./icu4c/ + ./packaging/distrelease.ps1 -arch ${{ matrix.arch }} + shell: pwsh + - name: Extract ICU version and rename zip file + id: set-zip-name + run: | + # Extract ICU version from icuver.txt + $icuverContent = Get-Content icu4c\source\data\misc\icuver.txt + $icuVersion = ($icuverContent -match 'ICUVersion{"(\d+\.\d+\.\d+\.\d+)"}')[0] + $icuVersion -match '\{"(.*?)"\}' | Out-Null + $icuVersion = $matches[1] + $majorVersion = $icuVersion.Split('.')[0] + $minorVersion = $icuVersion.Split('.')[1] + # Determine the new file name based on the version + if ($minorVersion -eq "0") { + $newZipName = "icu4c-${majorVersion}rc-${{ matrix.win_ver }}-MSVC2022" + } else { + $newZipName = "icu4c-${majorVersion}_${minorVersion}-${{ matrix.win_ver }}-MSVC2022" + } + # Debugging: Print the new zip name + Write-Host "New Zip Name: $newZipName" + # Rename the existing zip file + cd icu4c\source\dist\ && ls -l . + Rename-Item -Path icu-windows.zip -NewName "${newZipName}.zip" + echo $newZipName + ls -l . + echo "newZipName=$newZipName" | Out-File -FilePath $env:GITHUB_ENV -Append + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: icu4c.${{ matrix.win_ver }}.run_#${{ github.run_number }} + path: icu4c/source/dist/${{ env.newZipName }}.zip + + # Window MSYS2 tests + windows-msys2-gcc-x86_64: + runs-on: windows-latest + timeout-minutes: 45 + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set up MSYS2 + uses: msys2/setup-msys2@v2 + id: msys2 + with: + update: true + msystem: mingw64 + install: > + base-devel + mingw-w64-x86_64-toolchain + make + - name: 'Verify MinGW Installation' + run: gcc --version + - name: Build and Test + run: | + cd '${{ github.workspace }}' && cd icu4c/source && ./runConfigureICU MinGW --prefix='/tmp/build-icu' && make -j -l4.5 check + - name: Make install + run: | + cd '${{ github.workspace }}' && cd icu4c/source && make install && cd /tmp/build-icu && echo 'Recursive ls' && ls -lR + - name: Run icuinfo + run: | + echo 'Run icuinfo from MSYS shell' && cd /tmp/build-icu/bin && ./icuinfo.exe + - name: Run icuinfo from CMD + shell: cmd + run: | + cd /d ${{ steps.msys2.outputs.msys2-location }}\tmp\build-icu\bin + set PATH=C:\tools\msys64\mingw64\bin;%PATH% + .\icuinfo.exe + # Run ICU4C tests with stubdata. run-with-stubdata: runs-on: ubuntu-latest @@ -593,3 +846,75 @@ jobs: mkdir -p lib pushd common && make -j -l4.5 && popd pushd i18n && make -j -l4.5 && popd + + # Workflow for ICU Export Data for ICU4X + icu4c-icuexportdata: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Build + run: | + cd icu4c/source && ./runConfigureICU Linux && make -j -l4.5 + env: + CC: clang + CXX: clang++ + - name: Build property data files + run: | + cd icu4c/source + mkdir -p icuexportdata/uprops/fast + ./bin/icuexportdata --mode uprops --index --copyright --verbose --destdir icuexportdata/uprops/fast --trie-type fast --all + mkdir -p icuexportdata/uprops/small + ./bin/icuexportdata --mode uprops --index --copyright --verbose --destdir icuexportdata/uprops/small --trie-type small --all + env: + LD_LIBRARY_PATH: lib + - name: Build normalization data files + run: | + cd icu4c/source + mkdir -p icuexportdata/norm/fast + ./bin/icuexportdata --mode norm --index --copyright --verbose --destdir icuexportdata/norm/fast --trie-type fast --all + mkdir -p icuexportdata/norm/small + ./bin/icuexportdata --mode norm --index --copyright --verbose --destdir icuexportdata/norm/small --trie-type small --all + env: + LD_LIBRARY_PATH: lib + - name: Build case data files + run: | + cd icu4c/source + mkdir -p icuexportdata/ucase/fast + ./bin/icuexportdata --mode ucase --index --copyright --verbose --destdir icuexportdata/ucase/fast --trie-type fast --all + mkdir -p icuexportdata/ucase/small + ./bin/icuexportdata --mode ucase --index --copyright --verbose --destdir icuexportdata/ucase/small --trie-type small --all + env: + LD_LIBRARY_PATH: lib + - name: Build collation data files + run: | + cd icu4c/source + cd data/coll + FILES=$(ls *.txt) + cd ../../ + mkdir -p icuexportdata/collation/unihan + ./bin/genrb -X -s data/coll --ucadata data/in/coll/ucadata-unihan-icu4x.icu -d icuexportdata/collation/unihan $FILES + rm icuexportdata/collation/unihan/*.res + mkdir -p icuexportdata/collation/implicithan + ./bin/genrb -X -s data/coll --ucadata data/in/coll/ucadata-implicithan-icu4x.icu -d icuexportdata/collation/implicithan $FILES + rm icuexportdata/collation/implicithan/*.res + env: + LD_LIBRARY_PATH: lib + - name: Build segmenter dictionary files + run: | + cd icu4c/source + mkdir -p icuexportdata/segmenter/dictionary + for FILE in $(ls data/brkitr/dictionaries | xargs -n 1 basename); do + ./bin/gendict --uchars --toml data/brkitr/dictionaries/$FILE icuexportdata/segmenter/dictionary/$(basename $FILE .txt).toml + done + env: + LD_LIBRARY_PATH: lib + - name: Zip + run: | + cd icu4c/source/icuexportdata + zip -r ../../../icuexportdata_tag-goes-here.zip . + - name: Publish Artifact + uses: actions/upload-artifact@v4 + with: + name: icuexportdata_output + path: icuexportdata_tag-goes-here.zip \ No newline at end of file diff --git a/.github/workflows/icu_exhaustive_tests.yml b/.github/workflows/icu_exhaustive_tests.yml new file mode 100644 index 000000000000..fe992f74b01b --- /dev/null +++ b/.github/workflows/icu_exhaustive_tests.yml @@ -0,0 +1,69 @@ +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html +# +# GitHub Actions configuration for Exhaustive Tests for ICU. +# +# Note: The exhaustive test configuration is in a separate file +# so that it can be run independently from the regular builds. +# +# To run these tests, go to the Actions Tab of your repo on the github page, +# select "Exhaustive Tests for ICU" and manually trigger the workflow for your branch. + +name: Exhaustive Tests for ICU + +on: + push: + # Runs post merge on maintenance branches + branches: + - 'maint/maint*' + paths: + - 'icu4c/**' + - 'icu4j/**' + - '.github/workflows/**' + schedule: + # Runs daily on default branch (main) only. + # https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule + - cron: '0 4 * * 6' # Run every Saturday at 4:00 UTC + workflow_dispatch: + # Run manually on any branch + +# For non-release branches (namely: PRs), only run CI on the most recent commit. Cancel +# runs on previous commits mid-flight when new commits are pushed. +# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-only-cancel-in-progress-jobs-on-specific-branches +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ !contains(github.ref, 'maint/') && github.ref != 'main' }} + +jobs: + # Runs exhaustive tests for ICU4J on Linux + icu4j-linux: + runs-on: ubuntu-latest + timeout-minutes: 180 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Build and Exhaustive Tests + run: | + echo "Building ICU4J" && cd icu4j && mvn install -DICU.exhaustive=10 + env: + BUILD: ICU4J + - name: List failures (if any) + if: failure() + run: | + cd icu4j && cat `find . -name surefire-reports -type d -exec grep -l -r --include="*.txt" FAILED {} \;` + timeout-minutes: 2 + + + icu4c-linux-clang: + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Build + run: | + cd icu4c/source && ./runConfigureICU Linux/clang && make -j -l4.5 + - name: Exhaustive Tests + run: | + cd icu4c/source && make check-exhaustive + env: + CC: clang + CXX: clang++ diff --git a/.github/workflows/icu_merge_ci.yml b/.github/workflows/icu_merge_ci.yml index a7090564c0c9..7c5eba630075 100644 --- a/.github/workflows/icu_merge_ci.yml +++ b/.github/workflows/icu_merge_ci.yml @@ -824,3 +824,85 @@ jobs: publish_branch: main publish_dir: ./perf keep_files: true + + # Build ICU and tests sample on some windows configurations + icu4c-windows-msvc-postmerge: + runs-on: windows-2022 + timeout-minutes: 30 + strategy: + matrix: + arch: [x64, x86] + config: [Debug, Release] + include: + - arch: x86 + platform: Win32 + - arch: x64 + platform: x64 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v1 + - name: Build Solution + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} + - name: Run Tests (icucheck.bat) + run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} ${{ matrix.config }} + - name: Build Sample Solution + run: msbuild icu4c/source/samples/all/all.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.arch }} + - name: Test Samples (samplecheck.bat) + run: icu4c/source/samples/all/samplecheck.bat ${{ matrix.arch }} ${{ matrix.config }} + + icu4c-windows-cygwin-gcc: + runs-on: windows-latest + timeout-minutes: 50 + env: + ICU_CI_CACHE: c:\icu-ci-cache + CYG_URL: https://cygwin.com/setup-x86_64.exe + CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ + CYG_PACKAGES: automake,gcc-core,gcc-g++,make,pkg-config,perl,python3 + CYG_ROOT: c:\cygwin-root + CYG_CACHE: 'c:\icu-ci-cache\cygwin64-v3' + CYG_CACHED_SETUP: 'c:\icu-ci-cache\cygwin64-v3\setup.exe' + CYG_VERSION_KEY: cygwin-3.2 + defaults: + run: + shell: cmd + steps: + - name: Configure Git to checkout with Unix line endings (LF) + run: | + git config --global core.autocrlf input + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Restore Cygwin cache + uses: actions/cache@v2 + with: + path: ${{ env.CYG_CACHE }} + key: ${{ hashFiles('.github/workflows/icu_merge_ci.yml') }} + - name: Download Cygwin setup + shell: pwsh + run: | + if ( !(Test-Path "${{ env.CYG_CACHED_SETUP }}" -NewerThan (Get-Date).AddDays(-7)) ) + { + Write-Host "Cached Cygwin setup does not exist or is older than 7 days, downloading from external site." + New-Item -Force -Type Directory ${{ env.CYG_CACHE }} + Write-Host "Downloading Cygwin setup..." + $start_time = Get-Date + (New-Object System.Net.WebClient).DownloadFile("${{ env.CYG_URL }}", "${{ env.CYG_CACHED_SETUP }}") + Write-Output "Download took: $((Get-Date).Subtract($start_time).Seconds) second(s)." + } + - name: Install Cygwin + run: | + ${{ env.CYG_CACHED_SETUP }} --no-verify --quiet-mode --no-shortcuts --no-startmenu --no-desktop --upgrade-also --only-site --site "${{ env.CYG_MIRROR }}" --root "${{ env.CYG_ROOT }}" --local-package-dir "${{ env.CYG_CACHE }}" --packages "${{ env.CYG_PACKAGES }}" + - name: Check Cygwin environment + run: | + ${{ env.CYG_ROOT }}/bin/sh -lc 'echo Hello' && ${{ env.CYG_ROOT }}/bin/sh -lc 'uname -a' + - name: Build ICU (source and test) + run: | + ${{ env.CYG_ROOT }}/bin/bash -lc "cd $(cygpath \"${{ github.workspace }}\") && cd icu4c/source && ./runConfigureICU Cygwin && make tests -j -l4.5" + env: + CC: gcc + CXX: g++ + - name: Run Tests + run: | + ${{ env.CYG_ROOT }}/bin/bash -lc "cd $(cygpath \"${{ github.workspace }}\") && cd icu4c/source && make -j -l4.5 check" + env: + CC: gcc + CXX: g++ diff --git a/docs/processes/cldr-icu.md b/docs/processes/cldr-icu.md index 4cf53813f534..05f399f1c997 100644 --- a/docs/processes/cldr-icu.md +++ b/docs/processes/cldr-icu.md @@ -379,12 +379,12 @@ If the data is OK , other sources of failure can include: Exhautive tests should always be run for a CLDR-ICU integration PR before it is merged. Once you have a PR, you can do this for both C and J as part of the pre-merge CI tests -by adding the following as a comment in the pull request:
-`/azp run CI-Exhaustive` (the exhaustive tests are not run automatically on every PR). +by manually running a workflow (the exhaustive tests are not run automatically on every PR). +See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustive-tests). The following instructions run the ICU4C exhaustive tests locally (which you may want to do before even committing changes, or which may be necessary to diagnose failures in the -CI tests: +CI tests): ``` cd $ICU4C_DIR/source export INTLTEST_OPTS="-e" diff --git a/docs/processes/release/tasks/healthy-code.md b/docs/processes/release/tasks/healthy-code.md index a4bc4b6f3125..5d4aa295faf2 100644 --- a/docs/processes/release/tasks/healthy-code.md +++ b/docs/processes/release/tasks/healthy-code.md @@ -474,7 +474,7 @@ make check ## Test ICU4C Samples and Demos ### Windows build and test -Note: Since ICU 73, this task has been included in the Azure DevOps Pipeline which is triggered automatically upon merging with main/maint* branches. +Note: Since ICU 76, this task has been included in the GHA workflows which are triggered automatically upon merging with main/maint* branches. These instructions explain how to run the tests manually. To build the ICU4C samples on Windows with Visual Studio, use the following diff --git a/docs/processes/release/tasks/publish/azure-ci-builds-artifacts-download.png b/docs/processes/release/tasks/publish/azure-ci-builds-artifacts-download.png deleted file mode 100644 index b6817934faa9..000000000000 Binary files a/docs/processes/release/tasks/publish/azure-ci-builds-artifacts-download.png and /dev/null differ diff --git a/docs/processes/release/tasks/publish/azure-ci-builds-artifacts.png b/docs/processes/release/tasks/publish/azure-ci-builds-artifacts.png deleted file mode 100644 index 57efc4bd7427..000000000000 Binary files a/docs/processes/release/tasks/publish/azure-ci-builds-artifacts.png and /dev/null differ diff --git a/docs/processes/release/tasks/publish/azure-ci-builds.png b/docs/processes/release/tasks/publish/azure-ci-builds.png deleted file mode 100644 index 1de2309e9d7b..000000000000 Binary files a/docs/processes/release/tasks/publish/azure-ci-builds.png and /dev/null differ diff --git a/docs/processes/release/tasks/publish/gha-ci-artifacts.png b/docs/processes/release/tasks/publish/gha-ci-artifacts.png new file mode 100644 index 000000000000..3c474b606ccc Binary files /dev/null and b/docs/processes/release/tasks/publish/gha-ci-artifacts.png differ diff --git a/docs/processes/release/tasks/publish/gha-ci-summary.png b/docs/processes/release/tasks/publish/gha-ci-summary.png new file mode 100644 index 000000000000..5f3da30b69b3 Binary files /dev/null and b/docs/processes/release/tasks/publish/gha-ci-summary.png differ diff --git a/docs/processes/release/tasks/publish/index.md b/docs/processes/release/tasks/publish/index.md index 47d7bc538c80..e790a38c5ece 100644 --- a/docs/processes/release/tasks/publish/index.md +++ b/docs/processes/release/tasks/publish/index.md @@ -309,36 +309,24 @@ run \`make dist\`. * Click on the green check mark (✔) on the most recent/last commit. (It might be a red X if the builds failed, hopefully not). * This will open up a pop-up with links to various CI builds. - * Click on one of the various links that says "Details" for the Azure CI - builds. + * Click on one of the various links that says "Details" for any of the GHA + builds and click on "Summary". * This will open up the GitHub overview of the build status.
- ![image](azure-ci-builds.png)
- * Click on the link "View more details on Azure Pipelines" link. - * This will take you to the actual Azure CI build page. - * On the top right of the page there should be a button titled - "Artifacts". Click this and it should show a drop-down with various ZIP - files that you can download.
- ![image](azure-ci-builds-artifacts.png)
- * The ZIP may automatically download for you. - * However, if you are signed-in to visualstudio.com then you might see a - dialog titled "Artifacts explorer". - * In this case click on the name, then the "..." button to download the - zip file.
- ![image](azure-ci-builds-artifacts-download.png)
- * Download both the x64 (64-bit) and x86 (32-bit) ZIP files. + ![image](gha-ci-summary.png)
+ * Scroll down at the bottom to find the sub-section "Artifacts". It should show you list of zips you can download
+ ![image](gha-ci-artifacts.png)
+ * Download the x64, x86 and ARM zip files. * For each architecture: * Extract the Zip file. (It will have a name like - "20190829.6_ICU4C_MSVC_x64_Release.zip"). + "icu4c.Win64.run_#104.zip"). * Navigate into the folder with the same name. - * Rename the file "icu-windows.zip" to the appropriate name: - * Ex: The x64 zip for version 64.1 was named - "icu4c-64_1-Win64-MSVC2017.zip" - * Ex: The x86 zip for version 64.1 was named - "icu4c-64_1-Win32-MSVC2017.zip" - * Note: Note: As of ICU 68, the pre-built binaries use MSVC2019 - instead of MSVC2017. + * Check and verify the names of the zip file are appropriate: + * Ex: The x64 zip for version 76.1 should be named + "icu4c-76_1-Win64-MSVC2022.zip" + * Ex: The x86 zip for version 76.1 should be named + "icu4c-76_1-Win32-MSVC2022.zip" * Note: For RC releases the name looked like this: - "icu4c-64rc-Win64-MSVC2017.zip" + "icu4c-76rc-Win64-MSVC2022" * ~~AIX Bin:~~ (AIX is broken and ignored for now.) * ~~login to gcc119.fsffrance.org and copy the ICU4C source archive created above to there.~~ @@ -360,7 +348,7 @@ run \`make dist\`. This step publishes pre-processed Unicode property data, which may be ingested by downstream clients such as ICU4X. * Using the output from the build bots: - * Navigate to the Azure Pipeline `C: Create Artifacts from icuexportdata` and download its single artifact (`icuexportdata_output`) + * Navigate to the GHA Workflow `icu4c-icuexportdata` and download the artifact (`icuexportdata_output`) from summary page * Unzip the file * Rename the `icuexportdata_tag-goes-here.zip` file to the correct tag (replacing slashes with dashes) diff --git a/docs/userguide/assets/gha_run_workflow.png b/docs/userguide/assets/gha_run_workflow.png new file mode 100644 index 000000000000..3923cf4fe674 Binary files /dev/null and b/docs/userguide/assets/gha_run_workflow.png differ diff --git a/docs/userguide/assets/gha_tab.png b/docs/userguide/assets/gha_tab.png new file mode 100644 index 000000000000..c8750967e947 Binary files /dev/null and b/docs/userguide/assets/gha_tab.png differ diff --git a/docs/userguide/dev/ci.md b/docs/userguide/dev/ci.md index f7c7490eac43..339a75f86fb3 100644 --- a/docs/userguide/dev/ci.md +++ b/docs/userguide/dev/ci.md @@ -30,10 +30,7 @@ ICU4J's unit tests in JUnit). ICU uses Continuous Integration systems to run these tests automatically for each new code contribution, and upon each update to a future contribution under development (that is: for each [successful Pull Request merge, and upon a new push of new git commits to a Pull Request](../gitdev.md)). -ICU has 2 systems configured to run Continuous Integration testing: - -* Github Actions -* Azure Pipelines +ICU has GitHub Actions configured to run Continuous Integration testing. Continuous Integration systems can also be used to regularly and automatically run other tasks besides testing. ICU uses a CI workflow to automatically publish changes to its User Guide that is hosted on Github Pages. @@ -121,70 +118,18 @@ the workflow will not run and Github is not capable of ignoring the check in tha Open Source users can now access machines with [at least 4 cores available per job](https://github.blog/2024-01-17-github-hosted-runners-double-the-power-for-open-source/). -## Azure Pipelines - -ICU also uses [Azure Pipelines](https://azure.microsoft.com/en-us/products/devops/pipelines) to run CI jobs. - -### Workflow files - -Workflow files are in YAML form stored at `.ci-builds/`. - -### UI Dashboard - -All Azure piplines show up in the -[Azure Piplines ICU project dashboard](https://dev.azure.com/ms/icu/), -specifically in the -[Pipelines page](https://dev.azure.com/ms/icu/_build). - -After clicking on a specific pipeline, -all of the instances/runs for that pipeline appear. -All of the runs can be filtered in the Branch filter by the destination branch name (ex: `main`) or the PR number (ex: `2874`). - -### Configuration - -#### Initial Setup with Github. - -The upstream Github repo needs to be connected to Azure Pipelines in order for Azure Pipelines to listen for and trigger new pipelines based on events occuring in Github, -and to return the status back to Github. -This configuration is started by ensuring that the upstream ICU repo `unicode-org/icu` has the Azure Pipelines 3rd party app installed from the Github Marketplace. - -Once installed, the app will appear in the repo's Github "Settings" page under "Integrations" > "Github Apps". - -In order to configure a newly pipeline in Azure using the Github app for Azure Pipelines, you must do: - -1. Create and check-in a new YAML file in the icu repo at `.ci-builds/` -2. In the repo settings, go to "Github Apps" -3. In the Installed GitHub Apps section, click option to configure "Azure Pipelines". -4. A page to update Azure Pipeline's repository access apears next. Click on "Update access". -5. Next a page to authenticate with your Microsoft credentials appear. Sign in with Microsoft credentials. -6. Select ADO org as `ms` and project as `icu`, click on continue. -7. After authentication from Azure and Github, you come to the new pipeline wizard. -8. Select repo as `unicode-org/icu` and select "Existing Azure Pipelines YAML file" and choose the yaml file created in step #1 -9. Review YAML file and click save. You will find a new pipeline created with name `unicode-org.icu`. Rename it to a more appropriate name - -***The pipline should now run as per the YAML rules and would be visible from Github settings for branch protection.*** - - -#### Jobs - -Jobs can be added, removed, and edited merely by editing the YAML workflow files. - -The syntax for Azure Pipelines workflows is very similar to Github Actions, including the YAML format. -However, there are noteworthy differences in functionality and the expression of equivalent configurations aross the systems and syntaxes. - -#### Conditional Triggers - -Conditional triggers can be configured for Azure Pipelines similarly to Github Actions. - -Note: The triggers for merges to a branch (ex: `main`) may need to be duplicated into a separate trigger section for Pull Requests because they seem to be handled differently. - -### Caveats - -In order to set up a pipeline, a person must simultaneously have access to the Azure Pipelines project for ICU and to the Github ICU repository. - -If an Azure Pipeline only has one job, -that job might not be shown on a PR's main page within the list of all of the running CI checks. -There will only be an entry with the pipeline name in the list of checks. -However, if an Azure Pipeline has multiple jobs, -then each of the constituent jobs of the pipeline will be represent in the list of checks, -in addition to an entry for the pipeline itself. \ No newline at end of file +### Exhaustive Tests +Exhaustive tests run tests on a larger, more complete dataset than the regular unit tests. +The larger dataset makes them run much longer than an individual unit test. +Thus, exhaustive tests are not run automatically on every PR. +They must pass before new versions of CLDR can be integrated into ICU, +which is a part of the release process. + +It may be desirable to run exhaustive tests manually on a PR for areas of code that are known to need the extra test coverage provided by exhaustive tests. +To trigger exhaustive tests manually: + +1. Go to your respective fork of the project (username/icu) if the PR is not already merged. Otherwise, go to https://github.com/unicode-org/icu +2. Select on the "Actions" tab from the top bar + ![GHA Actions](../assets/gha_tab.png) +3. On the left pane under All workflows, find "Exhaustive Tests for ICU" and click on run workflow, select branch and click 'Run workflow'. + ![Run Workflow](../assets/gha_run_workflow.png) diff --git a/docs/userguide/dev/gitdev.md b/docs/userguide/dev/gitdev.md index d9c4570a07c0..adf4805df299 100644 --- a/docs/userguide/dev/gitdev.md +++ b/docs/userguide/dev/gitdev.md @@ -591,16 +591,9 @@ Send the PR off for review. As in the Easy Way, **you should use the MERGE COMMI ## Requesting an Exhaustive Test run on a Pull-Request (PR) -The ICU4C and ICU4J Exhaustive Tests run on the main branch after a pull-request -has been submitted. They do not run on pull-requests by default as they take 1-2 -hours to run. +The ICU4C and ICU4J Exhaustive Tests run on the main branch periodically once +every Saturday (at 4:00 AM UTC) and post merging on the maintenance branches. +They do not run on pull-requests by default as they take 1-2 hours to run. -However, you can manually request the CI builds to run the exhaustive tests on a -PR by commenting with the following text: - -``` -/azp run CI-Exhaustive -``` - -This will trigger the test run on the PR. This is covered more in a separate -[document](https://docs.google.com/document/d/1kmcFFUozpWah_y7dk_Inlw_BIq3vG3-ZR2A28tIiXJc/edit?usp=sharing). +However, you can manually request the CI builds to run the exhaustive tests. +See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustive-tests).