diff --git a/.github/workflows/sycl-linux-run-tests.yml b/.github/workflows/sycl-linux-run-tests.yml index 29626d7e6a96..d77be16d2227 100644 --- a/.github/workflows/sycl-linux-run-tests.yml +++ b/.github/workflows/sycl-linux-run-tests.yml @@ -37,7 +37,7 @@ on: repo_ref: type: string - required: True + required: False description: | Commit SHA or branch to checkout the intel/llvm repo. tests_ref: @@ -60,9 +60,10 @@ on: e2e_binaries_artifact: description: | - Must be set if `e2e_testing_mode` is equal to `run-only` and the - artifact must exist. Can be set in other modes resulting in artifact - upload. + When set in modes other than `run-only` results in artifact upload. + For `run-only` mode, if specified, means downloading pre-built + binaries from the artifact, otherwise they are expected to be part of + the container. type: string default: '' required: False @@ -156,6 +157,7 @@ on: type: choice options: - 'ghcr.io/intel/llvm/sycl_ubuntu2404_nightly:latest' + - 'ghcr.io/intel/llvm/sycl_prebuilt_tests:sycl-rel-6_2' - 'ghcr.io/intel/llvm/ubuntu2404_intel_drivers:alldeps' image_options: description: | @@ -205,6 +207,7 @@ on: options: - "full" - "build-only" + - "run-only" permissions: contents: read diff --git a/.github/workflows/sycl-prebuilt-e2e-container.yml b/.github/workflows/sycl-prebuilt-e2e-container.yml new file mode 100644 index 000000000000..0d9cfdcdd337 --- /dev/null +++ b/.github/workflows/sycl-prebuilt-e2e-container.yml @@ -0,0 +1,118 @@ +name: Create container with pre-built tests + +# The purpose of this is to build E2E tests with the latest release toolchain +# and then run them with the trunk SYCL RT (libsycl.so and friends) to verify +# that ABI compatibility hasn't been broken. + +on: + workflow_dispatch: + inputs: + ref: + type: string + description: tag/sha + required: true + default: + + push: + branches: + - sycl-rel-** + +permissions: read-all + +jobs: + build: + uses: ./.github/workflows/sycl-linux-build.yml + with: + build_ref: ${{ inputs.ref || github.sha }} + build_cache_root: "/__w/" + + build_image: "ghcr.io/intel/llvm/sycl_ubuntu2404_nightly:latest" + cc: clang + cxx: clang++ + + changes: '[]' + + toolchain_artifact: toolchain + toolchain_artifact_filename: toolchain.tar.zst + e2e_binaries_artifact: e2e_bin + + # Couldn't make it work from inside the container, so have to use an extra job + # and pass an artifact. + docker: + runs-on: [Linux, build] + needs: build + permissions: + packages: write + if: always() + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + devops/ + + - name: Checkout E2E tests + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.sha }} + path: llvm + sparse-checkout: | + llvm/utils/lit + sycl/test-e2e + - name: Pack sources + run: | + tar -I 'zstd -9' -cf devops/e2e_sources.tar.zst -C ./llvm . + + - name: Download toolchain + uses: actions/download-artifact@v4 + with: + name: toolchain + path: devops/ + - name: Download E2E binaries + uses: actions/download-artifact@v4 + with: + name: e2e_bin + path: devops/ + + + - name: Build container + uses: ./devops/actions/build_container + with: + push: true + file: release_tests_binaries + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + tags: | + ghcr.io/${{ github.repository }}/sycl_prebuilt_tests:${{ inputs.ref || github.ref_name }} + + run-e2e: + # Ensure those tests can actually pass with the toolchain they were built + # with, otherwise testing compatibility with those binaries is pointless. + # This job should be aligned with how the image will be used in trunk CI. + # + # I'll start with just a single configuration, but this might be extended + # with a matrix in future (e.g., to run on cpu/CUDA/AMDGPU). + name: Run E2E tests with SYCL RT they were built with + runs-on: [Linux, pvc] + needs: [docker, build] + if: ${{ always() && !cancelled() && needs.build.outputs.build_conclusion == 'success' }} + container: + image: ghcr.io/${{ github.repository }}/sycl_prebuilt_tests:${{ inputs.ref || github.ref_name }} + options: -u 1001 --device=/dev/dri -v /dev/dri/by-path:/dev/dri/by-path --privileged --cap-add SYS_ADMIN + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + devops + - run: | + mkdir toolchain + tar -I 'zstd' -xf /sycl-prebuilt/toolchain.tar.zst -C toolchain + echo LD_LIBRARY_PATH=$PWD/toolchain/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV + echo PATH=$PWD/toolchain/bin:$PATH >> $GITHUB_ENV + - run: | + sycl-ls + - name: Run E2E tests + uses: ./devops/actions/run-tests/e2e + timeout-minutes: 20 + with: + testing_mode: run-only + target_devices: level_zero:gpu diff --git a/devops/actions/run-tests/e2e/action.yml b/devops/actions/run-tests/e2e/action.yml index e50276904995..1457bbe264c2 100644 --- a/devops/actions/run-tests/e2e/action.yml +++ b/devops/actions/run-tests/e2e/action.yml @@ -24,6 +24,7 @@ runs: using: "composite" steps: - name: Checkout E2E tests + if: ${{ !(inputs.testing_mode == 'run-only' && inputs.binaries_artifact == '') }} uses: actions/checkout@v4 with: path: llvm @@ -31,19 +32,26 @@ runs: sparse-checkout: | llvm/utils/lit sycl/test-e2e - - name: Download E2E Binaries - if: inputs.testing_mode == 'run-only' + if: ${{ inputs.testing_mode == 'run-only' && inputs.binaries_artifact != '' }} uses: actions/download-artifact@v4 with: name: ${{ inputs.binaries_artifact }} - name: Extract E2E Binaries - if: inputs.testing_mode == 'run-only' + if: ${{ inputs.testing_mode == 'run-only' && inputs.binaries_artifact != '' }} shell: bash run: | mkdir build-e2e tar -I 'zstd' -xf e2e_binaries.tar.zst -C build-e2e + - name: Extract E2E tests from container image + if: ${{ inputs.testing_mode == 'run-only' && inputs.binaries_artifact == '' }} + shell: bash + run: | + mkdir build-e2e llvm + tar -I 'zstd' -xf /sycl-prebuilt/e2e_binaries.tar.zst -C build-e2e + tar -I 'zstd' -xf /sycl-prebuilt/e2e_sources.tar.zst -C llvm + - name: Deduce E2E CMake options if: inputs.testing_mode != 'run-only' id: cmake_opts diff --git a/devops/containers/release_tests_binaries.Dockerfile b/devops/containers/release_tests_binaries.Dockerfile new file mode 100644 index 000000000000..5c6e32718168 --- /dev/null +++ b/devops/containers/release_tests_binaries.Dockerfile @@ -0,0 +1,28 @@ +ARG base_tag=alldeps +ARG base_image=ghcr.io/intel/llvm/ubuntu2404_intel_drivers + +FROM $base_image:$base_tag + +# Actual CI maps volumes via something like "/runner/host/path":"/__w/", so +# these won't be visible there. They can be used when manually reproducing +# issues though. Path `/__w/llvm/llvm` is the property of Github Actions and +# when CMake configures E2E tests this path is hardcoded in both CMake files and +# e2e binaries themselve. As such, it's useful to have these in the image for +# local manual experiments. +# +# One can map volumes as "/host/system/new/toolchain":"/__w/llvm/llvm/toolchain" +# to override the toolchain in order to run the tests with local SYCL RT instead +# of using the release RT included in this image. +ADD --chown=sycl:sycl toolchain.tar.zst /__w/llvm/llvm/toolchain +ADD --chown=sycl:sycl e2e_binaries.tar.zst /__w/llvm/llvm/build-e2e +ADD --chown=sycl:sycl e2e_sources.tar.zst /__w/llvm/llvm/llvm + +# Since `/__w/llvm/llvm` above is overriden by GHA, need to provide the +# following for using in CI: +COPY e2e_binaries.tar.zst /sycl-prebuilt/ +COPY e2e_sources.tar.zst /sycl-prebuilt/ +COPY toolchain.tar.zst /sycl-prebuilt/ + +COPY scripts/drivers_entrypoint.sh /drivers_entrypoint.sh + +USER sycl