Skip to content

GH-1188: Reduce test workflow waste #1654

GH-1188: Reduce test workflow waste

GH-1188: Reduce test workflow waste #1654

Workflow file for this run

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Test
on:
push:
branches: [main]
tags: ['**']
pull_request:
concurrency:
group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: read
env:
DOCKER_VOLUME_PREFIX: ".docker/"
jobs:
ubuntu:
name: AMD64 ${{ matrix.name }} JDK ${{ matrix.jdk }} Maven ${{ matrix.maven }}
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.title, 'WIP') }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
jdk: [17, 21, 23]
maven: [3.9.9]
image: [ubuntu, conda-jni-cdata]
include:
- image: ubuntu
name: "Ubuntu"
- image: conda-jni-cdata
name: "Conda JNI"
env:
JDK: ${{ matrix.jdk }}
MAVEN: ${{ matrix.maven }}
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Cache Docker Volumes
uses: actions/cache@v5
with:
path: .docker
key: maven-${{ matrix.jdk }}-${{ matrix.maven }}-${{ hashFiles('compose.yaml', '**/pom.xml') }}
restore-keys: maven-${{ matrix.jdk }}-${{ matrix.maven }}-
- name: Execute Docker Build
env:
# Enables build caching, but not strictly required
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
run: |
docker compose run \
-e CI=true \
-e "DEVELOCITY_ACCESS_KEY=$DEVELOCITY_ACCESS_KEY" \
${{ matrix.image }}
macos:
name: ${{ matrix.arch }} macOS ${{ matrix.macos }} Java JDK ${{ matrix.jdk }}
runs-on: macos-${{ matrix.macos }}
if: ${{ !contains(github.event.pull_request.title, 'WIP') }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- arch: AMD64
jdk: 17
macos: 15-intel
- arch: AArch64
jdk: 17
macos: latest
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Set up Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: ${{ matrix.jdk }}
cache: 'maven'
- name: Build
shell: bash
env:
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
run: ci/scripts/build.sh . build jni
- name: Test
shell: bash
env:
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
run: ci/scripts/test.sh . build jni
windows:
name: AMD64 Windows Server 2022 Java JDK ${{ matrix.jdk }}
runs-on: windows-latest
if: ${{ !contains(github.event.pull_request.title, 'WIP') }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
jdk: [17]
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Set up Java
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.jdk }}
distribution: 'temurin'
cache: 'maven'
- name: Build
shell: bash
env:
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
run: ci/scripts/build.sh . build jni
- name: Test
shell: bash
env:
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
run: ci/scripts/test.sh . build jni
integration:
name: AMD64 integration
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.title, 'WIP') }}
timeout-minutes: 60
steps:
- name: Check integration relevance
id: integration-changes
uses: actions/github-script@v8
with:
script: |
if (context.eventName !== 'pull_request') {
core.setOutput('should_run', 'true');
return;
}
const files = await github.paginate(
github.rest.pulls.listFiles,
{
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
per_page: 100,
}
);
const relevant = files.some(({ filename }) =>
filename === 'compose.yaml' ||
filename === 'pom.xml' ||
filename === '.github/workflows/test.yml' ||
filename.startsWith('c/') ||
filename.startsWith('flight/') ||
filename.startsWith('format/') ||
filename.startsWith('vector/') ||
filename.startsWith('ci/scripts/') ||
filename.startsWith('testing/data/') ||
filename.endsWith('/pom.xml')
);
core.setOutput('should_run', relevant ? 'true' : 'false');
core.notice(
relevant
? 'Integration-relevant changes detected; running integration tests.'
: 'No integration-relevant changes detected; skipping integration tests.'
);
- name: Checkout Arrow
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
fetch-depth: 0
repository: apache/arrow
submodules: recursive
- name: Checkout Arrow Rust
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
repository: apache/arrow-rs
path: rust
- name: Checkout Arrow nanoarrow
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
repository: apache/arrow-nanoarrow
path: nanoarrow
- name: Checkout Arrow .NET
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
repository: apache/arrow-dotnet
path: dotnet
- name: Checkout Arrow Go
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
repository: apache/arrow-go
path: go
- name: Checkout Arrow Java
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
path: java
- name: Checkout Arrow JavaScript
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/checkout@v6
with:
repository: apache/arrow-js
path: js
- name: Free up disk space
if: steps.integration-changes.outputs.should_run == 'true'
run: |
ci/scripts/util_free_space.sh
- name: Cache Docker Volumes
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/cache@v5
with:
path: .docker
key: integration-conda-${{ hashFiles('cpp/**') }}
restore-keys: integration-conda-
- name: Setup Python
if: steps.integration-changes.outputs.should_run == 'true'
uses: actions/setup-python@v6
with:
python-version: 3.12
- name: Setup Archery
if: steps.integration-changes.outputs.should_run == 'true'
run: pip install -e dev/archery[docker]
- name: Execute Docker Build
if: steps.integration-changes.outputs.should_run == 'true'
run: |
source ci/scripts/util_enable_core_dumps.sh
archery docker run \
-e ARCHERY_DEFAULT_BRANCH=main \
-e ARCHERY_INTEGRATION_TARGET_IMPLEMENTATIONS=java \
-e ARCHERY_INTEGRATION_WITH_DOTNET=1 \
-e ARCHERY_INTEGRATION_WITH_GO=1 \
-e ARCHERY_INTEGRATION_WITH_JAVA=1 \
-e ARCHERY_INTEGRATION_WITH_JS=1 \
-e ARCHERY_INTEGRATION_WITH_NANOARROW=1 \
-e ARCHERY_INTEGRATION_WITH_RUST=1 \
conda-integration