From 670fcad66ce4d613af14e198b2da1ba18395fb66 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Sun, 7 Jul 2024 22:00:56 -0500 Subject: [PATCH] [ci] restore aarch64 linux builds (fixes #6509) --- .appveyor.yml | 42 ---- .ci/test.sh | 6 - .github/workflows/cuda.yml | 135 ------------ .github/workflows/python_package.yml | 64 +++++- .github/workflows/r_package.yml | 316 --------------------------- .vsts-ci.yml | 66 ------ 6 files changed, 52 insertions(+), 577 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .github/workflows/cuda.yml delete mode 100644 .github/workflows/r_package.yml diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index aae1c3a074fd..000000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,42 +0,0 @@ -version: 4.4.0.99.{build} - -image: Visual Studio 2015 -platform: x64 -configuration: - - '3.8' - -# only build on 'master' and pull requests targeting it -branches: - only: - - master - -environment: - matrix: - - COMPILER: MSVC - TASK: python - - COMPILER: MINGW - TASK: python - -clone_depth: 5 - -install: - - git submodule update --init --recursive # get `external_libs` folder - - set PATH=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;%PATH% - - set PYTHON_VERSION=%CONFIGURATION% - - ps: | - $env:ALLOW_SKIP_ARROW_TESTS = "1" - $env:APPVEYOR = "true" - $env:CMAKE_BUILD_PARALLEL_LEVEL = 4 - $env:MINICONDA = "C:\Miniconda3-x64" - $env:PATH = "$env:MINICONDA;$env:MINICONDA\Scripts;$env:PATH" - $env:BUILD_SOURCESDIRECTORY = "$env:APPVEYOR_BUILD_FOLDER" - -build: false - -test_script: - - conda config --remove channels defaults - - conda config --add channels nodefaults - - conda config --add channels conda-forge - - conda config --set channel_priority strict - - conda init powershell - - powershell.exe -ExecutionPolicy Bypass -File %APPVEYOR_BUILD_FOLDER%\.ci\test_windows.ps1 diff --git a/.ci/test.sh b/.ci/test.sh index 6e862ba0248f..7e1a9577728d 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -191,12 +191,6 @@ elif [[ $TASK == "bdist" ]]; then PLATFORM="manylinux2014_$ARCH" fi sh ./build-python.sh bdist_wheel --integrated-opencl || exit 1 - mv \ - ./dist/*.whl \ - ./dist/tmp.whl || exit 1 - mv \ - ./dist/tmp.whl \ - ./dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl || exit 1 sh .ci/check_python_dists.sh ./dist || exit 1 if [[ $PRODUCES_ARTIFACTS == "true" ]]; then cp dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1 diff --git a/.github/workflows/cuda.yml b/.github/workflows/cuda.yml deleted file mode 100644 index 735bcef4a0d7..000000000000 --- a/.github/workflows/cuda.yml +++ /dev/null @@ -1,135 +0,0 @@ -name: CUDA Version - -on: - push: - branches: - - master - pull_request: - branches: - - master - # Run manually by clicking a button in the UI - workflow_dispatch: - inputs: - restart_docker: - description: 'Restart nvidia-docker on the runner before building?' - required: true - type: boolean - default: false - -# automatically cancel in-progress builds if another commit is pushed -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - # Optionally reinstall + restart docker on the runner before building. - # This is safe as long as only 1 of these jobs runs at a time. - restart-docker: - name: set up docker - runs-on: [self-hosted, linux] - timeout-minutes: 30 - steps: - - name: Setup or update software on host machine - if: ${{ inputs.restart_docker }} - run: | - # install core packages - sudo apt-get update - sudo apt-get install --no-install-recommends -y \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg-agent \ - lsb-release \ - software-properties-common - # set up nvidia-docker - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" -y - curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - - curl -sL https://nvidia.github.io/nvidia-docker/$(. /etc/os-release;echo $ID$VERSION_ID)/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list - sudo apt-get update - sudo apt-get install --no-install-recommends -y \ - containerd.io \ - docker-ce \ - docker-ce-cli \ - nvidia-docker2 - sudo chmod a+rw /var/run/docker.sock - sudo systemctl restart docker - - name: mark job successful - run: | - exit 0 - test: - name: ${{ matrix.task }} ${{ matrix.cuda_version }} ${{ matrix.method }} (${{ matrix.linux_version }}, ${{ matrix.compiler }}, Python ${{ matrix.python_version }}) - runs-on: [self-hosted, linux] - needs: [restart-docker] - container: - image: nvcr.io/nvidia/cuda:${{ matrix.cuda_version }}-devel-${{ matrix.linux_version }} - env: - CMAKE_BUILD_PARALLEL_LEVEL: 4 - COMPILER: ${{ matrix.compiler }} - CONDA: /tmp/miniforge - DEBIAN_FRONTEND: noninteractive - METHOD: ${{ matrix.method }} - OS_NAME: linux - PYTHON_VERSION: ${{ matrix.python_version }} - TASK: ${{ matrix.task }} - SKBUILD_STRICT_CONFIG: true - options: --gpus all - timeout-minutes: 30 - strategy: - fail-fast: false - matrix: - include: - - method: wheel - compiler: gcc - python_version: "3.10" - cuda_version: "11.8.0" - linux_version: "ubuntu20.04" - task: cuda - - method: source - compiler: gcc - python_version: "3.12" - cuda_version: "12.2.0" - linux_version: "ubuntu22.04" - task: cuda - - method: pip - compiler: clang - python_version: "3.11" - cuda_version: "11.8.0" - linux_version: "ubuntu20.04" - task: cuda - steps: - - name: Install latest git - run: | - apt-get update - apt-get install --no-install-recommends -y \ - ca-certificates \ - software-properties-common - add-apt-repository ppa:git-core/ppa -y - apt-get update - apt-get install --no-install-recommends -y \ - git - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 5 - submodules: true - - name: Setup and run tests - run: | - export BUILD_DIRECTORY="$GITHUB_WORKSPACE" - export PATH=$CONDA/bin:$PATH - - # check GPU usage - nvidia-smi - - # build and test - $GITHUB_WORKSPACE/.ci/setup.sh - $GITHUB_WORKSPACE/.ci/test.sh - all-cuda-jobs-successful: - if: always() - runs-on: ubuntu-latest - needs: [test] - steps: - - name: Note that all tests succeeded - uses: re-actors/alls-green@v1.2.2 - with: - jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/python_package.yml b/.github/workflows/python_package.yml index cd16696336c7..1e559cfe9342 100644 --- a/.github/workflows/python_package.yml +++ b/.github/workflows/python_package.yml @@ -18,6 +18,7 @@ env: SKBUILD_STRICT_CONFIG: true jobs: + # purpose: test different Python package variants (build options, compiler, Python version) test: name: ${{ matrix.task }} ${{ matrix.method }} (${{ matrix.os }}, Python ${{ matrix.python_version }}) runs-on: ${{ matrix.os }} @@ -38,10 +39,6 @@ jobs: - os: macos-13 task: if-else python_version: '3.9' - - os: macos-14 - task: bdist - method: wheel - python_version: '3.10' # We're currently skipping MPI jobs on macOS, see https://github.com/microsoft/LightGBM/pull/6425 # for further details. # - os: macos-13 @@ -68,16 +65,56 @@ jobs: export TASK="${{ matrix.task }}" export METHOD="${{ matrix.method }}" export PYTHON_VERSION="${{ matrix.python_version }}" - if [[ "${{ matrix.os }}" == "macos-14" ]]; then + export COMPILER="gcc" + export OS_NAME="macos" + export BUILD_DIRECTORY="$GITHUB_WORKSPACE" + export CONDA=${HOME}/miniforge + export PATH=${CONDA}/bin:${PATH} + $GITHUB_WORKSPACE/.ci/setup.sh || exit 1 + $GITHUB_WORKSPACE/.ci/test.sh || exit 1 + # purpose: build macOS wheels to release + build-and-test-wheels: + name: ${{ matrix.task }} (${{ matrix.artifact-name }}, Python ${{ matrix.python_version }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + include: + - os: macos-14 + task: bdist + method: wheel + python_version: '3.10' + container: null + artifact-name: macosx-arm64-wheel + - os: macos-14 + task: bdist + method: wheel + python_version: '3.10' + container: "lightgbm/vsts-agent:manylinux2014_aarch64" + artifact-name: linux-aarch64-wheel + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 5 + submodules: true + - name: Setup and run tests + shell: bash + run: | + export TASK="${{ matrix.task }}" + export METHOD="${{ matrix.method }}" + export PYTHON_VERSION="${{ matrix.python_version }}" + if [[ "${{ matrix.artifact-name }}" == "macosx-arm64-wheel" ]]; then # use clang when creating macOS release artifacts export COMPILER="clang" export OS_NAME="macos" - elif [[ "${{ matrix.os }}" == "macos-13" ]]; then + elif [[ "${{ matrix.artifact-name }}" == "linux-aarch64-wheel" ]]; then export COMPILER="gcc" - export OS_NAME="macos" - elif [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then - export COMPILER="clang" export OS_NAME="linux" + else + echo "Unrecognized artifact name: '${{ matrix.artifact-name }}'" + exit 1 fi export BUILD_DIRECTORY="$GITHUB_WORKSPACE" export CONDA=${HOME}/miniforge @@ -85,11 +122,12 @@ jobs: $GITHUB_WORKSPACE/.ci/setup.sh || exit 1 $GITHUB_WORKSPACE/.ci/test.sh || exit 1 - name: upload wheels - if: ${{ matrix.method == 'wheel' && matrix.os == 'macos-14' }} uses: actions/upload-artifact@v4 with: - name: macosx-arm64-wheel + name: ${{ matrix.artifact-name }} path: dist/*.whl + # purpose: test the Python package against nightlies of its dependencies, + # to catch issues before users experience them test-latest-versions: name: Python - latest versions (ubuntu-latest) runs-on: ubuntu-latest @@ -117,6 +155,8 @@ jobs: -w /opt/lgb-build \ python:3.11 \ /bin/bash ./.ci/test-python-latest.sh + # purpose: test the Python package against the oldest supported versions of its dependencies, + # to prevent changes from accidentally breaking compatibility with those older versions test-oldest-versions: name: Python - oldest supported versions (ubuntu-latest) runs-on: ubuntu-latest @@ -147,7 +187,7 @@ jobs: all-python-package-jobs-successful: if: always() runs-on: ubuntu-latest - needs: [test, test-latest-versions, test-oldest-versions] + needs: [test, build-and-test-wheels, test-latest-versions, test-oldest-versions] steps: - name: Note that all tests succeeded uses: re-actors/alls-green@v1.2.2 diff --git a/.github/workflows/r_package.yml b/.github/workflows/r_package.yml deleted file mode 100644 index 3bcbf7ea4f79..000000000000 --- a/.github/workflows/r_package.yml +++ /dev/null @@ -1,316 +0,0 @@ -name: R-package - -on: - push: - branches: - - master - pull_request: - branches: - - master - -# automatically cancel in-progress builds if another commit is pushed -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - # https://github.com/actions/checkout/issues/1590#issuecomment-2207052044 - # - # this could be removed (hopefully) when R 3.6 support is removed - ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true - CMAKE_BUILD_PARALLEL_LEVEL: 4 - # hack to get around this: - # https://stat.ethz.ch/pipermail/r-package-devel/2020q3/005930.html - _R_CHECK_SYSTEM_CLOCK_: 0 - # ignore R CMD CHECK NOTE checking how long it has - # been since the last submission - _R_CHECK_CRAN_INCOMING_REMOTE_: 0 - # CRAN ignores the "installed size is too large" NOTE, - # so our CI can too. Setting to a large value here just - # to catch extreme problems - _R_CHECK_PKG_SIZES_THRESHOLD_: 100 - -jobs: - test: - name: ${{ matrix.task }} (${{ matrix.os }}, ${{ matrix.compiler }}, R ${{ matrix.r_version }}, ${{ matrix.build_type }}) - runs-on: ${{ matrix.os }} - container: ${{ matrix.container }} - timeout-minutes: 60 - strategy: - fail-fast: false - matrix: - include: - ################ - # CMake builds # - ################ - - os: ubuntu-latest - task: r-package - compiler: gcc - r_version: 3.6 - build_type: cmake - container: 'ubuntu:18.04' - - os: ubuntu-latest - task: r-package - compiler: gcc - r_version: 4.3 - build_type: cmake - container: 'ubuntu:22.04' - - os: ubuntu-latest - task: r-package - compiler: clang - r_version: 3.6 - build_type: cmake - container: 'ubuntu:18.04' - - os: ubuntu-latest - task: r-package - compiler: clang - r_version: 4.3 - build_type: cmake - container: 'ubuntu:22.04' - - os: macos-13 - task: r-package - compiler: gcc - r_version: 4.3 - build_type: cmake - container: null - - os: macos-13 - task: r-package - compiler: clang - r_version: 4.3 - build_type: cmake - container: null - - os: windows-latest - task: r-package - compiler: MINGW - toolchain: MINGW - r_version: 3.6 - build_type: cmake - container: null - - os: windows-latest - task: r-package - compiler: MINGW - toolchain: MSYS - r_version: 4.3 - build_type: cmake - container: null - # Visual Studio 2019 - - os: windows-2019 - task: r-package - compiler: MSVC - toolchain: MSVC - r_version: 3.6 - build_type: cmake - container: null - # Visual Studio 2022 - - os: windows-2022 - task: r-package - compiler: MSVC - toolchain: MSVC - r_version: 4.3 - build_type: cmake - container: null - ############### - # CRAN builds # - ############### - - os: windows-latest - task: r-package - compiler: MINGW - toolchain: MINGW - r_version: 3.6 - build_type: cran - container: null - - os: windows-latest - task: r-package - compiler: MINGW - toolchain: MSYS - r_version: 4.3 - build_type: cran - container: null - - os: ubuntu-latest - task: r-package - compiler: gcc - r_version: 4.3 - build_type: cran - container: 'ubuntu:22.04' - - os: macos-13 - task: r-package - compiler: clang - r_version: 4.3 - build_type: cran - container: null - steps: - - name: Prevent conversion of line endings on Windows - if: startsWith(matrix.os, 'windows') - shell: pwsh - run: git config --global core.autocrlf false - - name: Install packages used by third-party actions - if: startsWith(matrix.os, 'ubuntu') - shell: bash - run: | - apt-get update -y - apt-get install --no-install-recommends -y \ - ca-certificates \ - dirmngr \ - gpg \ - gpg-agent \ - software-properties-common \ - sudo - # install newest version of git - # ref: - # - https://unix.stackexchange.com/a/170831/550004 - # - https://git-scm.com/download/linux - add-apt-repository ppa:git-core/ppa -y - apt-get update -y - apt-get install --no-install-recommends -y \ - git - - name: Trust git cloning LightGBM - if: startsWith(matrix.os, 'ubuntu') - run: | - git config --global --add safe.directory "${GITHUB_WORKSPACE}" - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 5 - submodules: true - - name: Install pandoc - uses: r-lib/actions/setup-pandoc@v2 - if: matrix.container != 'ubuntu:18.04' - # R 3.6 binary isn't easily available on buntu 18.04, - # but setup-pandoc>=2.7.1 is uses a too-new glibc for it. - # ref: https://github.com/microsoft/LightGBM/issues/6298 - - name: Install pandoc - uses: r-lib/actions/setup-pandoc@v2.6.0 - if: matrix.container == 'ubuntu:18.04' - - name: install tinytex - if: startsWith(matrix.os, 'windows') - uses: r-lib/actions/setup-tinytex@v2 - env: - CTAN_MIRROR: https://ctan.math.illinois.edu/systems/win32/miktex - TINYTEX_INSTALLER: TinyTeX - - name: Setup and run tests on Linux and macOS - if: matrix.os == 'macos-13' || matrix.os == 'ubuntu-latest' - shell: bash - run: | - export TASK="${{ matrix.task }}" - export COMPILER="${{ matrix.compiler }}" - if [[ "${{ matrix.os }}" == "macos-13" ]]; then - export OS_NAME="macos" - elif [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then - export OS_NAME="linux" - export IN_UBUNTU_BASE_CONTAINER="true" - # the default version of cmake provided on Ubuntu 18.04 (v3.10.2), is not supported by LightGBM - # see https://github.com/microsoft/LightGBM/issues/5642 - if [[ "${{ matrix.container }}" == "ubuntu:18.04" ]]; then - export INSTALL_CMAKE_FROM_RELEASES="true" - fi - fi - export BUILD_DIRECTORY="$GITHUB_WORKSPACE" - export R_VERSION="${{ matrix.r_version }}" - export R_BUILD_TYPE="${{ matrix.build_type }}" - $GITHUB_WORKSPACE/.ci/setup.sh - $GITHUB_WORKSPACE/.ci/test.sh - - name: Setup and run tests on Windows - if: startsWith(matrix.os, 'windows') - shell: pwsh -command ". {0}" - run: | - $env:BUILD_SOURCESDIRECTORY = $env:GITHUB_WORKSPACE - $env:LGB_VER = (Get-Content -TotalCount 1 $env:BUILD_SOURCESDIRECTORY\VERSION.txt).trim().replace('rc', '-') - $env:TOOLCHAIN = "${{ matrix.toolchain }}" - $env:R_VERSION = "${{ matrix.r_version }}" - $env:R_BUILD_TYPE = "${{ matrix.build_type }}" - $env:COMPILER = "${{ matrix.compiler }}" - $env:TASK = "${{ matrix.task }}" - & "$env:GITHUB_WORKSPACE/.ci/test_windows.ps1" - test-r-sanitizers: - name: r-sanitizers (ubuntu-latest, R-devel, ${{ matrix.compiler }} ASAN/UBSAN) - timeout-minutes: 60 - runs-on: ubuntu-latest - container: wch1/r-debug - strategy: - fail-fast: false - matrix: - include: - - r_customization: san - compiler: gcc - - r_customization: csan - compiler: clang - steps: - - name: Trust git cloning LightGBM - run: | - git config --global --add safe.directory "${GITHUB_WORKSPACE}" - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 5 - submodules: true - - name: Install packages - shell: bash - run: | - RDscript${{ matrix.r_customization }} -e "install.packages(c('R6', 'data.table', 'jsonlite', 'knitr', 'markdown', 'Matrix', 'RhpcBLASctl', 'testthat'), repos = 'https://cran.rstudio.com', Ncpus = parallel::detectCores())" - sh build-cran-package.sh --r-executable=RD${{ matrix.r_customization }} - RD${{ matrix.r_customization }} CMD INSTALL lightgbm_*.tar.gz || exit 1 - - name: Run tests with sanitizers - shell: bash - run: | - cd R-package/tests - exit_code=0 - RDscript${{ matrix.r_customization }} testthat.R >> tests.log 2>&1 || exit_code=-1 - cat ./tests.log - exit ${exit_code} - test-r-debian-clang: - name: r-package (debian, R-devel, clang-${{ matrix.clang-version }}) - timeout-minutes: 60 - strategy: - fail-fast: false - matrix: - # list of versions tested in CRAN "Additional Checks": - # https://cran.r-project.org/web/checks/check_issue_kinds.html - clang-version: - - 16 - - 17 - runs-on: ubuntu-latest - container: rhub/debian-clang-devel - env: - DEBIAN_FRONTEND: noninteractive - steps: - - name: Install Git before checkout - shell: bash - run: | - apt-get update --allow-releaseinfo-change - apt-get install --no-install-recommends -y git - - name: Trust git cloning LightGBM - run: | - git config --global --add safe.directory "${GITHUB_WORKSPACE}" - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 5 - submodules: true - - name: install clang - run: | - ./.ci/install-clang-devel.sh ${{ matrix.clang-version }} - - name: Install packages and run tests - shell: bash - run: | - export PATH=/opt/R-devel/bin/:${PATH} - Rscript -e "install.packages(c('R6', 'data.table', 'jsonlite', 'knitr', 'markdown', 'Matrix', 'RhpcBLASctl', 'testthat'), repos = 'https://cran.rstudio.com', Ncpus = parallel::detectCores())" - sh build-cran-package.sh - R CMD check --as-cran --run-donttest lightgbm_*.tar.gz || exit 1 - echo "" - echo "install logs:" - echo "" - cat lightgbm.Rcheck/00install.out - echo "" - if grep -q -E "NOTE|WARNING|ERROR" lightgbm.Rcheck/00check.log; then - echo "NOTEs, WARNINGs, or ERRORs have been found by R CMD check" - exit 1 - fi - all-r-package-jobs-successful: - if: always() - runs-on: ubuntu-latest - needs: [test, test-r-sanitizers, test-r-debian-clang] - steps: - - name: Note that all tests succeeded - uses: re-actors/alls-green@v1.2.2 - with: - jobs: ${{ toJSON(needs) }} diff --git a/.vsts-ci.yml b/.vsts-ci.yml index 4c0f80eb8c02..073a00af3f35 100644 --- a/.vsts-ci.yml +++ b/.vsts-ci.yml @@ -182,71 +182,6 @@ jobs: inputs: filePath: $(Build.SourcesDirectory)/.ci/test.sh targetType: 'filePath' -# ########################################### -# - job: QEMU_multiarch -# ########################################### -# variables: -# BUILD_DIRECTORY: /LightGBM -# COMPILER: gcc -# PRODUCES_ARTIFACTS: 'true' -# pool: -# vmImage: ubuntu-22.04 -# timeoutInMinutes: 180 -# strategy: -# matrix: -# bdist: -# TASK: bdist -# ARCH: aarch64 -# steps: -# - script: | -# sudo apt-get update -# sudo apt-get install --no-install-recommends -y \ -# binfmt-support \ -# qemu \ -# qemu-user \ -# qemu-user-static -# displayName: 'Install QEMU' -# - script: | -# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -# displayName: 'Enable Docker multi-architecture support' -# - script: | -# git clean -d -f -x -# displayName: 'Clean source directory' -# - script: | -# cat > docker-script.sh <