mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-12 10:21:17 +00:00
* ci: wait for the base branch's macOS deps instead of rebuilding them * Hold Pull Request macOS Builds Until a Runner Is Free A pull request's macOS build now waits in one repo-wide line, from a Linux job, until the macOS runners every active Build all run holds or still needs leave two free. A run is let in whole: its first arch takes both runners and its second goes straight through, since letting arches in one at a time deadlocks with every runner held by a run waiting for its other arch. Push, nightly and manual runs reserve two runners until their macOS work is done, and a pull request run keeps its two until its universal build and tests finish, so jobs that never pass the line are accounted for. Queued jobs count as busy. API errors and a four-hour limit let the build in rather than block it. Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Count Pending Runs That Hold macOS Runners Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Show the macOS Admission Checks Live in the Job Log Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Let a Labelled Pull Request Go Ahead of the macOS Line A pull request labelled macos-priority when its run starts waits in its own line under the same rule, and the normal line counts every priority run still waiting as holding two runners, so the next free runners go to it. It still waits for runners in use and for main's reserve. Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Let Each macOS Arch In on Its Own Without Holding an Idle Runner Letting a pull request run in whole deadlocks when its second arch reaches the line behind another pull request: the run holds two runners, the pull request in front waits for them, and the second arch never gets to check. Each arch now waits on its own. A run with one arch let in holds a runner only until that arch's app build is done, and a run with both holds two until its universal build and tests finish, so whoever is first in line always gets in eventually. Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Stop Holding Runners for a Pull Request's Universal Build and Tests Holding two runners from a pull request's second arch until its universal build and tests finished kept one idle through the slower arch's build. Replaying the week of 10-03 against the real queue, that idle capacity pushed the median pull request from under three hours to over sixteen. Those jobs take minutes, so they now queue like any other job, and a pull request holds a runner only for an arch that is still building. Each arch then always needs exactly one runner. Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Count Runs That Move Between Status Lists A run is listed as pending while any of its jobs waits in a concurrency group, so it moves to in_progress the moment its last gate leaves the line. A check made in those seconds read the in_progress list before the move and the pending list after it, missed the run, and let in a second arch the limit had no room for. Runs created in the last day are now listed by creation time as well, and the run doing the check is read directly. Co-authored-by: raistlin7447 <kris.austin@gmail.com> * Log API Calls and the Rate Limit Left on Each macOS Admission Check The calls per check grow with the number of active runs, and the token's hourly limit is shared by the whole repository, so each check now logs how many calls it made and what the last response says is left. * Give the macOS Admission Jobs Fixed Names A skipped job is listed under its unevaluated name, so every Linux and Windows leg showed the label expression. Split the waiting job into a normal and a priority job with fixed names, sharing their steps through a YAML anchor. --------- Co-authored-by: raistlin7447 <kris.austin@gmail.com>
193 lines
7.0 KiB
YAML
193 lines
7.0 KiB
YAML
on:
|
|
workflow_call:
|
|
inputs:
|
|
cache-key:
|
|
required: true
|
|
type: string
|
|
cache-path:
|
|
required: true
|
|
type: string
|
|
valid-cache:
|
|
required: true
|
|
type: boolean
|
|
os:
|
|
required: true
|
|
type: string
|
|
arch:
|
|
required: false
|
|
type: string
|
|
compiler:
|
|
required: false
|
|
type: string
|
|
default: msvc
|
|
build-deps-only:
|
|
required: false
|
|
type: boolean
|
|
force-build:
|
|
required: false
|
|
type: boolean
|
|
|
|
jobs:
|
|
build_deps:
|
|
name: Build Deps
|
|
if: ${{ !cancelled() && (inputs.build-deps-only || inputs.force-build || inputs.valid-cache != true) }}
|
|
runs-on: ${{ inputs.os }}
|
|
env:
|
|
date:
|
|
steps:
|
|
|
|
# Setup the environment
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
with:
|
|
lfs: 'false'
|
|
|
|
- name: load cached deps
|
|
uses: actions/cache@v6
|
|
with:
|
|
path: ${{ github.workspace }}/${{ inputs.cache-path }}
|
|
key: ${{ inputs.cache-key }}
|
|
|
|
- uses: lukka/get-cmake@latest
|
|
with:
|
|
cmakeVersion: "~4.3.0" # use most recent 4.3.x version
|
|
useLocalCache: true # <--= Use the local cache (default is 'false').
|
|
useCloudCache: true
|
|
|
|
- name: setup dev on Windows
|
|
if: runner.os == 'Windows'
|
|
uses: microsoft/setup-msbuild@v3
|
|
|
|
- name: Get the date on Ubuntu and macOS
|
|
if: runner.os != 'Windows'
|
|
run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
|
shell: bash
|
|
|
|
- name: Get the date on Windows
|
|
if: runner.os == 'Windows'
|
|
run: echo "date=$(Get-Date -Format 'yyyyMMdd')" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
|
shell: pwsh
|
|
|
|
|
|
- name: Install MSYS2 (clangarm64) with GMP/MPFR and LLVM tools
|
|
if: runner.os == 'Windows' && inputs.arch == 'arm64'
|
|
uses: msys2/setup-msys2@v2
|
|
with:
|
|
msystem: CLANGARM64
|
|
update: true
|
|
install: >-
|
|
mingw-w64-clang-aarch64-gmp
|
|
mingw-w64-clang-aarch64-mpfr
|
|
mingw-w64-clang-aarch64-llvm
|
|
|
|
- name: Stage ARM64 GMP/MPFR (no prebuilt blobs exist for win-arm64)
|
|
# GMP/MPFR ship prebuilt x64/x86 blobs in-tree but none for ARM64.
|
|
# Pull them from MSYS2 clangarm64 and generate MSVC import libs via
|
|
# llvm-dlltool, then stage into deps/{GMP,MPFR}/.../win-arm64 where the
|
|
# MSVC branch of GMP.cmake/MPFR.cmake copies them into the dep prefix.
|
|
if: runner.os == 'Windows' && inputs.arch == 'arm64'
|
|
shell: msys2 {0}
|
|
run: |
|
|
set -euo pipefail
|
|
BIN=/clangarm64/bin
|
|
REPO=$(cygpath -u "$GITHUB_WORKSPACE")
|
|
|
|
make_import_lib() {
|
|
local dll="$1"; local lib="$2"; local def="/tmp/${dll%.dll}.def"
|
|
echo "EXPORTS" > "$def"
|
|
llvm-readobj --coff-exports "$BIN/$dll" | awk '/Name: /{print $2}' >> "$def"
|
|
llvm-dlltool -m arm64 -D "$dll" -d "$def" -l "$BIN/$lib"
|
|
}
|
|
|
|
make_import_lib libgmp-10.dll libgmp-10.lib
|
|
|
|
# MPFR 4.x ships as libmpfr-6.dll; rename to libmpfr-4 BEFORE generating
|
|
# the import lib so the baked-in runtime DLL name is correct.
|
|
MPFR_DLL=$(ls $BIN/libmpfr-*.dll | head -1 | xargs basename)
|
|
if [ "$MPFR_DLL" != "libmpfr-4.dll" ]; then cp "$BIN/$MPFR_DLL" "$BIN/libmpfr-4.dll"; fi
|
|
make_import_lib libmpfr-4.dll libmpfr-4.lib
|
|
|
|
mkdir -p $REPO/deps/GMP/gmp/lib/win-arm64 $REPO/deps/MPFR/mpfr/lib/win-arm64
|
|
cp $BIN/libgmp-10.dll $BIN/libgmp-10.lib $REPO/deps/GMP/gmp/lib/win-arm64/
|
|
cp $BIN/libmpfr-4.dll $BIN/libmpfr-4.lib $REPO/deps/MPFR/mpfr/lib/win-arm64/
|
|
cp /clangarm64/include/gmp.h $REPO/deps/GMP/gmp/include/
|
|
cp /clangarm64/include/mpfr.h $REPO/deps/MPFR/mpfr/include/ || true
|
|
|
|
# Build Dependencies
|
|
- name: Build on Windows
|
|
if: runner.os == 'Windows'
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
if (-not "${{ vars.SELF_HOSTED }}") {
|
|
choco install strawberryperl
|
|
}
|
|
# cache-path is the install directory inside the deps build directory.
|
|
$deps = (Split-Path "${{ github.workspace }}/${{ inputs.cache-path }}").Replace('\', '/')
|
|
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
|
|
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
|
|
.\build_win.bat -d --arch ${{ inputs.arch }} --deps-dir $deps @flags
|
|
shell: pwsh
|
|
|
|
- name: Build on Mac ${{ inputs.arch }}
|
|
if: runner.os == 'macOS'
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
if [ -z "${{ vars.SELF_HOSTED }}" ]; then
|
|
brew install automake texinfo libtool pkgconf yasm nasm
|
|
fi
|
|
./build_release_macos.sh -dx ${{ !vars.SELF_HOSTED && '-j 3' || '' }} -a ${{ inputs.arch }} -t 10.15
|
|
(cd "${{ github.workspace }}/deps/build/${{ inputs.arch }}" && \
|
|
find . -mindepth 1 -maxdepth 1 ! -name 'OrcaSlicer_dep' -exec rm -rf {} +)
|
|
|
|
|
|
- name: Apt-Install Dependencies
|
|
if: runner.os == 'Linux' && !vars.SELF_HOSTED
|
|
uses: ./.github/actions/apt-install-deps
|
|
|
|
- name: Build on Ubuntu
|
|
if: runner.os == 'Linux'
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
|
./build_linux.sh -drlL
|
|
cd deps/build
|
|
tar -czvf OrcaSlicer_dep_ubuntu_$(date +"%Y%m%d").tar.gz destdir
|
|
|
|
|
|
# Upload Artifacts
|
|
# - name: Upload Mac ${{ inputs.arch }} artifacts
|
|
# if: runner.os == 'macOS'
|
|
# uses: actions/upload-artifact@v6
|
|
# with:
|
|
# name: OrcaSlicer_dep_mac_${{ env.date }}
|
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz
|
|
|
|
# - name: Upload Windows artifacts
|
|
# if: runner.os == 'Windows'
|
|
# uses: actions/upload-artifact@v6
|
|
# with:
|
|
# name: OrcaSlicer_dep_win64_${{ env.date }}
|
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip
|
|
|
|
# - name: Upload Ubuntu artifacts
|
|
# if: runner.os == 'Linux' && !env.ACT
|
|
# env:
|
|
# ubuntu-ver: '2404'
|
|
# uses: actions/upload-artifact@v6
|
|
# with:
|
|
# name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }}
|
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz
|
|
|
|
build_orca:
|
|
name: Build OrcaSlicer
|
|
needs: [build_deps]
|
|
if: ${{ !cancelled() && !inputs.build-deps-only && (inputs.force-build || (inputs.valid-cache == true && needs.build_deps.result == 'skipped') || (inputs.valid-cache != true && success())) }}
|
|
uses: ./.github/workflows/build_orca.yml
|
|
with:
|
|
cache-key: ${{ inputs.cache-key }}
|
|
cache-path: ${{ inputs.cache-path }}
|
|
os: ${{ inputs.os }}
|
|
arch: ${{ inputs.arch }}
|
|
compiler: ${{ inputs.compiler }}
|
|
secrets: inherit
|