Skip to content

Created build script for numba & llvmlite. #4501

Created build script for numba & llvmlite.

Created build script for numba & llvmlite. #4501

Workflow file for this run

name: PR build
on:
pull_request:
branches:
- master
- replica-master
workflow_dispatch:
inputs:
large-runner:
description: "New runner to use for failing build"
required: true
default: "ubuntu-24.04-ppc64le-2xlarge-p10"
type: choice
options:
- ubuntu-24.04-ppc64le-2xlarge-p10
- ubuntu-24.04-ppc64le-4xlarge-p10
pr_number:
description: "PR number of failing build"
required: true
type: string
run-name: >
${{ github.event_name == 'workflow_dispatch'
&& format('Retriggered build on {0} for PR {1}', inputs.large-runner, inputs.pr_number)
|| github.event.pull_request.title }}
jobs:
check_changes:
runs-on: ubuntu-latest
outputs:
should_build: ${{ steps.filter.outputs.should_build }}
changed_files: ${{ steps.filter.outputs.changed_files }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check for relevant file changes
id: filter
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "Workflow dispatch - proceeding with build"
exit 0
fi
# Fetch base branch with full history
git fetch origin ${{ github.base_ref }}
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)
echo "Changed files:"
echo "$CHANGED_FILES"
# Store changed files for reuse in later jobs
echo "changed_files<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGED_FILES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
# Check for build_info.json, .sh scripts (excluding specific directories), or Dockerfile
RELEVANT_CHANGES=$(echo "$CHANGED_FILES" | grep -E '(build_info\.json|\.sh$|Dockerfile)' | grep -vE '^(gha-script|process_bom|script|templates|travis-currency-ymls|travis-ymls)/' || true)
if [ -n "$RELEVANT_CHANGES" ]; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "Found relevant changes:"
echo "$RELEVANT_CHANGES"
else
echo "should_build=false" >> $GITHUB_OUTPUT
echo "Skipping PR build CI check - no changes related to build_info.json, build scripts (.sh), or Dockerfile"
fi
build_info:
needs: check_changes
if: needs.check_changes.outputs.should_build == 'true'
runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-ppc64le-p10' || inputs.large-runner }}
outputs:
wheel_build_enabled: ${{ steps.set_flags.outputs.wheel_build_enabled }}
has_sh_changes: ${{ steps.set_flags.outputs.has_sh_changes }}
has_dockerfile_changes: ${{ steps.set_flags.outputs.has_dockerfile_changes }}
docker_build_enabled: ${{ steps.set_flags.outputs.docker_build_enabled }}
build_package_enabled: ${{ steps.set_flags.outputs.build_package_enabled }}
# Per-UBI-major named outputs - each is a {script,tested_on} JSON object or ""
script_ubi8: ${{ steps.emit.outputs.script_ubi8 }}
script_ubi9: ${{ steps.emit.outputs.script_ubi9 }}
script_ubi10: ${{ steps.emit.outputs.script_ubi10 }}
steps:
- name: Checkout code (Pull Request)
if: github.event_name == 'pull_request'
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Checkout code (Workflow Dispatch)
if: github.event_name == 'workflow_dispatch'
uses: actions/checkout@v6
with:
ref: refs/pull/${{ inputs.pr_number }}/head
- name: Debug - Check user and workspace ownership
run: |
echo "Current user: $USER"
echo "Current user ID: $(id -u)"
echo "Current group ID: $(id -g)"
echo "Workspace directory: $(pwd)"
echo "Workspace ownership:"
ls -la . | head -20
echo "gha-script directory ownership:"
ls -la ./gha-script | head -10
- name: Fix workspace permissions
run: sudo chown -R $USER:$USER .
- name: Install required packages
run: |
sudo apt update -y
sudo apt-get install -y file jq
- name: Install Python dependencies
run: |
pip3 install --force-reinstall -v "requests==2.31.0"
pip3 install --upgrade docker
- name: Set PR number
run: echo "PR_NUMBER=${{ github.event.pull_request.number || inputs.pr_number }}" >> $GITHUB_ENV
- name: Run validate_builds.py script with live logs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python3 -u gha-script/validate_builds.py ${PR_NUMBER:-false} 2>&1 | tee build_log
my_pid_status=${PIPESTATUS[0]}
if [ "$my_pid_status" -ne 0 ]; then
echo "Script failed for PR #${PR_NUMBER}"
echo "::group::Validation Logs"
tail -200 build_log
echo "::endgroup::"
exit 1
else
echo "Script completed successfully for PR #${PR_NUMBER}"
fi
- name: Locate and parse build_info.json
run: |
# Reuse changed files from check_changes job
CHANGED_FILES="${{ needs.check_changes.outputs.changed_files }}"
# If workflow_dispatch, check_changes did not compute changed_files - fetch them now
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
git fetch origin ${{ github.base_ref }} --depth=1
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)
fi
BUILD_INFO_FILE=$(echo "$CHANGED_FILES" | grep 'build_info.json' | head -n 1)
if [ -z "$BUILD_INFO_FILE" ]; then
echo "No build_info.json modified, trying to detect from changed files..."
PACKAGE_DIR=$(echo "$CHANGED_FILES" \
| grep -vE '^(gha-script|process_bom|script|templates|travis-currency-ymls|travis-ymls)/' \
| head -n 1 \
| cut -d'/' -f1-2)
BUILD_INFO_FILE="$PACKAGE_DIR/build_info.json"
if [ ! -f "$BUILD_INFO_FILE" ]; then
echo "Could not locate build_info.json!"
exit 1
fi
echo "Using fallback build_info: $BUILD_INFO_FILE"
fi
PACKAGE_NAME=$(jq -r '.package_name // ""' $BUILD_INFO_FILE)
VERSION=$(jq -r '.version // ""' $BUILD_INFO_FILE)
# Preserve the raw .version field from build_info.json as the real package
# version (e.g. "v2.11.0"). VERSION may be overwritten below by the matched
# version block key (e.g. "v2.10.*"), which is only a pattern for resolution.
PACKAGE_VERSION="$VERSION"
# Pick the version block whose build_script list has the MOST overlap
# with the changed .sh files. This correctly handles the case where a
# script also appears in older single-script blocks (e.g. scikit-learn_ubi_8.10.sh
# is in both 1.5.0 and 1.9.0) - the new block wins because it matches more
# changed files. The wildcard "*" key is always skipped - it is a catch-all
# fallback, not a real version.
# NOTE: if no .sh files changed (build_info.json only), this block is skipped
# entirely and VERSION stays as the default from the .version field.
CHANGED_SH=$(echo "$CHANGED_FILES" | grep '\.sh$' || true)
if [ -n "$CHANGED_SH" ]; then
SCALAR_KEYS='package_name|version|package_dir|wheel_build|docker_build|validate_build_script|base_docker_image|base_docker_variant|use_non_root_user|auditwheel_exclude'
VERSION_KEYS=$(jq -r 'keys[] | select(test("^('"$SCALAR_KEYS"')$") | not) | select(. != "*")' "$BUILD_INFO_FILE" 2>/dev/null || true)
best_ver=""
best_count=0
for ver_key in $VERSION_KEYS; do
bs=$(jq -c --arg k "$ver_key" '.[$k].build_script // empty' "$BUILD_INFO_FILE" 2>/dev/null || true)
[ -z "$bs" ] && continue
if echo "$bs" | jq -e 'type == "array"' >/dev/null 2>&1; then
scripts=$(echo "$bs" | jq -r '.[]')
else
scripts=$(echo "$bs" | tr -d '"')
fi
match_count=0
for s in $scripts; do
if echo "$CHANGED_SH" | grep -qF "$s"; then
match_count=$((match_count + 1))
fi
done
if [ "$match_count" -gt "$best_count" ]; then
best_count=$match_count
best_ver="$ver_key"
fi
done
if [ -n "$best_ver" ] && [ "$best_count" -gt 0 ]; then
echo "Version block '$best_ver' matched $best_count changed script(s) - using that version instead of default '$VERSION'"
VERSION="$best_ver"
fi
fi
# Validate that the resolved version block key matches the 'version' field
# value exactly. A mismatch (e.g. key "1.5.4" vs field "v1.5.4") means
# currency-build, which uses the 'version' field as user input, will fail
# to find the block and fall back to "*", silently skipping UBI variants.
# Skip this check when:
# - VERSION equals PACKAGE_VERSION (no override happened, or they already match)
# - VERSION contains "*" (wildcard/glob key - intentionally different from field)
if [ "$VERSION" != "$PACKAGE_VERSION" ] && [[ "$VERSION" != *"*"* ]]; then
echo "ERROR: version block key '$VERSION' does not match the 'version' field value '$PACKAGE_VERSION' in build_info.json."
echo " Currency-build receives VERSION='$PACKAGE_VERSION' as user input and would"
echo " fail to find key '$VERSION', falling back to '*' and skipping UBI variants."
echo " Fix: rename the version block key from '$VERSION' to '$PACKAGE_VERSION'."
exit 1
fi
echo "BUILD_INFO_FILE=$BUILD_INFO_FILE" >> $GITHUB_ENV
echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "PACKAGE_VERSION=$PACKAGE_VERSION" >> $GITHUB_ENV
echo "CHANGED_FILES<<EOF" >> $GITHUB_ENV
echo "$CHANGED_FILES" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Read build_info.json
run: |
sudo chown -R $USER:$USER .
chmod +x ./gha-script/read_buildinfo.sh
bash ./gha-script/read_buildinfo.sh
- name: Emit per-UBI outputs
id: emit
run: |
source variable.sh
# Validation: for every changed .sh file enforce two hard rules:
# 1. The script MUST have a '# Tested on' header - it is mandatory.
# 2. The UBI slot for that script MUST already be populated by
# read_buildinfo.sh via the version block in build_info.json.
# An empty slot means the version block key does not match VERSION
# (e.g. "1.5.4" vs "v1.5.4") and Currency-build would silently skip it.
# Both conditions cause a hard stop - the PR must not be merged until fixed.
# If no .sh files changed (build_info.json only), this loop does nothing.
validation_failed=false
while read -r changed_script; do
[[ "$changed_script" != *.sh ]] && continue
[ ! -f "$changed_script" ] && continue
script_name=$(basename "$changed_script")
raw_tested_on=$(grep "^# Tested on" "$changed_script" | head -1 \
| cut -d ':' -f2- \
| sed 's/^[[:space:]]*//' \
| tr '[:lower:]' '[:upper:]' \
| sed 's/[[:space:]]*:[[:space:]]*/:/g; s/UBI[[:space:]]*/UBI/g')
# Rule 1: '# Tested on' is mandatory in every build script.
if [ -z "$raw_tested_on" ]; then
echo "ERROR: '$script_name' is missing the mandatory '# Tested on' header."
echo " Every build script must declare the UBI version it targets, e.g.:"
echo " # Tested on : UBI:10.2"
validation_failed=true
continue
fi
major=$(echo "$raw_tested_on" | sed 's/.*UBI[: ]*\([0-9][0-9]*\).*/\1/')
case "$major" in ''|*[!0-9]*)
echo "ERROR: '$script_name' has an unrecognised '# Tested on' value: '$raw_tested_on'."
echo " Expected format: UBI:<major>.<minor> e.g. UBI:10.2"
validation_failed=true
continue
esac
# Rule 2: the UBI slot must already be filled by read_buildinfo.sh.
case "$major" in
8)
if [ -z "$SCRIPT_UBI8" ]; then
echo "ERROR: '$script_name' targets UBI8 (# Tested on: $raw_tested_on) but SCRIPT_UBI8 is empty."
echo " The version block key in build_info.json does not match VERSION='$VERSION'."
echo " Fix the version block key so it exactly matches the 'version' field value."
validation_failed=true
fi ;;
9)
if [ -z "$SCRIPT_UBI9" ]; then
echo "ERROR: '$script_name' targets UBI9 (# Tested on: $raw_tested_on) but SCRIPT_UBI9 is empty."
echo " The version block key in build_info.json does not match VERSION='$VERSION'."
echo " Fix the version block key so it exactly matches the 'version' field value."
validation_failed=true
fi ;;
10)
if [ -z "$SCRIPT_UBI10" ]; then
echo "ERROR: '$script_name' targets UBI10 (# Tested on: $raw_tested_on) but SCRIPT_UBI10 is empty."
echo " The version block key in build_info.json does not match VERSION='$VERSION'."
echo " Fix the version block key so it exactly matches the 'version' field value."
validation_failed=true
fi ;;
esac
done <<< "$CHANGED_FILES"
if [ "$validation_failed" = "true" ]; then
echo ""
echo "PR blocked: fix the errors above in build_info.json or the build script(s) before merging."
echo "Currency-build has no safety net and would silently produce an incomplete build."
exit 1
fi
echo "SCRIPT_UBI8=$SCRIPT_UBI8"
echo "SCRIPT_UBI9=$SCRIPT_UBI9"
echo "SCRIPT_UBI10=$SCRIPT_UBI10"
# Use multiline delimiter syntax so JSON double-quotes are not truncated
{
echo "script_ubi8<<__EOF__"
echo "$SCRIPT_UBI8"
echo "__EOF__"
echo "script_ubi9<<__EOF__"
echo "$SCRIPT_UBI9"
echo "__EOF__"
echo "script_ubi10<<__EOF__"
echo "$SCRIPT_UBI10"
echo "__EOF__"
} >> $GITHUB_OUTPUT
- name: Set job control flags
id: set_flags
run: |
if [ -z "$BUILD_INFO_FILE" ]; then
echo "ERROR: BUILD_INFO_FILE is not set - cannot determine job control flags"
exit 1
fi
if [ ! -f "$BUILD_INFO_FILE" ]; then
echo "ERROR: BUILD_INFO_FILE does not exist: $BUILD_INFO_FILE"
exit 1
fi
PACKAGE_DIR=$(jq -r '.package_dir // ""' $BUILD_INFO_FILE)
# Strip trailing slash if present - prevents double-slash in regex (e.g. "m/multidict/" -> "m/multidict")
PACKAGE_DIR="${PACKAGE_DIR%/}"
WHEEL_BUILD=$(jq -r '.wheel_build // "false"' $BUILD_INFO_FILE)
# Robust docker_build extraction
if jq -e '.docker_build == true or .docker_build == "true"' "$BUILD_INFO_FILE" > /dev/null; then
DOCKER_BUILD="true"
else
DOCKER_BUILD="false"
fi
# Check if .sh scripts changed in this package
SH_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
# Check if Dockerfile changed
DOCKERFILE_CHANGED=$(echo "$CHANGED_FILES" | grep -i 'Dockerfile' || true)
# Set outputs for wheel builds
if [ "$WHEEL_BUILD" == "true" ] && [ -n "$SH_SCRIPT_CHANGED" ]; then
echo "wheel_build_enabled=true" >> $GITHUB_OUTPUT
echo "Wheel builds will run (WHEEL_BUILD=true and .sh scripts changed)"
else
echo "wheel_build_enabled=false" >> $GITHUB_OUTPUT
echo "Wheel builds will be skipped (WHEEL_BUILD=$WHEEL_BUILD, .sh changes: ${SH_SCRIPT_CHANGED:-none})"
fi
# Set output for sh changes
if [ -n "$SH_SCRIPT_CHANGED" ]; then
echo "has_sh_changes=true" >> $GITHUB_OUTPUT
else
echo "has_sh_changes=false" >> $GITHUB_OUTPUT
fi
# Set outputs for docker build
if [ "$DOCKER_BUILD" == "true" ] && [ -n "$DOCKERFILE_CHANGED" ]; then
echo "docker_build_enabled=true" >> $GITHUB_OUTPUT
echo "has_dockerfile_changes=true" >> $GITHUB_OUTPUT
echo "Docker build will run (BUILD_DOCKER=true and Dockerfile changed)"
else
echo "docker_build_enabled=false" >> $GITHUB_OUTPUT
if [ -n "$DOCKERFILE_CHANGED" ]; then
echo "has_dockerfile_changes=true" >> $GITHUB_OUTPUT
else
echo "has_dockerfile_changes=false" >> $GITHUB_OUTPUT
fi
echo "Docker build will be skipped (BUILD_DOCKER=$DOCKER_BUILD, Dockerfile changes: ${DOCKERFILE_CHANGED:-none})"
fi
# Set output for build job (runs when build_info.json or .sh scripts change)
BUILD_INFO_CHANGED=$(echo "$CHANGED_FILES" | grep 'build_info\.json' || true)
if [ -n "$BUILD_INFO_CHANGED" ] || [ -n "$SH_SCRIPT_CHANGED" ]; then
echo "build_package_enabled=true" >> $GITHUB_OUTPUT
echo "Build package job will run (build_info.json or .sh scripts changed)"
else
echo "build_package_enabled=false" >> $GITHUB_OUTPUT
echo "Build package job will be skipped (no build_info.json or .sh script changes)"
fi
- name: Create scanner-env.sh
run: |
mkdir -p package-cache
PACKAGE_DIR=$(jq -r '.package_dir // ""' $BUILD_INFO_FILE)
# Strip trailing slash to prevent double-slash in the per-job grep:
# grep -E "^$PACKAGE_DIR/.*\.sh$"
# Without this, "n/nbconvert/" becomes "n/nbconvert//.*\.sh$" and never matches.
PACKAGE_DIR="${PACKAGE_DIR%/}"
WHEEL_BUILD=$(jq -r '.wheel_build // "false"' $BUILD_INFO_FILE)
# Robust docker_build extraction
if jq -e '.docker_build == true or .docker_build == "true"' "$BUILD_INFO_FILE" > /dev/null; then
DOCKER_BUILD="true"
else
DOCKER_BUILD="false"
fi
# Write scanner-env.sh without leading indentation spaces.
# CHANGED_FILES is written via a separate heredoc so its newlines are preserved.
{
echo "export PACKAGE_NAME=$PACKAGE_NAME"
echo "export VERSION=$PACKAGE_VERSION"
echo "export PACKAGE_DIR=$PACKAGE_DIR"
echo "export WHEEL_BUILD=$WHEEL_BUILD"
echo "export BUILD_DOCKER=$DOCKER_BUILD"
printf 'export CHANGED_FILES=%q\n' "$CHANGED_FILES"
} > package-cache/scanner-env.sh
mv variable.sh package-cache/
- name: Archive package cache
run: tar -czf package-cache.tar.gz package-cache/
- name: Upload package cache
uses: actions/upload-artifact@v4
with:
name: package-cache
path: package-cache.tar.gz
# ---------------------------------------------------------------------------
# BUILD JOBS - one per UBI major version.
# Runs execute_changed_scripts.py inside the correct UBI container.
# Each job only runs when a script exists for that UBI version.
# All three are parallel (no inter-dependency).
# ---------------------------------------------------------------------------
build_ubi8:
needs: build_info
if: ${{ needs.build_info.outputs.build_package_enabled == 'true' && needs.build_info.outputs.script_ubi8 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi8).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi8).tested_on }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Build Package (UBI8)
run: |
# Capture the GHA job-level BUILD_SCRIPT before sourcing variable.sh,
# which overwrites BUILD_SCRIPT with the first/backward-compat script.
THIS_SCRIPT="$BUILD_SCRIPT"
sudo chown -R $USER:$USER .
source package-cache/variable.sh
source package-cache/scanner-env.sh
echo "--- Executing changed scripts for UBI8 (script: $THIS_SCRIPT) ---"
# Filter CHANGED_FILES to only the script assigned to this UBI job.
export CHANGED_FILES=$(echo "$CHANGED_FILES" | grep -F "$THIS_SCRIPT" || true)
export BUILD_SCRIPT="$THIS_SCRIPT"
chmod +x ./gha-script/execute_changed_scripts.py
python3 -u ./gha-script/execute_changed_scripts.py
build_ubi9:
needs: build_info
if: ${{ needs.build_info.outputs.build_package_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Build Package (UBI9)
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
sudo chown -R $USER:$USER .
source package-cache/variable.sh
source package-cache/scanner-env.sh
echo "--- Executing changed scripts for UBI9 (script: $THIS_SCRIPT) ---"
export CHANGED_FILES=$(echo "$CHANGED_FILES" | grep -F "$THIS_SCRIPT" || true)
export BUILD_SCRIPT="$THIS_SCRIPT"
chmod +x ./gha-script/execute_changed_scripts.py
python3 -u ./gha-script/execute_changed_scripts.py
build_ubi10:
needs: build_info
if: ${{ needs.build_info.outputs.build_package_enabled == 'true' && needs.build_info.outputs.script_ubi10 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi10).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi10).tested_on }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Build Package (UBI10)
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
sudo chown -R $USER:$USER .
source package-cache/variable.sh
source package-cache/scanner-env.sh
echo "--- Executing changed scripts for UBI10 (script: $THIS_SCRIPT) ---"
export CHANGED_FILES=$(echo "$CHANGED_FILES" | grep -F "$THIS_SCRIPT" || true)
export BUILD_SCRIPT="$THIS_SCRIPT"
chmod +x ./gha-script/execute_changed_scripts.py
python3 -u ./gha-script/execute_changed_scripts.py
# ---------------------------------------------------------------------------
# WHEEL BUILD JOBS - one job per UBI version per Python version.
# All parallel. UBI10 supports py312-py314 only (py310/py311 not supported).
# PR builds do not run scan steps.
# ---------------------------------------------------------------------------
wheel_build_ubi8_py311:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi8 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.11"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi8).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi8).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi8_py312:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi8 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.12"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi8).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi8).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
# UBI9 wheel jobs -----------------------------------------------------------
wheel_build_ubi9_py310:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.10"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi9_py311:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.11"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi9_py312:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.12"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi9_py313:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
continue-on-error: true
env:
PYTHON_VERSION: "3.13"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi9_py314:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi9 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
continue-on-error: true
env:
PYTHON_VERSION: "3.14"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi9).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi9).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
# UBI10 wheel jobs (py312-py314 only - py310/py311 not supported on UBI10) ----
wheel_build_ubi10_py312:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi10 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
env:
PYTHON_VERSION: "3.12"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi10).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi10).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi10_py313:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi10 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
continue-on-error: true
env:
PYTHON_VERSION: "3.13"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi10).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi10).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
wheel_build_ubi10_py314:
needs: build_info
if: ${{ needs.build_info.outputs.wheel_build_enabled == 'true' && needs.build_info.outputs.script_ubi10 != '' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && inputs.large-runner || 'ubuntu-24.04-ppc64le-p10' }}
continue-on-error: true
env:
PYTHON_VERSION: "3.14"
BUILD_SCRIPT: ${{ fromJson(needs.build_info.outputs.script_ubi10).script }}
TESTED_ON: ${{ fromJson(needs.build_info.outputs.script_ubi10).tested_on }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install system dependencies
run: sudo apt update -y
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Run build_wheels.sh
run: |
THIS_SCRIPT="$BUILD_SCRIPT"
THIS_TESTED_ON="$TESTED_ON"
source package-cache/variable.sh; source package-cache/scanner-env.sh
export BUILD_SCRIPT="$THIS_SCRIPT"
export TESTED_ON="$THIS_TESTED_ON"
if [ "$WHEEL_BUILD" != "true" ]; then echo "Skipping - WHEEL_BUILD=false"; exit 0; fi
BUILD_SCRIPT_CHANGED=$(echo "$CHANGED_FILES" | grep -E "^$PACKAGE_DIR/.*\.sh$" || true)
[ -z "$BUILD_SCRIPT_CHANGED" ] && echo "Skipping - no .sh changes" && exit 0
sudo chown -R $USER:$USER .
export ENABLE_CVE_SCAN=false
chmod +x ./gha-script/build_wheels.sh; bash ./gha-script/build_wheels.sh
- name: Verify wheel was produced
run: |
if ls *.whl 1>/dev/null 2>&1; then
echo "Wheel built successfully: $(ls *.whl)"
else
echo "No wheel produced."
exit 1
fi
# ---------------------------------------------------------------------------
# build_docker - only when Dockerfile changed and docker_build=true in build_info
# ---------------------------------------------------------------------------
build_docker:
needs: build_info
if: needs.build_info.outputs.docker_build_enabled == 'true'
runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-ppc64le-p10' || inputs.large-runner }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Download package-cache
uses: actions/download-artifact@v4
with:
name: package-cache
- name: Extract package cache
run: tar -xzf package-cache.tar.gz
- name: Build Docker Image
run: |
ls package-cache
chmod +x package-cache/variable.sh
chmod +x package-cache/scanner-env.sh
source package-cache/variable.sh
source package-cache/scanner-env.sh
BUILD_DOCKER=$(echo "$BUILD_DOCKER" | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
DOCKERFILE_CHANGED=$(echo "$CHANGED_FILES" | grep -i 'Dockerfile' || true)
if [[ "$BUILD_DOCKER" != "true" ]]; then
echo "Skipping Docker build as BUILD_DOCKER=$BUILD_DOCKER"; exit 0
fi
if [[ -z "$DOCKERFILE_CHANGED" ]]; then
echo "Skipping Docker build as no Dockerfile changes detected in PR"; exit 0
fi
echo "Dockerfile change detected, proceeding with build..."
sudo chown -R $USER:$USER .
chmod +x ./gha-script/build_docker.sh
bash ./gha-script/build_docker.sh
docker images
docker save -o package-cache/image.tar "$IMAGE_NAME"
ls -lh package-cache/image.tar