name: CI Checks permissions: contents: read on: pull_request: types: - opened - synchronize - reopened # When a PR is closed, we still start this workflow, but then skip # all the jobs, which makes it effectively a no-op. The reason to # do this is that it allows us to take advantage of concurrency groups # to cancel in progress CI jobs whenever the PR is closed. - closed push: branches: - 'release/**' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true jobs: premerge-checks-linux: name: Build and Test Linux${{ (startsWith(matrix.runs-on, 'depot-ubuntu-24.04-arm') && ' AArch64') || '' }} if: >- github.repository_owner == 'llvm' && (github.event_name != 'pull_request' || github.event.action != 'closed') strategy: fail-fast: false matrix: runs-on: - depot-ubuntu-24.04-arm-16 - llvm-premerge-linux-runners runs-on: ${{ matrix.runs-on }} container: # The llvm-premerge agents are already containers and running the # this same image, so we can't use a container for the github action # job. The depot containers are running on VMs, so we can use a # container. This helps ensure the build environment is as close # as possible on both the depot runners and the llvm-premerge runners. image: ${{ (startsWith(matrix.runs-on, 'depot-ubuntu-24.04-arm') && format('ghcr.io/{0}/arm64v8/ci-ubuntu-24.04',github.repository_owner) ) || null }} # --privileged is needed to run the lldb tests that disable aslr. # The SCCACHE environment variables are need to be copied from the host # to the container to make sure it is configured correctly to use the # depot cache. options: >- --privileged --env SCCACHE_WEBDAV_ENDPOINT --env SCCACHE_WEBDAV_TOKEN defaults: run: # The run step defaults to using sh as the shell when running in a # container, so make bash the default to ensure consistency between # container and non-container jobs. shell: bash steps: - name: Checkout LLVM uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false fetch-depth: 2 - name: Build and Test timeout-minutes: 120 env: GITHUB_TOKEN: ${{ github.token }} GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} run: | git config --global --add safe.directory '*' source <(git diff --name-only HEAD~1...HEAD | python3 .ci/compute_projects.py) if [[ "${projects_to_build}" == "" ]]; then echo "No projects to build" exit 0 fi echo "Building projects: ${projects_to_build}" echo "Running project checks targets: ${project_check_targets}" echo "Building runtimes: ${runtimes_to_build}" echo "Running runtimes checks targets: ${runtimes_check_targets}" echo "Running runtimes checks requiring reconfiguring targets: ${runtimes_check_targets_needs_reconfig}" export CC=/opt/llvm/bin/clang export CXX=/opt/llvm/bin/clang++ # The linux-premerge runners are hosted on GCP and have a different # cache setup than the depot runners. if [[ "${{ matrix.runs-on }}" = "llvm-premerge-linux-runners" ]]; then # This environment variable is passes into the container through the # runner pod definition. This differs between our two clusters which # why we do not hardcode it. export SCCACHE_GCS_BUCKET=$CACHE_GCS_BUCKET export SCCACHE_GCS_RW_MODE=READ_WRITE fi env # Set the idle timeout to zero to ensure sccache runs for the # entire duration of the job. Otherwise it might stop if we run # several test suites in a row and discard statistics that we want # to save in the end. export SCCACHE_IDLE_TIMEOUT=0 mkdir artifacts SCCACHE_LOG=info SCCACHE_ERROR_LOG=$(pwd)/artifacts/sccache.log sccache --start-server ./.ci/monolithic-linux.sh "${projects_to_build}" "${project_check_targets}" "${runtimes_to_build}" "${runtimes_check_targets}" "${runtimes_check_targets_needs_reconfig}" "${enable_cir}" - name: Upload Artifacts # In some cases, Github will fail to upload the artifact. We want to # continue anyways as a failed artifact upload is an infra failure, not # a checks failure. # https://github.com/actions/upload-artifact/issues/569 continue-on-error: true if: '!cancelled()' uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: Premerge Artifacts (Linux ${{ runner.arch }}) path: artifacts/ retention-days: 5 include-hidden-files: 'true' - name: Upload Comment uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: ${{ always() && !startsWith(matrix.runs-on, 'depot-ubuntu-24.04-arm') }} continue-on-error: true with: name: workflow-args-x86-linux path: | comments-Linux-x86_64 premerge-checks-windows: name: Build and Test Windows if: >- github.repository_owner == 'llvm' && (github.event_name != 'pull_request' || github.event.action != 'closed') runs-on: llvm-premerge-windows-2022-runners defaults: run: shell: bash steps: - name: Checkout LLVM uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false fetch-depth: 2 - name: Compute Projects id: vars run: | source <(git diff --name-only HEAD~1...HEAD | python .ci/compute_projects.py) if [[ "${projects_to_build}" == "" ]]; then echo "No projects to build" fi echo "Building projects: ${projects_to_build}" echo "Running project checks targets: ${project_check_targets}" echo "Building runtimes: ${runtimes_to_build}" echo "Running runtimes checks targets: ${runtimes_check_targets}" echo "windows-projects=${projects_to_build}" >> $GITHUB_OUTPUT echo "windows-check-targets=${project_check_targets}" >> $GITHUB_OUTPUT echo "windows-runtimes=${runtimes_to_build}" >> $GITHUB_OUTPUT echo "windows-runtimes-check-targets=${runtimes_check_targets}" >> $GITHUB_OUTPUT - name: Build and Test timeout-minutes: 180 if: ${{ steps.vars.outputs.windows-projects != '' }} shell: cmd env: GITHUB_TOKEN: ${{ github.token }} GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} run: | call C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat -arch=amd64 -host_arch=amd64 # See the comments above in the Linux job for why we define each of # these environment variables. bash -c "export SCCACHE_GCS_BUCKET=$CACHE_GCS_BUCKET; export SCCACHE_GCS_RW_MODE=READ_WRITE; export SCCACHE_IDLE_TIMEOUT=0; mkdir artifacts; SCCACHE_LOG=info SCCACHE_ERROR_LOG=$(pwd)/artifacts/sccache.log sccache --start-server; .ci/monolithic-windows.sh \"${{ steps.vars.outputs.windows-projects }}\" \"${{ steps.vars.outputs.windows-check-targets }}\" \"${{ steps.vars.outputs.windows-runtimes }}\" \"${{ steps.vars.outputs.windows-runtimes-check-targets }}\"" - name: Upload Artifacts # In some cases, Github will fail to upload the artifact. We want to # continue anyways as a failed artifact upload is an infra failure, not # a checks failure. # https://github.com/actions/upload-artifact/issues/569 continue-on-error: true if: '!cancelled()' uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: Premerge Artifacts (Windows) path: artifacts/ retention-days: 5 include-hidden-files: 'true' - name: Upload Comment uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() continue-on-error: true with: name: workflow-args-windows path: | comments-Windows-AMD64 premerge-check-macos: name: MacOS Premerge Checks runs-on: macos-14 if: >- github.repository_owner == 'llvm' && (startswith(github.ref_name, 'release/') || startswith(github.base_ref, 'release/')) && (github.event_name != 'pull_request' || github.event.action != 'closed') steps: - name: Checkout LLVM uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false fetch-depth: 2 - name: Setup ccache uses: hendrikmuhs/ccache-action@33522472633dbd32578e909b315f5ee43ba878ce # v1.2.22 with: max-size: "2000M" - name: Install Ninja run: | brew install ninja - name: Build and Test run: | source <(git diff --name-only HEAD~1...HEAD | python3 .ci/compute_projects.py) if [[ "${projects_to_build}" == "" ]]; then echo "No projects to build" exit 0 fi echo "Building projects: ${projects_to_build}" echo "Running project checks targets: ${project_check_targets}" # -DLLVM_DISABLE_ASSEMBLY_FILES=ON is for # https://github.com/llvm/llvm-project/issues/81967 # Disable sharding in lit so that the LIT_XFAIL environment var works. cmake -G Ninja \ -B build \ -S llvm \ -DLLVM_ENABLE_PROJECTS="${projects_to_build}" \ -DLLVM_DISABLE_ASSEMBLY_FILES=ON \ -DCMAKE_BUILD_TYPE=Release \ -DLLDB_INCLUDE_TESTS=OFF \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache # The libcxx tests fail, so we are skipping the runtime targets. ninja -C build ${project_check_targets}