Skip to content

CI / PR 94

CI / PR 94 #981

Workflow file for this run

name: CI
run-name: CI / ${{ github.event_name == 'pull_request' && format('PR {0}', github.event.number) || github.ref_name }}
on:
pull_request:
types: [opened, synchronize, reopened, closed]
merge_group:
types: [checks_requested]
push:
branches: [main]
workflow_dispatch:
inputs:
wasm_target:
description: WASM AOT target to build when WASM runtime inputs are affected
required: true
default: all
type: choice
options:
- all
- macos-arm64
- linux-x64-gnu
- linux-arm64-gnu
- windows-x64-msvc
native_target:
description: Native runtime target to run for focused manual debugging
required: true
default: all
type: choice
options:
- all
- macos-arm64
- linux-x64-gnu
- linux-arm64-gnu
- windows-x64-msvc
- android-arm64-v8a
- android-x86_64
- ios-xcframework
mobile_target:
description: Mobile lane to run for focused manual debugging
required: true
default: all
type: choice
options:
- all
- android
- ios
- both
save_heavy_caches:
description: Write the bounded heavy build caches when manually qualifying main
required: true
default: false
type: boolean
permissions:
contents: read
concurrency:
group: ci-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.number) || format('sha-{0}', github.sha) }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
NODE_VERSION: 22.22.3
PNPM_VERSION: 11.5.0
NPM_VERSION: 11.18.0
BUN_VERSION: 1.3.14
DENO_VERSION: v2.8.1
ACTIONLINT_VERSION: 1.7.12
ASSET_PROFILE: release
WASMER_LLVM_VERSION: "22.1"
WASMER_LLVM_LINUX_X64_URL: https://github.com/wasmerio/llvm-custom-builds/releases/download/22.x/llvm-linux-amd64.tar.xz
WASMER_LLVM_LINUX_X64_SHA256: 5fb1c687c5e895d517a23e7aabea9ec3557e3a3e33f8a8d3a8d21395157b3906
WASMER_LLVM_LINUX_X64_BYTES: 741670068
HEAVY_CACHE_SAVE_IF: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' && inputs.save_heavy_caches) }}
MOON_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || '' }}
MOON_HEAD: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
defaults:
run:
shell: bash
jobs:
affected:
name: Plan
needs:
- release-intent
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
runs-on: ubuntu-24.04
timeout-minutes: 10
outputs:
builder_jobs: ${{ steps.plan.outputs.builder_jobs }}
check_count: ${{ steps.target-matrices.outputs.check_count }}
check_job_count: ${{ steps.target-matrices.outputs.check_job_count }}
check_jobs: ${{ steps.target-matrices.outputs.check_jobs }}
check_matrix: ${{ steps.target-matrices.outputs.check_matrix }}
policy_count: ${{ steps.target-matrices.outputs.policy_count }}
policy_matrix: ${{ steps.target-matrices.outputs.policy_matrix }}
policy_requires_android_sdk: ${{ steps.target-matrices.outputs.policy_requires_android_sdk }}
policy_requires_maintainer_tools: ${{ steps.target-matrices.outputs.policy_requires_maintainer_tools }}
jobs: ${{ steps.plan.outputs.jobs }}
e2e_jobs: ${{ steps.plan.outputs.e2e_jobs }}
job_targets: ${{ steps.plan.outputs.job_targets }}
broker_runtime_matrix: ${{ steps.plan.outputs.broker_runtime_matrix }}
extension_artifacts_native_matrix: ${{ steps.plan.outputs.extension_artifacts_native_matrix }}
extension_artifacts_wasix_matrix: ${{ steps.plan.outputs.extension_artifacts_wasix_matrix }}
extension_package_products: ${{ steps.plan.outputs.extension_package_products }}
extension_package_products_csv: ${{ steps.plan.outputs.extension_package_products_csv }}
extension_package_sql_names: ${{ steps.plan.outputs.extension_package_sql_names }}
extension_package_sql_names_csv: ${{ steps.plan.outputs.extension_package_sql_names_csv }}
native_extension_lifecycle_sql_names: ${{ steps.plan.outputs.native_extension_lifecycle_sql_names }}
native_extension_lifecycle_sql_names_csv: ${{ steps.plan.outputs.native_extension_lifecycle_sql_names_csv }}
native_extension_lifecycle_matrix: ${{ steps.plan.outputs.native_extension_lifecycle_matrix }}
native_extension_lifecycle_shard_count: ${{ steps.plan.outputs.native_extension_lifecycle_shard_count }}
liboliphaunt_wasix_aot_runtime_matrix: ${{ steps.plan.outputs.liboliphaunt_wasix_aot_runtime_matrix }}
liboliphaunt_native_android_runtime_matrix: ${{ steps.plan.outputs.liboliphaunt_native_android_runtime_matrix }}
liboliphaunt_native_desktop_runtime_matrix: ${{ steps.plan.outputs.liboliphaunt_native_desktop_runtime_matrix }}
liboliphaunt_native_ios_runtime_matrix: ${{ steps.plan.outputs.liboliphaunt_native_ios_runtime_matrix }}
mobile_extension_package_native_targets: ${{ steps.plan.outputs.mobile_extension_package_native_targets }}
mobile_extension_package_native_targets_csv: ${{ steps.plan.outputs.mobile_extension_package_native_targets_csv }}
react_native_android_mobile_app_matrix: ${{ steps.plan.outputs.react_native_android_mobile_app_matrix }}
js_exact_candidate_consumer_matrix: ${{ steps.plan.outputs.js_exact_candidate_consumer_matrix }}
node_direct_runtime_matrix: ${{ steps.plan.outputs.node_direct_runtime_matrix }}
projects: ${{ steps.plan.outputs.projects }}
tasks: ${{ steps.plan.outputs.tasks }}
test_count: ${{ steps.target-matrices.outputs.test_count }}
test_jobs: ${{ steps.target-matrices.outputs.test_jobs }}
test_matrix: ${{ steps.target-matrices.outputs.test_matrix }}
reason: ${{ steps.plan.outputs.reason }}
wasix_release_regression_required: ${{ contains(fromJson(steps.plan.outputs.jobs), 'liboliphaunt-wasix-runtime') && (github.event_name != 'workflow_dispatch' || inputs.wasm_target == 'all' || inputs.wasm_target == 'linux-x64-gnu') }}
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "false"
- name: Plan artifact builder jobs
id: plan
env:
GITHUB_EVENT_NAME: ${{ github.event_name }}
MOON_BASE: ${{ github.event.pull_request.base.sha }}
MOON_HEAD: ${{ github.event.pull_request.head.sha || github.sha }}
WASM_TARGET: ${{ github.event_name == 'workflow_dispatch' && inputs.wasm_target || 'all' }}
NATIVE_TARGET: ${{ github.event_name == 'workflow_dispatch' && inputs.native_target || 'all' }}
MOBILE_TARGET: ${{ github.event_name == 'workflow_dispatch' && inputs.mobile_target || 'all' }}
run: tools/dev/bun.sh tools/graph/ci_plan.mjs
- name: Plan check and test jobs
id: target-matrices
run: node .github/scripts/write-affected-moon-target-matrices.mjs check test
- name: Upload build plan
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: artifact-build-plan
path: target/graph/ci-plan.json
if-no-files-found: error
release-intent:
name: Validate commit and PR title
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
permissions:
actions: read
contents: read
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check release intent
id: release_intent
env:
PR_TITLE: ${{ github.event.pull_request.title }}
BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before || github.event.merge_group.base_sha || 'origin/main' }}
HEAD_REF: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }}
HEAD_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }}
CI_EVENT_NAME: ${{ github.event_name }}
CI_FULL_REF: ${{ github.ref }}
CI_WASM_TARGET: ${{ inputs.wasm_target }}
CI_NATIVE_TARGET: ${{ inputs.native_target }}
CI_MOBILE_TARGET: ${{ inputs.mobile_target }}
run: |
subject="${PR_TITLE:-}"
if [ -z "$subject" ]; then
subject="$(git log -1 --pretty=%s "$HEAD_REF")"
fi
.github/scripts/check-release-intent.sh "$subject" "$BASE_REF" "$HEAD_REF" "$HEAD_BRANCH" "$CI_EVENT_NAME" "$CI_FULL_REF"
- name: Set up pinned Node.js for history-repair proof
id: setup_history_repair_node
if: ${{ steps.release_intent.outputs.history_repair == 'true' }}
uses: ./.github/actions/setup-node-runtime
with:
node-version: ${{ env.NODE_VERSION }}
- name: Select exact qualified history-repair candidate
id: history_repair_qualification
if: ${{ steps.release_intent.outputs.history_repair == 'true' }}
env:
GH_REPO: ${{ github.repository }}
GH_TOKEN: ${{ github.token }}
HISTORY_REPAIR_CANDIDATE_SHA: ${{ steps.release_intent.outputs.history_repair_candidate_sha }}
run: |
bash .github/scripts/require-workflow-success.sh \
CI "$HISTORY_REPAIR_CANDIDATE_SHA" 0 \
--event workflow_dispatch \
--job Builds \
--job Required \
--job Qualified \
--artifact artifact-build-plan \
--artifact oliphaunt-release-candidate
- name: Download exact qualified history-repair candidate
id: history_repair_candidate_download
if: ${{ steps.release_intent.outputs.history_repair == 'true' }}
env:
GH_REPO: ${{ github.repository }}
GH_TOKEN: ${{ github.token }}
HISTORY_REPAIR_ARTIFACT_METADATA: ${{ steps.history_repair_qualification.outputs.artifact_metadata_json }}
HISTORY_REPAIR_CANDIDATE_SHA: ${{ steps.release_intent.outputs.history_repair_candidate_sha }}
HISTORY_REPAIR_RUN_ID: ${{ steps.history_repair_qualification.outputs.run_id }}
run: |
node .github/scripts/download-build-artifacts.mjs \
CI "$HISTORY_REPAIR_CANDIDATE_SHA" target/history-repair-candidate \
--run-id "$HISTORY_REPAIR_RUN_ID" \
--artifact-metadata-json "$HISTORY_REPAIR_ARTIFACT_METADATA" \
--artifact artifact-build-plan \
--artifact oliphaunt-release-candidate
- name: Verify qualified history-repair tree binding
id: history_repair_candidate_binding
if: ${{ steps.release_intent.outputs.history_repair == 'true' }}
env:
CI_RUN_ID: ${{ steps.history_repair_qualification.outputs.run_id }}
HISTORY_REPAIR_CANDIDATE_SHA: ${{ steps.release_intent.outputs.history_repair_candidate_sha }}
HISTORY_REPAIR_HEAD_SHA: ${{ github.sha }}
run: |
node .github/scripts/verify-history-repair-candidate.mjs \
target/history-repair-candidate/oliphaunt-release-candidate.json \
--plan target/history-repair-candidate/ci-plan.json
- name: Require normalized generated release
id: generated_release_readiness
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref == 'release-please--branches--main' && github.event.pull_request.head.repo.full_name == github.repository }}
run: tools/dev/bun.sh tools/release/sync-release-pr.mjs --check-generated-release
check-targets:
name: Checks / ${{ matrix.label }}
needs:
- affected
if: ${{ needs.affected.outputs.check_count != '0' }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.check_matrix) }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
if: ${{ matrix.requires_rust }}
uses: ./.github/actions/setup-rust
- name: Set up Android
if: ${{ matrix.requires_android_sdk }}
uses: ./.github/actions/setup-android
- name: Install pinned maintainer tools
if: ${{ matrix.requires_maintainer_tools }}
run: tools/dev/bootstrap-tools.sh
- name: Run check shard
env:
MOON_TARGET_MATRIX_JSON: ${{ matrix.targets_json }}
run: bun .github/scripts/run-moon-target-matrix.mjs
policy-targets:
name: Policy
needs:
- affected
if: ${{ needs.affected.outputs.policy_count != '0' }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up Android
if: ${{ needs.affected.outputs.policy_requires_android_sdk == 'true' }}
uses: ./.github/actions/setup-android
- name: Install pinned maintainer tools
if: ${{ needs.affected.outputs.policy_requires_maintainer_tools == 'true' }}
run: tools/dev/bootstrap-tools.sh
- name: Run selected policy targets
env:
MOON_TARGET_MATRIX_JSON: ${{ needs.affected.outputs.policy_matrix }}
run: bun .github/scripts/run-moon-target-matrix.mjs
release-metadata-portability:
name: Checks / release metadata (macOS)
needs:
- affected
runs-on: macos-26
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up pinned Node.js
id: setup_release_metadata_node
uses: ./.github/actions/setup-node-runtime
with:
node-version: ${{ env.NODE_VERSION }}
- name: Set up Moon
id: setup_release_metadata_moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
id: setup_release_metadata_rust
uses: ./.github/actions/setup-rust
- name: Configure macOS release toolchains
id: configure_release_metadata_toolchains
run: bash .github/scripts/configure-macos-release-toolchains.sh --android
- name: Validate release metadata on the publication host
id: release_metadata_portability
run: tools/dev/bun.sh tools/release/release-check.mjs
checks:
name: Checks
if: ${{ always() }}
needs:
- affected
- check-targets
- policy-targets
- release-metadata-portability
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check selected check and policy jobs
id: selected_checks_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
SELECTED_JOBS_JSON: ${{ needs.affected.outputs.check_jobs }}
GATE_LABEL: selected check and policy jobs
run: bun .github/scripts/check-ci-gate.mjs selected
- name: Check publication-host release metadata
id: release_metadata_portability_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
REQUIRED_JOBS_JSON: '["release-metadata-portability"]'
GATE_LABEL: publication-host release metadata
run: bun .github/scripts/check-ci-gate.mjs required
test-targets:
name: Tests / ${{ matrix.target }}
needs:
- affected
if: ${{ needs.affected.outputs.test_count != '0' }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.test_matrix) }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
if: ${{ matrix.requires_rust }}
uses: ./.github/actions/setup-rust
with:
tools: cargo-nextest@0.9.137,cargo-llvm-cov@0.8.7
- name: Set up Android
if: ${{ matrix.requires_android_sdk }}
uses: ./.github/actions/setup-android
- name: Install pinned maintainer tools
if: ${{ matrix.requires_maintainer_tools }}
run: tools/dev/bootstrap-tools.sh
- name: Run test target
env:
MOON_TARGET: ${{ matrix.target }}
MOON_UPSTREAM: ${{ matrix.upstream }}
run: .github/scripts/run-moon-targets.sh --upstream "$MOON_UPSTREAM" "$MOON_TARGET"
tests:
name: Tests
if: ${{ always() }}
needs:
- affected
- test-targets
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check selected test jobs
id: selected_tests_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
SELECTED_JOBS_JSON: ${{ needs.affected.outputs.test_jobs }}
GATE_LABEL: selected test jobs
run: bun .github/scripts/check-ci-gate.mjs selected
extension-artifacts-native:
name: Builds / extension-native (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'extension-artifacts-native') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.extension_artifacts_native_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 135
env:
CCACHE_DIR: ${{ github.workspace }}/.ci-cache/ccache/native-extension/${{ matrix.target }}
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_COMPILERCHECK: content
CCACHE_COMPRESS: "true"
OLIPHAUNT_CCACHE_MAX_SIZE: ${{ matrix.target == 'ios-xcframework' && '512M' || '2G' }}
OLIPHAUNT_CCACHE_ZERO_STATS: "1"
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Apple
if: ${{ runner.os == 'macOS' }}
uses: ./.github/actions/setup-apple
- name: Set up Android
if: ${{ startsWith(matrix.target, 'android-') }}
uses: ./.github/actions/setup-android
with:
gradle-cache: "false"
- name: Set up MSVC
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-msvc
- name: Verify Windows VC runtime atomic staging
if: ${{ runner.os == 'Windows' }}
run: tools/dev/bun.sh test tools/release/windows-vc-runtime-closure.test.mjs
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Prepare native compiler cache path
if: ${{ matrix.target == 'ios-xcframework' }}
run: mkdir -p "$CCACHE_DIR"
- name: Restore native compiler cache
id: restore_ios_extension_ccache
if: ${{ matrix.target == 'ios-xcframework' }}
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: ${{ env.CCACHE_DIR }}
key: liboliphaunt-native-extension-ccache-v2-${{ matrix.target }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/actions/setup-apple/**', '.github/scripts/setup-native-build-tools.sh', 'src/postgres/versions/18/**', 'src/sources/third-party/shared/**', 'src/sources/third-party/native/**', 'src/shared/extension-runtime-contract/**', 'src/extensions/catalog/extensions.source.json', 'src/extensions/contrib/postgres18.toml', 'src/extensions/external/*/source.toml', 'src/extensions/external/*/recipe.toml', 'src/extensions/external/*/deps.toml', 'src/extensions/external/*/dependencies/**/source.toml', 'src/extensions/external/*/dependencies/**/recipe.toml', 'src/extensions/external/*/patches/**', 'src/extensions/external/*/dependencies/**/patches/**', 'src/extensions/generated/extensions.catalog.json', 'src/extensions/generated/extensions.build-plan.json', 'src/extensions/generated/contrib-build.tsv', 'src/extensions/generated/pgxs-build.tsv', 'src/extensions/generated/mobile/static-extensions.tsv', 'src/extensions/generated/mobile/qualification-static-extensions.tsv', 'src/extensions/generated/mobile/static-registry.json', 'src/runtimes/liboliphaunt/native/bin/build-*.sh', '!src/runtimes/liboliphaunt/native/bin/*.test.sh', 'src/runtimes/liboliphaunt/native/bin/build-postgres18-windows.ps1', 'src/runtimes/liboliphaunt/native/bin/build-output.bash', 'src/runtimes/liboliphaunt/native/bin/common.sh', 'src/runtimes/liboliphaunt/native/bin/fetch-pinned-git-checkout.sh', 'src/runtimes/liboliphaunt/native/bin/icu.sh', 'src/runtimes/liboliphaunt/native/bin/mobile-*.sh', 'src/runtimes/liboliphaunt/native/bin/postgis-dependency-cache.sh', 'src/runtimes/liboliphaunt/native/bin/postgres-backend-objects.mk', 'src/runtimes/liboliphaunt/native/crates/tools/Cargo.toml', 'src/runtimes/liboliphaunt/native/crates/tools/build.rs', 'src/runtimes/liboliphaunt/native/crates/tools/src/**', 'src/runtimes/liboliphaunt/native/include/**', 'src/runtimes/liboliphaunt/native/patches/**', 'src/runtimes/liboliphaunt/native/portable-uuid/**', 'src/runtimes/liboliphaunt/native/postgres18/**', 'src/runtimes/liboliphaunt/native/src/**') }}
restore-keys: |
liboliphaunt-native-extension-ccache-v2-${{ matrix.target }}-${{ runner.os }}-${{ runner.arch }}-
- name: Configure native compiler cache
run: .github/scripts/setup-native-build-tools.sh
- name: Build native exact-extension artifacts
timeout-minutes: 120
env:
OLIPHAUNT_EXTENSION_PRODUCTS: ${{ matrix.extensions_csv }}
OLIPHAUNT_EXTENSION_TARGET: ${{ matrix.target }}
OLIPHAUNT_EXPECTED_QUALIFICATION_SQL_NAMES: ${{ matrix.qualification_sql_names_csv }}
OLIPHAUNT_BISON: /opt/homebrew/opt/bison/bin/bison
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh extension-artifacts-native
- name: Validate produced iOS extension carriers
id: validate_ios_extension_carriers
if: ${{ matrix.target == 'ios-xcframework' }}
run: node tools/release/validate-ios-carrier-zips.mjs --root target/extensions/native/release-assets/ios-xcframework
- name: Save bounded iOS exact-extension compiler cache
id: save_ios_extension_ccache
if: ${{ matrix.target == 'ios-xcframework' && env.HEAVY_CACHE_SAVE_IF == 'true' && steps.restore_ios_extension_ccache.outputs.cache-hit != 'true' }}
continue-on-error: true
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: ${{ env.CCACHE_DIR }}
key: liboliphaunt-native-extension-ccache-v2-${{ matrix.target }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/actions/setup-apple/**', '.github/scripts/setup-native-build-tools.sh', 'src/postgres/versions/18/**', 'src/sources/third-party/shared/**', 'src/sources/third-party/native/**', 'src/shared/extension-runtime-contract/**', 'src/extensions/catalog/extensions.source.json', 'src/extensions/contrib/postgres18.toml', 'src/extensions/external/*/source.toml', 'src/extensions/external/*/recipe.toml', 'src/extensions/external/*/deps.toml', 'src/extensions/external/*/dependencies/**/source.toml', 'src/extensions/external/*/dependencies/**/recipe.toml', 'src/extensions/external/*/patches/**', 'src/extensions/external/*/dependencies/**/patches/**', 'src/extensions/generated/extensions.catalog.json', 'src/extensions/generated/extensions.build-plan.json', 'src/extensions/generated/contrib-build.tsv', 'src/extensions/generated/pgxs-build.tsv', 'src/extensions/generated/mobile/static-extensions.tsv', 'src/extensions/generated/mobile/qualification-static-extensions.tsv', 'src/extensions/generated/mobile/static-registry.json', 'src/runtimes/liboliphaunt/native/bin/build-*.sh', '!src/runtimes/liboliphaunt/native/bin/*.test.sh', 'src/runtimes/liboliphaunt/native/bin/build-postgres18-windows.ps1', 'src/runtimes/liboliphaunt/native/bin/build-output.bash', 'src/runtimes/liboliphaunt/native/bin/common.sh', 'src/runtimes/liboliphaunt/native/bin/fetch-pinned-git-checkout.sh', 'src/runtimes/liboliphaunt/native/bin/icu.sh', 'src/runtimes/liboliphaunt/native/bin/mobile-*.sh', 'src/runtimes/liboliphaunt/native/bin/postgis-dependency-cache.sh', 'src/runtimes/liboliphaunt/native/bin/postgres-backend-objects.mk', 'src/runtimes/liboliphaunt/native/crates/tools/Cargo.toml', 'src/runtimes/liboliphaunt/native/crates/tools/build.rs', 'src/runtimes/liboliphaunt/native/crates/tools/src/**', 'src/runtimes/liboliphaunt/native/include/**', 'src/runtimes/liboliphaunt/native/patches/**', 'src/runtimes/liboliphaunt/native/portable-uuid/**', 'src/runtimes/liboliphaunt/native/postgres18/**', 'src/runtimes/liboliphaunt/native/src/**') }}
- name: Show native compiler cache stats
if: ${{ always() && runner.os != 'Windows' }}
run: |
if command -v ccache >/dev/null 2>&1; then
ccache --show-stats
else
echo "ccache was not installed before the build stopped"
fi
- name: Upload native exact-extension artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-extension-artifacts-${{ matrix.target }}
path: target/extensions/native/release-assets
if-no-files-found: error
- name: Upload native exact-extension build logs
id: upload_native_extension_logs
if: ${{ failure() || cancelled() }}
timeout-minutes: 5
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-extension-logs-${{ matrix.target }}
path: |
target/liboliphaunt-mobile-extension-ci/**/*.log
target/liboliphaunt-mobile-extension-release/**/*.log
target/liboliphaunt-mobile-extension-qualification/**/*.log
target/liboliphaunt-mobile-extension-release/ios-xcframework/ios-simulator/*.log
target/liboliphaunt-mobile-extension-release/ios-xcframework/ios-device/*.log
target/liboliphaunt-pg18-extension-release/**/*.log
target/liboliphaunt-pg18-*-extension-release/**/*.log
target/liboliphaunt-pg18-extension-qualification*/**/*.log
target/liboliphaunt-pg18-*-extension-qualification/**/*.log
/tmp/liboliphaunt-ci-*-extensions.log
/tmp/liboliphaunt-release-*-extensions.log
/tmp/liboliphaunt-ci-extension-assets-fetch.log
/tmp/liboliphaunt-release-extension-assets-fetch.log
if-no-files-found: warn
extension-artifacts-wasix:
name: Builds / extension-wasix (${{ matrix.target }})
needs:
- affected
- liboliphaunt-wasix-runtime
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'extension-artifacts-wasix') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.extension_artifacts_wasix_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 120
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download portable WASIX runtime outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-runtime-portable
path: .
- name: Verify publication-deferred WASIX candidate build outputs
env:
OLIPHAUNT_EXTENSION_TARGET: ${{ matrix.target }}
run: >-
tools/dev/bun.sh tools/release/verify-extension-qualification-build.mjs
--family wasix
--target "$OLIPHAUNT_EXTENSION_TARGET"
--asset-root target/oliphaunt-wasix/assets
- name: Build WASIX exact-extension artifacts
env:
OLIPHAUNT_EXTENSION_PRODUCTS: ${{ matrix.extensions_csv }}
OLIPHAUNT_EXTENSION_TARGET: ${{ matrix.target }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh extension-artifacts-wasix
- name: Upload WASIX exact-extension artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-wasix-extension-artifacts-${{ matrix.target }}
path: target/extensions/wasix/release-assets
if-no-files-found: error
extension-packages:
name: Builds / extension-packages
needs:
- affected
- extension-artifacts-native
- extension-artifacts-wasix
- liboliphaunt-native-release-assets
- liboliphaunt-wasix-aot
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-native.result == 'success' && needs.extension-artifacts-wasix.result == 'success' && needs.liboliphaunt-native-release-assets.result == 'success' && needs.liboliphaunt-wasix-aot.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'extension-packages') }}
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download aggregate liboliphaunt native release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets
path: target/liboliphaunt/release-assets
- name: Download native exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-native-extension-artifacts-*
path: target/extensions/native/release-assets
merge-multiple: true
- name: Download WASIX exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-wasix-extension-artifacts-*
path: target/extensions/wasix/release-assets
merge-multiple: true
- name: Download WASIX exact-extension AOT artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-wasix-extension-aot-*
path: target/extensions/wasix/aot-artifacts
merge-multiple: true
- name: Assemble exact-extension product packages
env:
OLIPHAUNT_EXTENSION_PACKAGE_PRODUCTS: ${{ needs.affected.outputs.extension_package_products_csv }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-moon-targets.sh --upstream none extension-packages:assemble-release
- name: Qualify exact-extension registry carriers
env:
OLIPHAUNT_REGISTRY_CARRIER_PRODUCTS_JSON: ${{ needs.affected.outputs.extension_package_products }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-moon-targets.sh --upstream none extension-packages:registry-carrier-qualification
- name: Upload exact-extension package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-extension-package-artifacts
path: target/extension-artifacts
if-no-files-found: error
mobile-extension-packages:
name: Builds / mobile-extension-packages
needs:
- affected
- extension-artifacts-native
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-native.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'mobile-extension-packages') }}
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download native exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-native-extension-artifacts-*
path: target/extensions/native/release-assets
merge-multiple: true
- name: Build mobile exact-extension package artifacts
env:
OLIPHAUNT_EXTENSION_PACKAGE_NATIVE_TARGETS: ${{ needs.affected.outputs.mobile_extension_package_native_targets_csv }}
OLIPHAUNT_EXTENSION_PACKAGE_PRODUCTS: ${{ needs.affected.outputs.extension_package_products_csv }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh mobile-extension-packages
- name: Upload mobile exact-extension package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-mobile-extension-package-artifacts
path: target/extension-artifacts
if-no-files-found: error
liboliphaunt-native-desktop:
name: Builds / native-runtime-desktop (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-native-desktop') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.liboliphaunt_native_desktop_runtime_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 120
env:
CCACHE_DIR: ${{ github.workspace }}/.ci-cache/ccache/native-runtime/${{ matrix.target }}
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_COMPILERCHECK: content
CCACHE_COMPRESS: "true"
OLIPHAUNT_CCACHE_ZERO_STATS: "1"
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up MSVC
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-msvc
- name: Prepare native build paths
env:
NATIVE_BUILD_ROOT: ${{ matrix.build-root }}
run: |
mkdir -p "$NATIVE_BUILD_ROOT"
if [[ "$RUNNER_OS" != "Windows" ]]; then
mkdir -p "$CCACHE_DIR"
fi
- name: Configure native compiler cache
run: .github/scripts/setup-native-build-tools.sh 2G
- name: Build liboliphaunt native runtime
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-native-desktop
- name: Package liboliphaunt macOS release asset
if: ${{ startsWith(matrix.target, 'macos-') }}
env:
OLIPHAUNT_RELEASE_FETCH_ASSETS: "0"
run: tools/release/package-liboliphaunt-macos-assets.sh
- name: Package portable ICU data for exact consumers
if: ${{ matrix.target == 'macos-arm64' }}
env:
NATIVE_BUILD_ROOT: ${{ matrix.build-root }}
run: |
tools/release/package-liboliphaunt-icu-data.sh \
"$NATIVE_BUILD_ROOT/icu/share/icu" \
target/liboliphaunt/portable-icu-assets
- name: Package liboliphaunt Linux release asset
if: ${{ startsWith(matrix.target, 'linux-') }}
env:
OLIPHAUNT_RELEASE_FETCH_ASSETS: "0"
run: tools/release/package-liboliphaunt-linux-assets.sh
- name: Package liboliphaunt Windows release asset
if: ${{ startsWith(matrix.target, 'windows-') }}
shell: pwsh
env:
OLIPHAUNT_RELEASE_FETCH_ASSETS: "0"
run: ./tools/release/package-liboliphaunt-windows-assets.ps1
- name: Upload liboliphaunt release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-release-assets-${{ matrix.target }}
path: target/liboliphaunt/release-assets
if-no-files-found: error
- name: Upload portable ICU data for exact consumers
if: ${{ matrix.target == 'macos-arm64' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-icu-data
path: target/liboliphaunt/portable-icu-assets
if-no-files-found: error
- name: Show native compiler cache stats
if: ${{ always() }}
env:
NATIVE_TARGET: ${{ matrix.target }}
run: |
if [[ "$NATIVE_TARGET" != windows-* ]] && command -v ccache >/dev/null 2>&1; then
ccache --show-stats
fi
- name: Upload liboliphaunt build logs
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-logs-${{ matrix.target }}
path: |
${{ matrix.build-root }}/*.log
target/liboliphaunt/**/*.log
if-no-files-found: ignore
liboliphaunt-native-android:
name: Builds / native-runtime-android (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-native-android') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.liboliphaunt_native_android_runtime_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 120
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up Android
uses: ./.github/actions/setup-android
with:
gradle-cache: "false"
native-ccache: "true"
- name: Prepare native build path
env:
NATIVE_BUILD_ROOT: ${{ matrix.build-root }}
run: mkdir -p "$NATIVE_BUILD_ROOT"
- name: Configure native compiler cache
run: .github/scripts/setup-native-build-tools.sh 2G
- name: Build liboliphaunt Android target
env:
OLIPHAUNT_CI_TARGET: ${{ matrix.target }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-native-android
- name: Package liboliphaunt Android release asset
env:
OLIPHAUNT_CI_TARGET: ${{ matrix.target }}
run: tools/release/package-liboliphaunt-mobile-assets.sh "$OLIPHAUNT_CI_TARGET"
- name: Upload liboliphaunt release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-release-assets-${{ matrix.target }}
path: target/liboliphaunt/release-assets
if-no-files-found: error
- name: Upload liboliphaunt Android target artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-target-${{ matrix.target }}
path: ${{ matrix.ci-artifact-root }}
if-no-files-found: error
- name: Show native compiler cache stats
if: ${{ always() }}
run: |
if command -v ccache >/dev/null 2>&1; then
ccache --show-stats
fi
- name: Upload liboliphaunt Android build logs
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-logs-${{ matrix.target }}
path: |
${{ matrix.build-root }}/*.log
target/liboliphaunt/**/*.log
if-no-files-found: ignore
liboliphaunt-native-ios:
name: Builds / native-runtime-ios (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-native-ios') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.liboliphaunt_native_ios_runtime_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 120
env:
CCACHE_DIR: ${{ github.workspace }}/.ci-cache/ccache/native-runtime/${{ matrix.target }}
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_COMPILERCHECK: content
CCACHE_COMPRESS: "true"
OLIPHAUNT_CCACHE_ZERO_STATS: "1"
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Apple
uses: ./.github/actions/setup-apple
- name: Test iOS app artifact transport
id: ios_app_transport_test
run: node src/sdks/react-native/tools/ios-app-transport.test.mjs
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Prepare native build paths
env:
NATIVE_BUILD_ROOT: ${{ matrix.build-root }}
run: mkdir -p "$CCACHE_DIR" "$NATIVE_BUILD_ROOT"
- name: Configure native compiler cache
run: .github/scripts/setup-native-build-tools.sh 2G
- name: Build liboliphaunt iOS target
env:
OLIPHAUNT_CI_TARGET: ${{ matrix.target }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-native-ios
- name: Package liboliphaunt iOS release asset
env:
OLIPHAUNT_CI_TARGET: ${{ matrix.target }}
run: tools/release/package-liboliphaunt-mobile-assets.sh "$OLIPHAUNT_CI_TARGET"
- name: Validate produced iOS base carrier
id: validate_ios_base_carrier
run: node tools/release/validate-ios-carrier-zips.mjs --root target/liboliphaunt/release-assets
- name: Upload liboliphaunt release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-release-assets-${{ matrix.target }}
path: target/liboliphaunt/release-assets
if-no-files-found: error
- name: Upload liboliphaunt iOS target artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-target-${{ matrix.target }}
path: ${{ matrix.ci-artifact-root }}
if-no-files-found: error
- name: Show native compiler cache stats
if: ${{ always() }}
run: |
if command -v ccache >/dev/null 2>&1; then
ccache --show-stats
fi
- name: Upload liboliphaunt iOS build logs
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-logs-${{ matrix.target }}
path: |
${{ matrix.build-root }}/*.log
${{ matrix.build-root }}/logs/*.log
${{ matrix.build-root }}/**/*.log
target/liboliphaunt-ios-simulator/*.log
target/liboliphaunt-ios-simulator/**/*.log
target/liboliphaunt-ios-device/*.log
target/liboliphaunt-ios-device/**/*.log
target/liboliphaunt/**/*.log
if-no-files-found: ignore
liboliphaunt-native-release-assets:
name: Builds / native-runtime-release-assets
needs:
- affected
- liboliphaunt-native-android
- liboliphaunt-native-desktop
- liboliphaunt-native-ios
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-native-release-assets') }}
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download liboliphaunt target release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-native-release-assets-*
path: target/liboliphaunt/release-assets
merge-multiple: true
- name: Package aggregate liboliphaunt release assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-moon-targets.sh --upstream none liboliphaunt-native:release-assets
- name: Qualify aggregate liboliphaunt registry carriers
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-moon-targets.sh --upstream none liboliphaunt-native:registry-carrier-qualification
- name: Upload aggregate liboliphaunt release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-native-release-assets
path: target/liboliphaunt/release-assets
if-no-files-found: error
rust-sdk-package:
name: Builds / rust-sdk
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'rust-sdk-package') }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
with:
components: clippy,llvm-tools-preview
tools: cargo-nextest@0.9.137,cargo-llvm-cov@0.8.7
- name: Build Rust SDK package artifacts
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh rust-sdk-package
- name: Upload Rust SDK package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-rust-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-rust
if-no-files-found: error
- name: Build native extension lifecycle proof runner
run: cargo build --offline --locked --release -p oliphaunt-native-extension-proof
- name: Stage native extension lifecycle proof runner
run: |
install -D -m 0755 \
target/release/oliphaunt-native-extension-proof \
target/native-extension-proof/oliphaunt-native-extension-proof
- name: Upload native extension lifecycle proof runner
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-native-extension-proof-linux-x64-gnu
path: target/native-extension-proof/oliphaunt-native-extension-proof
if-no-files-found: error
broker-runtime:
name: Builds / broker-runtime (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'broker-runtime') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.broker_runtime_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up MSVC
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-msvc
- name: Build broker runtime release asset
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh broker-runtime
- name: Upload broker release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-broker-release-assets-${{ matrix.target }}
path: target/oliphaunt-broker/release-assets
if-no-files-found: error
node-direct:
name: Builds / node-direct (${{ matrix.target }})
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'node-direct') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.node_direct_runtime_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up exact Node and pnpm for Windows standard-user proof
id: windows_exact_node_pnpm
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-node-pnpm
- name: Set up exact Bun for Windows standard-user proof
id: windows_exact_bun
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up exact npm runtime for Windows standard-user proof
id: windows_exact_npm
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-npm-publisher
with:
npm-version: ${{ env.NPM_VERSION }}
- name: Set up exact Deno for Windows standard-user proof
id: windows_exact_deno
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-deno
with:
deno-version: ${{ env.DENO_VERSION }}
- name: Verify Windows package-manager shim argument transport
if: ${{ runner.os == 'Windows' }}
env:
OLIPHAUNT_WINDOWS_STANDARD_USER_EXACT_NPM_PROOF: "1"
run: tools/dev/bun.sh test tools/release/windows-exact-candidate-command.test.mjs
- name: Verify Windows exact-consumer tools under a standard-user token early
if: ${{ runner.os == 'Windows' }}
env:
BUN_EXECUTION_ENVELOPE: ${{ steps.windows_exact_bun.outputs.execution-envelope }}
DENO_EXECUTION_ENVELOPE: ${{ steps.windows_exact_deno.outputs.execution-envelope }}
NPM_EXECUTION_ENVELOPE: ${{ steps.windows_exact_npm.outputs.execution-envelope }}
NODE_EXECUTION_ENVELOPE: ${{ steps.windows_exact_node_pnpm.outputs.node-execution-envelope }}
PNPM_EXECUTION_ENVELOPE: ${{ steps.windows_exact_node_pnpm.outputs.pnpm-execution-envelope }}
run: |
command -v cygpath >/dev/null 2>&1
bun_path="$(cygpath -w "$(command -v bun)")"
launcher="$(cygpath -w tools/release/run-windows-standard-user-exact-candidate.ps1)"
repository_root="$(cygpath -w "$PWD")"
MSYS2_ARG_CONV_EXCL='*' pwsh.exe \
-NoLogo \
-NoProfile \
-NonInteractive \
-ExecutionPolicy Bypass \
-File "$launcher" \
-SelfTest \
-RepositoryRoot "$repository_root" \
-BunPath "$bun_path" \
-BunEnvelope "$BUN_EXECUTION_ENVELOPE" \
-DenoEnvelope "$DENO_EXECUTION_ENVELOPE" \
-NpmEnvelope "$NPM_EXECUTION_ENVELOPE" \
-NodeEnvelope "$NODE_EXECUTION_ENVELOPE" \
-PnpmEnvelope "$PNPM_EXECUTION_ENVELOPE"
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up MSVC
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-msvc
- name: Build Node direct release asset
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh node-direct
- name: Upload Node direct release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-node-direct-release-assets-${{ matrix.target }}
path: target/oliphaunt-node-direct/release-assets
if-no-files-found: error
- name: Upload Node direct optional npm package
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-node-direct-npm-package-${{ matrix.target }}
path: target/oliphaunt-node-direct/npm-packages/*.tgz
if-no-files-found: error
broker-release-assets:
name: Builds / broker-release-assets
needs:
- affected
- broker-runtime
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.broker-runtime.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'broker-release-assets') }}
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Download broker target release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: oliphaunt-broker-release-assets-*
path: target/oliphaunt-broker/release-assets
merge-multiple: true
- name: Verify aggregate broker release assets
id: verify_aggregate_broker_release_assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh broker-release-assets
node-direct-release-assets:
name: Builds / node-direct-release-assets
needs:
- affected
- node-direct
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.node-direct.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'node-direct-release-assets') }}
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Download Node direct target release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: oliphaunt-node-direct-release-assets-*
path: target/oliphaunt-node-direct/release-assets
merge-multiple: true
- name: Download Node direct optional npm packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: oliphaunt-node-direct-npm-package-*
path: target/oliphaunt-node-direct/npm-packages
merge-multiple: true
- name: Verify aggregate Node direct release assets
id: verify_aggregate_node_direct_release_assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh node-direct-release-assets
swift-sdk-package:
name: Builds / swift-sdk
needs:
- affected
- liboliphaunt-native-ios
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'swift-sdk-package') }}
runs-on: macos-26
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Apple
uses: ./.github/actions/setup-apple
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download Apple liboliphaunt release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-ios-xcframework
path: target/liboliphaunt/release-assets
- name: Build Swift SDK package artifacts
env:
OLIPHAUNT_SWIFT_RELEASE_ASSET_DIR: ${{ github.workspace }}/target/liboliphaunt/release-assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh swift-sdk-package
- name: Run exact-candidate Swift package consumer
id: swift_exact_candidate_consumer
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_SWIFT_NATIVE_ASSET_DIR: ${{ github.workspace }}/target/liboliphaunt/release-assets
OLIPHAUNT_SWIFT_SDK_ARTIFACT_DIR: ${{ github.workspace }}/target/sdk-artifacts/oliphaunt-swift
run: |
mkdir -p target/exact-candidate-consumer/swift
src/sdks/swift/tools/check-release-consumer.sh 2>&1 \
| tee target/exact-candidate-consumer/swift/proof.log
- name: Write exact-candidate Swift consumer receipt
id: swift_exact_candidate_receipt
if: ${{ always() && steps.swift_exact_candidate_consumer.outcome != 'skipped' }}
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
PROOF_OUTCOME: ${{ steps.swift_exact_candidate_consumer.outcome }}
run: |
candidate_tree="$(git rev-parse 'HEAD^{tree}')"
tools/dev/bun.sh tools/release/write-sdk-exact-candidate-receipt.mjs \
--sdk swift \
--candidate-sha "$CI_HEAD_SHA" \
--candidate-tree "$candidate_tree" \
--workflow-sha "$GITHUB_SHA" \
--proof-outcome "$PROOF_OUTCOME" \
--log target/exact-candidate-consumer/swift/proof.log \
--input native-assets=target/liboliphaunt/release-assets \
--input swift-sdk=target/sdk-artifacts/oliphaunt-swift \
--output target/exact-candidate-consumer/swift/receipt.json
- name: Upload exact-candidate Swift consumer evidence
id: swift_exact_candidate_evidence
if: ${{ always() && steps.swift_exact_candidate_consumer.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-swift-exact-candidate-consumer-evidence
path: target/exact-candidate-consumer/swift
if-no-files-found: error
retention-days: 30
- name: Upload Swift SDK package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-swift-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-swift
if-no-files-found: error
kotlin-sdk-package:
name: Builds / kotlin-sdk
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'kotlin-sdk-package') }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Android
uses: ./.github/actions/setup-android
with:
gradle-cache-save-if: ${{ env.HEAVY_CACHE_SAVE_IF }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Build Kotlin SDK package artifacts
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh kotlin-sdk-package
- name: Upload Kotlin SDK package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-kotlin-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-kotlin
if-no-files-found: error
kotlin-maven-staging:
name: Builds / kotlin-maven-staging
needs:
- affected
- kotlin-sdk-package
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.kotlin-sdk-package.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'kotlin-maven-staging') }}
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Download exact same-run Kotlin SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-kotlin-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-kotlin
- name: Validate exact Kotlin Maven Central staging closure
id: kotlin_maven_staging
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh kotlin-maven-staging
react-native-sdk-package:
name: Builds / react-native-sdk
needs:
- affected
- liboliphaunt-native-ios
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'react-native-sdk-package') }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download Apple liboliphaunt release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-ios-xcframework
path: target/liboliphaunt/release-assets
- name: Build React Native SDK package artifacts
env:
OLIPHAUNT_REACT_NATIVE_IOS_RELEASE_ASSET_DIR: ${{ github.workspace }}/target/liboliphaunt/release-assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh react-native-sdk-package
- name: Upload React Native SDK package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-react-native-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-react-native
if-no-files-found: error
js-sdk-package:
name: Builds / js-sdk
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'js-sdk-package') }}
runs-on: ubuntu-24.04
timeout-minutes: 60
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Deno
uses: ./.github/actions/setup-deno
with:
deno-version: ${{ env.DENO_VERSION }}
- name: Build TypeScript SDK package artifacts
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh js-sdk-package
- name: Upload JS SDK package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-js-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-js
if-no-files-found: error
js-sdk-exact-candidate-consumer:
name: Builds / js-sdk-exact-candidate (${{ matrix.target }})
needs:
- affected
- extension-artifacts-native
- js-sdk-package
- liboliphaunt-native-desktop
- liboliphaunt-native-ios
- broker-runtime
- node-direct
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-native.result == 'success' && needs.js-sdk-package.result == 'success' && needs.liboliphaunt-native-desktop.result == 'success' && needs.liboliphaunt-native-ios.result == 'success' && needs.broker-runtime.result == 'success' && needs.node-direct.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'js-sdk-exact-candidate-consumer') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.js_exact_candidate_consumer_matrix) }}
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Node and pnpm
id: exact_node_pnpm
uses: ./.github/actions/setup-node-pnpm
- name: Set up Bun
id: exact_bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up exact npm runtime
id: exact_npm
uses: ./.github/actions/setup-npm-publisher
with:
npm-version: ${{ env.NPM_VERSION }}
- name: Set up Deno
id: exact_deno
uses: ./.github/actions/setup-deno
with:
deno-version: ${{ env.DENO_VERSION }}
- name: Download same-run target native runtime and tools
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: ${{ matrix.native_artifact }}
path: target/js-exact-candidate-input/native
- name: Download same-run portable ICU data
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-icu-data
path: target/js-exact-candidate-input/native
- name: Download same-run Apple base carrier
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-ios-xcframework
path: target/js-exact-candidate-input/ios
- name: Download same-run target broker
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: ${{ matrix.broker_artifact }}
path: target/js-exact-candidate-input/broker
- name: Download same-run target Node direct package
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: ${{ matrix.node_artifact }}
path: target/js-exact-candidate-input/node
- name: Download same-run target exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: ${{ matrix.extension_artifact }}
path: target/js-exact-candidate-input/extensions
- name: Download same-run Apple exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-extension-artifacts-ios-xcframework
path: target/js-exact-candidate-input/ios-extensions
- name: Download same-run TypeScript package candidates
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-js-sdk-package-artifacts
path: target/js-exact-candidate-input/js
- name: Consume exact TypeScript candidate
id: js_exact_candidate_consumer
timeout-minutes: 70
env:
CANDIDATE_OUTPUT_ROOT: target/js-exact-candidate-consumer/${{ matrix.target }}
CANDIDATE_TARGET: ${{ matrix.target }}
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
BUN_EXECUTION_ENVELOPE: ${{ steps.exact_bun.outputs.execution-envelope }}
DENO_EXECUTION_ENVELOPE: ${{ steps.exact_deno.outputs.execution-envelope }}
NPM_EXECUTION_ENVELOPE: ${{ steps.exact_npm.outputs.execution-envelope }}
NODE_EXECUTION_ENVELOPE: ${{ steps.exact_node_pnpm.outputs.node-execution-envelope }}
PNPM_EXECUTION_ENVELOPE: ${{ steps.exact_node_pnpm.outputs.pnpm-execution-envelope }}
run: |
if [[ "${RUNNER_OS:-}" == "Windows" ]]; then
command -v cygpath >/dev/null 2>&1
bun_path="$(cygpath -w "$(command -v bun)")"
repository_root="$(cygpath -w "$PWD")"
output_root="$(cygpath -w "$CANDIDATE_OUTPUT_ROOT")"
launcher="$(cygpath -w tools/release/run-windows-standard-user-exact-candidate.ps1)"
MSYS2_ARG_CONV_EXCL='*' pwsh.exe \
-NoLogo \
-NoProfile \
-NonInteractive \
-ExecutionPolicy Bypass \
-File "$launcher" \
-RepositoryRoot "$repository_root" \
-OutputRoot "$output_root" \
-BunPath "$bun_path" \
-BunEnvelope "$BUN_EXECUTION_ENVELOPE" \
-DenoEnvelope "$DENO_EXECUTION_ENVELOPE" \
-NpmEnvelope "$NPM_EXECUTION_ENVELOPE" \
-NodeEnvelope "$NODE_EXECUTION_ENVELOPE" \
-PnpmEnvelope "$PNPM_EXECUTION_ENVELOPE" \
-CandidateSha "$CI_HEAD_SHA" \
-Target "$CANDIDATE_TARGET"
else
bun tools/release/js-exact-candidate-consumer.mjs \
--candidate-sha "$CI_HEAD_SHA" \
--target "$CANDIDATE_TARGET" \
--artifact-root target/js-exact-candidate-input/native \
--artifact-root target/js-exact-candidate-input/broker \
--artifact-root target/js-exact-candidate-input/node \
--artifact-root target/js-exact-candidate-input/extensions \
--ios-extension-artifact-root target/js-exact-candidate-input/ios-extensions \
--artifact-root target/js-exact-candidate-input/js \
--artifact-root target/js-exact-candidate-input/ios \
--output-root "$CANDIDATE_OUTPUT_ROOT"
fi
- name: Upload exact TypeScript candidate evidence
id: js_exact_candidate_evidence
if: ${{ always() && steps.js_exact_candidate_consumer.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-js-exact-candidate-consumer-${{ matrix.target }}
path: target/js-exact-candidate-consumer/${{ matrix.target }}/evidence
if-no-files-found: error
retention-days: 30
wasix-rust-package:
name: Builds / wasix-rust-binding
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'wasix-rust-package') }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Rust
uses: ./.github/actions/setup-rust
with:
components: llvm-tools-preview
tools: cargo-nextest@0.9.137,cargo-llvm-cov@0.8.7
- name: Install Tauri Linux dependencies
run: |
.github/scripts/prepare-linux-apt.sh
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libayatana-appindicator3-dev \
libglib2.0-dev \
libgtk-3-dev \
librsvg2-dev \
libssl-dev \
libwebkit2gtk-4.1-dev \
libxdo-dev \
pkg-config
- name: Build WASIX Rust binding package artifacts
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh wasix-rust-package
- name: Upload WASIX Rust binding package artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-wasix-rust-package-artifacts
path: target/sdk-artifacts/oliphaunt-wasix-rust
if-no-files-found: error
liboliphaunt-wasix-runtime:
name: Builds / liboliphaunt-wasix-runtime
needs:
- affected
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-wasix-runtime') }}
runs-on: ubuntu-24.04
timeout-minutes: 360
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
with:
cache-save-if: ${{ env.HEAVY_CACHE_SAVE_IF }}
- name: Verify source-controlled asset inputs
run: cargo run -p xtask -- assets verify-committed
- name: Restore WASIX compilation cache
id: wasix-build-cache
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: |
target/liboliphaunt-pg18/source
target/oliphaunt-wasix/wasix-build/source-cache
target/oliphaunt-wasix/wasix-build/work/docker-oliphaunt
target/oliphaunt-wasix/wasix-build/work/icu-native
target/oliphaunt-wasix/wasix-build/work/icu-wasix
target/oliphaunt-wasix/wasix-build/work/icu-wasix-build
target/oliphaunt-wasix/wasix-build/work/json-c-wasix
target/oliphaunt-wasix/wasix-build/work/json-c-wasix-build
target/oliphaunt-wasix/wasix-build/work/libiconv-wasix
target/oliphaunt-wasix/wasix-build/work/libiconv-wasix-build
target/oliphaunt-wasix/wasix-build/work/libxml2-wasix
target/oliphaunt-wasix/wasix-build/work/libxml2-wasix-build
target/oliphaunt-wasix/wasix-build/work/openssl-wasix
target/oliphaunt-wasix/wasix-build/work/openssl-wasix-build
target/oliphaunt-wasix/wasix-build/work/proj-wasix
target/oliphaunt-wasix/wasix-build/work/proj-wasix-build
target/oliphaunt-wasix/wasix-build/work/sqlite-wasix
target/oliphaunt-wasix/wasix-build/work/sqlite-wasix-build
target/oliphaunt-wasix/wasix-build/work/geos-wasix
target/oliphaunt-wasix/wasix-build/work/geos-wasix-build
target/oliphaunt-wasix/wasix-build/build
key: wasix-build-${{ runner.os }}-${{ env.ASSET_PROFILE }}-${{ env.WASMER_LLVM_VERSION }}-${{ env.WASMER_LLVM_LINUX_X64_BYTES }}-${{ env.WASMER_LLVM_LINUX_X64_SHA256 }}-${{ hashFiles('src/runtimes/liboliphaunt/wasix/assets/generated/asset-inputs.sha256') }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd
- name: Build WASIX builder image and save cache
if: ${{ env.HEAVY_CACHE_SAVE_IF == 'true' }}
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f
with:
context: src/runtimes/liboliphaunt/wasix/assets/build/docker
file: src/runtimes/liboliphaunt/wasix/assets/build/docker/Dockerfile
tags: oliphaunt-wasix-wasix-build:ci
load: true
cache-from: type=gha,scope=wasix-builder
cache-to: type=gha,mode=max,scope=wasix-builder,ignore-error=true
- name: Build WASIX builder image
if: ${{ env.HEAVY_CACHE_SAVE_IF != 'true' }}
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f
with:
context: src/runtimes/liboliphaunt/wasix/assets/build/docker
file: src/runtimes/liboliphaunt/wasix/assets/build/docker/Dockerfile
tags: oliphaunt-wasix-wasix-build:ci
load: true
cache-from: type=gha,scope=wasix-builder
- name: Install Wasmer LLVM 22.1 for WASIX template generation
uses: ./.github/actions/setup-wasmer-llvm
with:
url: ${{ env.WASMER_LLVM_LINUX_X64_URL }}
sha256: ${{ env.WASMER_LLVM_LINUX_X64_SHA256 }}
bytes: ${{ env.WASMER_LLVM_LINUX_X64_BYTES }}
version: ${{ env.WASMER_LLVM_VERSION }}
cache-save-if: ${{ env.HEAVY_CACHE_SAVE_IF }}
- name: Build and validate portable WASIX runtime
env:
IMAGE: oliphaunt-wasix-wasix-build:ci
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-wasix-runtime
- name: Save WASIX compilation cache
id: save_wasix_build_cache
if: ${{ env.HEAVY_CACHE_SAVE_IF == 'true' && steps.wasix-build-cache.outputs.cache-hit != 'true' }}
continue-on-error: true
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: |
target/liboliphaunt-pg18/source
target/oliphaunt-wasix/wasix-build/source-cache
target/oliphaunt-wasix/wasix-build/work/docker-oliphaunt
target/oliphaunt-wasix/wasix-build/work/icu-native
target/oliphaunt-wasix/wasix-build/work/icu-wasix
target/oliphaunt-wasix/wasix-build/work/icu-wasix-build
target/oliphaunt-wasix/wasix-build/work/json-c-wasix
target/oliphaunt-wasix/wasix-build/work/json-c-wasix-build
target/oliphaunt-wasix/wasix-build/work/libiconv-wasix
target/oliphaunt-wasix/wasix-build/work/libiconv-wasix-build
target/oliphaunt-wasix/wasix-build/work/libxml2-wasix
target/oliphaunt-wasix/wasix-build/work/libxml2-wasix-build
target/oliphaunt-wasix/wasix-build/work/openssl-wasix
target/oliphaunt-wasix/wasix-build/work/openssl-wasix-build
target/oliphaunt-wasix/wasix-build/work/proj-wasix
target/oliphaunt-wasix/wasix-build/work/proj-wasix-build
target/oliphaunt-wasix/wasix-build/work/sqlite-wasix
target/oliphaunt-wasix/wasix-build/work/sqlite-wasix-build
target/oliphaunt-wasix/wasix-build/work/geos-wasix
target/oliphaunt-wasix/wasix-build/work/geos-wasix-build
target/oliphaunt-wasix/wasix-build/build
key: wasix-build-${{ runner.os }}-${{ env.ASSET_PROFILE }}-${{ env.WASMER_LLVM_VERSION }}-${{ env.WASMER_LLVM_LINUX_X64_BYTES }}-${{ env.WASMER_LLVM_LINUX_X64_SHA256 }}-${{ hashFiles('src/runtimes/liboliphaunt/wasix/assets/generated/asset-inputs.sha256') }}
- name: Upload portable WASIX build outputs
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-wasix-runtime-portable
path: |
target/oliphaunt-wasix/wasix-build/build/**
target/oliphaunt-wasix/wasix-build/work/icu-wasix/share/icu/**
target/oliphaunt-wasix/assets/**
src/extensions/generated/**
src/runtimes/liboliphaunt/wasix/assets/generated/**
if-no-files-found: error
liboliphaunt-wasix-aot:
name: Builds / liboliphaunt-wasix-aot (${{ matrix.target_id }})
needs:
- affected
- liboliphaunt-wasix-runtime
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-wasix-aot') }}
runs-on: ${{ matrix.os }}
timeout-minutes: 180
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.liboliphaunt_wasix_aot_runtime_matrix || '{"include":[]}') }}
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Set up MSVC
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/setup-msvc
- name: Download portable WASIX build outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-runtime-portable
path: .
- name: Install Wasmer LLVM 22.1 for AOT generation
uses: ./.github/actions/setup-wasmer-llvm
with:
url: ${{ matrix.llvm_url }}
sha256: ${{ matrix.llvm_sha256 }}
bytes: ${{ matrix.llvm_bytes }}
version: ${{ env.WASMER_LLVM_VERSION }}
- name: Build, validate, and smoke target AOT artifacts
env:
AOT_TARGET: ${{ matrix.target }}
AOT_PACKAGE: ${{ matrix.package }}
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-wasix-aot
- name: Stage target AOT artifact envelope
env:
AOT_TARGET: ${{ matrix.target }}
run: |
target="${AOT_TARGET:?AOT_TARGET is required}"
source="target/oliphaunt-wasix/aot/$target"
if [ ! -d "$source" ]; then
echo "missing AOT output directory: $source" >&2
exit 1
fi
upload="target/oliphaunt-wasix/aot-upload"
rm -rf "$upload"
mkdir -p "$upload/files"
cp -R "$source/." "$upload/files/"
printf '%s\n' "$target" >"$upload/target-triple.txt"
- name: Upload target artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-wasix-runtime-aot-${{ matrix.target_id }}
path: |
target/oliphaunt-wasix/aot-upload/**
if-no-files-found: error
- name: Upload target extension AOT artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-wasix-extension-aot-${{ matrix.target_id }}
path: target/extensions/wasix/aot-artifacts
if-no-files-found: error
liboliphaunt-wasix-release-assets:
name: Builds / liboliphaunt-wasix-release-assets
needs:
- affected
- liboliphaunt-wasix-runtime
- liboliphaunt-wasix-aot
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'liboliphaunt-wasix-release-assets') && (github.event_name != 'workflow_dispatch' || inputs.wasm_target == 'all') }}
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download portable WASIX runtime outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-runtime-portable
path: .
- name: Download WASIX AOT runtime outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-wasix-runtime-aot-*
path: target/oliphaunt-wasix/aot-downloads
- name: Restore WASIX AOT target layout
run: |
shopt -s nullglob
for artifact_dir in target/oliphaunt-wasix/aot-downloads/liboliphaunt-wasix-runtime-aot-*; do
marker="$artifact_dir/target-triple.txt"
raw_target_dir="$artifact_dir/files"
if [ ! -f "$marker" ] || [ ! -d "$raw_target_dir" ]; then
echo "Invalid WASIX AOT artifact envelope in $artifact_dir" >&2
exit 1
fi
target="$(tr -d '\r\n' < "$marker")"
if [ -z "$target" ]; then
echo "Empty WASIX AOT target marker in $marker" >&2
exit 1
fi
destination="target/oliphaunt-wasix/aot/$target"
mkdir -p "$destination"
rsync -a "$raw_target_dir/" "$destination/"
done
- name: Package WASIX release assets
run: OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh liboliphaunt-wasix-release-assets
- name: Upload WASIX release assets
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: liboliphaunt-wasix-release-assets
path: target/oliphaunt-wasix/release-assets
if-no-files-found: error
native-extension-lifecycle:
name: E2E / native extension lifecycle (shard ${{ matrix.shard }})
needs:
- affected
- extension-artifacts-native
- liboliphaunt-native-desktop
- broker-runtime
- rust-sdk-package
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-native.result == 'success' && needs.liboliphaunt-native-desktop.result == 'success' && needs.broker-runtime.result == 'success' && needs.rust-sdk-package.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'native-extension-lifecycle') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.native_extension_lifecycle_matrix) }}
runs-on: ubuntu-24.04
timeout-minutes: 120
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Download same-run Linux native runtime
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-linux-x64-gnu
path: target/native-extension-lifecycle/input/runtime
- name: Download same-run Linux exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-extension-artifacts-linux-x64-gnu
path: target/native-extension-lifecycle/input/extensions
- name: Download same-run Linux broker
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-broker-release-assets-linux-x64-gnu
path: target/native-extension-lifecycle/input/broker
- name: Download same-run native lifecycle proof runner
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-native-extension-proof-linux-x64-gnu
path: target/native-extension-lifecycle/input/proof-runner
- name: Run planned native extension lifecycle proof
id: native_extension_lifecycle
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_NATIVE_EXTENSION_PROOF_SQL_NAMES: ${{ needs.affected.outputs.native_extension_lifecycle_sql_names_csv }}
SHARD_INDEX: ${{ matrix.shard }}
SHARD_COUNT: ${{ matrix.shard_count }}
run: |
mkdir -p target/native-extension-lifecycle/evidence
tools/release/run-native-extension-lifecycle-proof.sh 2>&1 \
| tee "target/native-extension-lifecycle/evidence/job-shard-${SHARD_INDEX}.log"
- name: Upload native extension lifecycle evidence
id: native_extension_lifecycle_evidence
if: ${{ always() && steps.native_extension_lifecycle.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: native-extension-lifecycle-evidence-${{ matrix.shard }}
path: target/native-extension-lifecycle/evidence
if-no-files-found: error
retention-days: 30
native-extension-lifecycle-aggregate:
name: E2E / native extension lifecycle (aggregate)
needs:
- affected
- native-extension-lifecycle
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.native-extension-lifecycle.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'native-extension-lifecycle') }}
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Download all same-run native lifecycle shard receipts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: native-extension-lifecycle-evidence-*
path: target/native-extension-lifecycle/aggregate/input
merge-multiple: false
- name: Verify exact aggregate native extension lifecycle proof
id: native_extension_lifecycle_aggregate
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_NATIVE_EXTENSION_PROOF_SQL_NAMES: ${{ needs.affected.outputs.native_extension_lifecycle_sql_names_csv }}
OLIPHAUNT_NATIVE_EXTENSION_PROOF_SHARD_COUNT: ${{ needs.affected.outputs.native_extension_lifecycle_shard_count }}
run: |
actual_sha="$(git rev-parse HEAD)"
if [[ "$actual_sha" != "$CI_HEAD_SHA" ]]; then
echo "native lifecycle aggregate candidate mismatch: expected $CI_HEAD_SHA, got $actual_sha" >&2
exit 1
fi
candidate_tree="$(git rev-parse 'HEAD^{tree}')"
mkdir -p target/native-extension-lifecycle/aggregate/output
tools/dev/bun.sh tools/release/verify-native-extension-lifecycle-receipts.mjs \
--receipts target/native-extension-lifecycle/aggregate/input \
--candidate-sha "$CI_HEAD_SHA" \
--candidate-tree "$candidate_tree" \
--expected-extensions-csv "$OLIPHAUNT_NATIVE_EXTENSION_PROOF_SQL_NAMES" \
--expected-shard-count "$OLIPHAUNT_NATIVE_EXTENSION_PROOF_SHARD_COUNT" \
--output target/native-extension-lifecycle/aggregate/output/aggregate-receipt.json
- name: Upload aggregate native extension lifecycle evidence
id: native_extension_lifecycle_aggregate_evidence
if: ${{ always() && steps.native_extension_lifecycle_aggregate.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: native-extension-lifecycle-evidence
path: target/native-extension-lifecycle/aggregate
if-no-files-found: error
retention-days: 30
rust-sdk-exact-candidate-consumer:
name: E2E / Rust exact-candidate consumer
needs:
- affected
- extension-artifacts-native
- liboliphaunt-native-desktop
- broker-runtime
- rust-sdk-package
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-native.result == 'success' && needs.liboliphaunt-native-desktop.result == 'success' && needs.broker-runtime.result == 'success' && needs.rust-sdk-package.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'rust-sdk-exact-candidate-consumer') }}
runs-on: ubuntu-24.04
timeout-minutes: 90
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download same-run Rust SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-rust-sdk-package-artifacts
path: target/exact-candidate-consumer/rust/input/sdk
- name: Download same-run Linux native runtime
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-linux-x64-gnu
path: target/exact-candidate-consumer/rust/input/native
- name: Download same-run Linux broker
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-broker-release-assets-linux-x64-gnu
path: target/exact-candidate-consumer/rust/input/broker
- name: Download same-run Linux exact-extension artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-extension-artifacts-linux-x64-gnu
path: target/exact-candidate-consumer/rust/input/extensions
- name: Run exact-candidate Rust package consumer
id: rust_exact_candidate_consumer
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_RUST_BROKER_ASSET_DIR: ${{ github.workspace }}/target/exact-candidate-consumer/rust/input/broker
OLIPHAUNT_RUST_EXTENSION_ASSET_DIR: ${{ github.workspace }}/target/exact-candidate-consumer/rust/input/extensions
OLIPHAUNT_RUST_NATIVE_ASSET_DIR: ${{ github.workspace }}/target/exact-candidate-consumer/rust/input/native
OLIPHAUNT_RUST_SDK_ARTIFACT_DIR: ${{ github.workspace }}/target/exact-candidate-consumer/rust/input/sdk
run: |
mkdir -p target/exact-candidate-consumer/rust/evidence
src/sdks/rust/tools/check-release-consumer.sh 2>&1 \
| tee target/exact-candidate-consumer/rust/evidence/proof.log
- name: Write exact-candidate Rust consumer receipt
id: rust_exact_candidate_receipt
if: ${{ always() && steps.rust_exact_candidate_consumer.outcome != 'skipped' }}
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
PROOF_OUTCOME: ${{ steps.rust_exact_candidate_consumer.outcome }}
run: |
candidate_tree="$(git rev-parse 'HEAD^{tree}')"
tools/dev/bun.sh tools/release/write-sdk-exact-candidate-receipt.mjs \
--sdk rust \
--candidate-sha "$CI_HEAD_SHA" \
--candidate-tree "$candidate_tree" \
--workflow-sha "$GITHUB_SHA" \
--proof-outcome "$PROOF_OUTCOME" \
--log target/exact-candidate-consumer/rust/evidence/proof.log \
--input broker=target/exact-candidate-consumer/rust/input/broker \
--input extensions=target/exact-candidate-consumer/rust/input/extensions \
--input native=target/exact-candidate-consumer/rust/input/native \
--input rust-sdk=target/exact-candidate-consumer/rust/input/sdk \
--output target/exact-candidate-consumer/rust/evidence/receipt.json
- name: Upload exact-candidate Rust consumer evidence
id: rust_exact_candidate_evidence
if: ${{ always() && steps.rust_exact_candidate_consumer.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-rust-exact-candidate-consumer-evidence
path: target/exact-candidate-consumer/rust/evidence
if-no-files-found: error
retention-days: 30
wasix-rust-exact-candidate-consumer:
name: E2E / WASIX Rust exact-candidate consumer
needs:
- affected
- wasix-rust-package
- liboliphaunt-wasix-release-assets
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.wasix-rust-package.result == 'success' && needs.liboliphaunt-wasix-release-assets.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'wasix-rust-exact-candidate-consumer') }}
runs-on: ubuntu-24.04
timeout-minutes: 120
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download same-run WASIX Rust SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-wasix-rust-package-artifacts
path: target/exact-candidate-consumer/wasix-rust/input/sdk
- name: Download same-run WASIX runtime release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-release-assets
path: target/exact-candidate-consumer/wasix-rust/input/runtime
- name: Run exact-candidate WASIX Rust package consumer
id: wasix_rust_exact_candidate_consumer
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
evidence=target/exact-candidate-consumer/wasix-rust/evidence
work=target/exact-candidate-consumer/wasix-rust/work
mkdir -p "$evidence"
tools/dev/bun.sh tools/release/wasix-rust-exact-candidate-consumer.mjs \
--candidate-sha "$CI_HEAD_SHA" \
--sdk-root target/exact-candidate-consumer/wasix-rust/input/sdk \
--runtime-asset-root target/exact-candidate-consumer/wasix-rust/input/runtime \
--output-root "$work" 2>&1 \
| tee "$evidence/proof.log"
cp "$work/evidence/exact-candidate.json" "$evidence/exact-candidate.json"
cp "$work/evidence/local-registry-report.json" "$evidence/local-registry-report.json"
cp "$work/cargo-consumer/evidence/Cargo.lock" "$evidence/Cargo.lock"
cp "$work/cargo-consumer/evidence/exact-cargo-consumer.json" "$evidence/exact-cargo-consumer.json"
- name: Write exact-candidate WASIX Rust consumer receipt
id: wasix_rust_exact_candidate_receipt
if: ${{ always() && steps.wasix_rust_exact_candidate_consumer.outcome != 'skipped' }}
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
PROOF_OUTCOME: ${{ steps.wasix_rust_exact_candidate_consumer.outcome }}
run: |
candidate_tree="$(git rev-parse 'HEAD^{tree}')"
tools/dev/bun.sh tools/release/write-sdk-exact-candidate-receipt.mjs \
--sdk wasix-rust \
--candidate-sha "$CI_HEAD_SHA" \
--candidate-tree "$candidate_tree" \
--workflow-sha "$GITHUB_SHA" \
--proof-outcome "$PROOF_OUTCOME" \
--log target/exact-candidate-consumer/wasix-rust/evidence/proof.log \
--input wasix-runtime=target/exact-candidate-consumer/wasix-rust/input/runtime \
--input wasix-sdk=target/exact-candidate-consumer/wasix-rust/input/sdk \
--output target/exact-candidate-consumer/wasix-rust/evidence/receipt.json
- name: Upload exact-candidate WASIX Rust consumer evidence
id: wasix_rust_exact_candidate_evidence
if: ${{ always() && steps.wasix_rust_exact_candidate_consumer.outcome != 'skipped' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-wasix-rust-exact-candidate-consumer-evidence
path: target/exact-candidate-consumer/wasix-rust/evidence
if-no-files-found: error
retention-days: 30
wasix-release-regression:
name: E2E / WASIX release regression
needs:
- affected
- extension-artifacts-wasix
- liboliphaunt-wasix-runtime
- liboliphaunt-wasix-aot
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.extension-artifacts-wasix.result == 'success' && needs.liboliphaunt-wasix-runtime.result == 'success' && needs.liboliphaunt-wasix-aot.result == 'success' && needs.affected.outputs.wasix_release_regression_required == 'true' }}
runs-on: ubuntu-24.04
timeout-minutes: 240
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Set up Node and pnpm
uses: ./.github/actions/setup-node-pnpm
with:
node-version: ${{ env.NODE_VERSION }}
pnpm-version: ${{ env.PNPM_VERSION }}
- name: Warm pinned extension metadata formatter
run: |
for attempt in 1 2 3; do
if printf 'export const oliphauntFormatterProbe={ready:true};\n' \
| pnpm --package=@biomejs/biome@2.4.16 dlx biome format \
--stdin-file-path src/extensions/generated/sdk/react-native.ts \
>/dev/null; then
break
fi
if (( attempt == 3 )); then
echo 'Pinned Biome formatter preflight failed after three attempts' >&2
exit 1
fi
sleep $((attempt * 5))
done
printf 'export const oliphauntFormatterProbe={offline:true};\n' \
| PNPM_CONFIG_OFFLINE=true \
pnpm --package=@biomejs/biome@2.4.16 dlx biome format \
--stdin-file-path src/extensions/generated/sdk/react-native.ts \
>/dev/null
- name: Set up Rust
uses: ./.github/actions/setup-rust
with:
components: rustfmt
- name: Download same-run portable WASIX outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-runtime-portable
path: .
- name: Download same-run WASIX exact-extension outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
pattern: liboliphaunt-wasix-extension-artifacts-*
path: target/extensions/wasix/release-assets
merge-multiple: true
- name: Download same-run Linux extension AOT outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-extension-aot-linux-x64-gnu
path: target/extensions/wasix/aot-artifacts
- name: Download same-run Linux host AOT outputs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-wasix-runtime-aot-linux-x64-gnu
path: target/oliphaunt-wasix/host-aot-download
- name: Restore Linux host AOT target layout
run: |
artifact_dir=target/oliphaunt-wasix/host-aot-download
marker="$artifact_dir/target-triple.txt"
raw_target_dir="$artifact_dir/files"
if [[ ! -f "$marker" || ! -d "$raw_target_dir" ]]; then
echo "invalid Linux host AOT artifact envelope in $artifact_dir" >&2
exit 1
fi
target="$(tr -d '\r\n' < "$marker")"
if [[ "$target" != x86_64-unknown-linux-gnu ]]; then
echo "Linux host AOT artifact targets $target, expected x86_64-unknown-linux-gnu" >&2
exit 1
fi
destination="target/oliphaunt-wasix/aot/$target"
mkdir -p "$destination"
rsync -a "$raw_target_dir/" "$destination/"
- name: Stage exact-extension WASIX evidence inputs
run: tools/dev/bun.sh tools/release/build-extension-ci-artifacts.mjs --all --require-wasix
- name: Collect exact-candidate WASIX extension evidence
id: regression
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_WASIX_EXTENSION_ARTIFACT_ROOT: ${{ github.workspace }}/target/extension-artifacts
# The pinned Biome package was fetched and exercised above. Keep the
# evidence mutation independent of a second registry lookup.
PNPM_CONFIG_OFFLINE: "true"
run: |
actual_sha="$(git rev-parse HEAD)"
if [[ "$actual_sha" != "$CI_HEAD_SHA" ]]; then
echo "checked-out candidate $actual_sha does not match requested SHA $CI_HEAD_SHA" >&2
exit 1
fi
run_id="$(date -u +%Y-%m-%dT%H%M%SZ)-ci-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${CI_HEAD_SHA}"
run_path="src/extensions/evidence/runs/$run_id.json"
echo "run_path=$run_path" >> "$GITHUB_OUTPUT"
mkdir -p target/qualification/wasix-release-regression
src/extensions/tools/collect-wasix-evidence.sh "$run_id" 2>&1 \
| tee target/qualification/wasix-release-regression/runtime-smoke.log
- name: Upload exact-candidate WASIX evidence
if: ${{ steps.regression.outcome == 'success' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: wasix-release-regression-evidence
path: |
${{ steps.regression.outputs.run_path }}
src/extensions/generated/docs/extension-evidence.json
target/qualification/wasix-release-regression/runtime-smoke.log
if-no-files-found: error
overwrite: true
retention-days: 30
- name: Upload WASIX regression diagnostics
if: ${{ always() && steps.regression.outcome != 'success' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: wasix-release-regression-diagnostics
path: target/qualification/wasix-release-regression/runtime-smoke.log
if-no-files-found: ignore
overwrite: true
retention-days: 14
mobile-build-android:
name: Builds / mobile-android (${{ matrix.target }})
needs:
- affected
- mobile-extension-packages
- liboliphaunt-native-android
- kotlin-sdk-package
- react-native-sdk-package
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.mobile-extension-packages.result == 'success' && needs.liboliphaunt-native-android.result == 'success' && needs.kotlin-sdk-package.result == 'success' && needs.react-native-sdk-package.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'mobile-build-android') }}
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.affected.outputs.react_native_android_mobile_app_matrix) }}
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Android
uses: ./.github/actions/setup-android
with:
native-ccache: "true"
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Reclaim Android mobile build disk
run: bun .github/scripts/reclaim-android-mobile-build-disk.mjs
- name: Download Android liboliphaunt target
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-target-${{ matrix.target }}
path: .
- name: Download Kotlin SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-kotlin-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-kotlin
- name: Download React Native SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-react-native-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-react-native
- name: Download exact-extension package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-mobile-extension-package-artifacts
path: target/extension-artifacts
- name: Build Android mobile app
env:
OLIPHAUNT_EXPO_ALLOW_NATIVE_BUILDS: "0"
OLIPHAUNT_EXPO_REQUIRE_SDK_ARTIFACTS: "1"
OLIPHAUNT_EXPO_SDK_ARTIFACT_ROOT: ${{ github.workspace }}/target/sdk-artifacts
OLIPHAUNT_EXPO_ANDROID_ABI: ${{ matrix.abi }}
OLIPHAUNT_EXPO_ANDROID_BUILD_TYPE: release
OLIPHAUNT_EXPO_ANDROID_EXTENSIONS: ${{ needs.affected.outputs.extension_package_sql_names_csv }}
OLIPHAUNT_EXPO_REQUIRE_PREBUILT_EXTENSIONS: "1"
OLIPHAUNT_EXPO_EXTENSION_ARTIFACT_ROOT: ${{ github.workspace }}/target/extension-artifacts
OLIPHAUNT_EXPO_ANDROID_OLIPHAUNT_SO: ${{ github.workspace }}/${{ matrix.build-root }}/out/liboliphaunt.so
OLIPHAUNT_EXPO_ANDROID_RUNTIME_DIR: ${{ github.workspace }}/target/liboliphaunt-pg18-linux-x64-gnu/install
OLIPHAUNT_EXPO_ANDROID_INITDB: ${{ github.workspace }}/target/liboliphaunt-pg18-linux-x64-gnu/install/bin/initdb
run: |
OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh mobile-build-android
- name: Validate Android mobile app artifacts
run: tools/dev/bun.sh tools/release/check-staged-artifacts.mjs --require-mobile android --require-mobile-prebuilt-extensions
- name: Upload Android mobile build logs
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-android-build-logs-${{ matrix.target }}
path: |
target/mobile/react-native/android-build/logs
target/oliphaunt-expo-android-*/logs
if-no-files-found: ignore
- name: Upload Android mobile app
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-android-app-${{ matrix.target }}
path: target/mobile-build/react-native/android
if-no-files-found: error
mobile-build-ios:
name: Builds / mobile-ios
needs:
- affected
- mobile-extension-packages
- liboliphaunt-native-ios
- react-native-sdk-package
- swift-sdk-package
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'mobile-build-ios') }}
runs-on: macos-26
timeout-minutes: 180
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Moon
uses: ./.github/actions/setup-moon
with:
install-workspace: "true"
- name: Set up Apple
uses: ./.github/actions/setup-apple
- name: Set up Rust
uses: ./.github/actions/setup-rust
- name: Download iOS liboliphaunt target
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-target-ios-xcframework
path: .
- name: Download iOS liboliphaunt release assets
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: liboliphaunt-native-release-assets-ios-xcframework
path: target/liboliphaunt/release-assets
- name: Download Swift SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-swift-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-swift
- name: Download React Native SDK package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-react-native-sdk-package-artifacts
path: target/sdk-artifacts/oliphaunt-react-native
- name: Download exact-extension package artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: oliphaunt-mobile-extension-package-artifacts
path: target/extension-artifacts
- name: Render exact-SHA cache-warm iOS carrier manifest
run: |
tools/dev/bun.sh tools/release/ios-carrier-manifest.mjs \
--base-asset-dir target/liboliphaunt/release-assets \
--extension-root target/extension-artifacts \
--output target/release/ios-carriers/oliphaunt-react-native-ios-carriers.json \
--local-urls
- name: Qualify every exact iOS carrier
env:
IOS_CARRIER_MANIFEST: target/release/ios-carriers/oliphaunt-react-native-ios-carriers.json
IOS_CARRIER_STAGE: target/qualification/react-native-ios-all-carriers
IOS_CARRIER_CACHE: target/qualification/react-native-ios-carrier-cache
PLANNED_EXTENSION_SQL_NAMES: ${{ needs.affected.outputs.extension_package_sql_names_csv }}
run: |
extensions="$(tools/dev/bun.sh -e '
const manifest = JSON.parse(await Bun.file(process.env.IOS_CARRIER_MANIFEST).text());
const planned = String(process.env.PLANNED_EXTENSION_SQL_NAMES ?? "")
.split(",").filter(Boolean).sort();
if (planned.length === 0) {
throw new Error("planner selected no exact iOS extension carriers");
}
if (!Array.isArray(manifest.extensions) || manifest.extensions.length === 0) {
throw new Error("exact iOS carrier manifest contains no extensions");
}
const names = manifest.extensions.map((row) => row.sqlName).sort();
if (names.some((name) => typeof name !== "string") || new Set(names).size !== names.length) {
throw new Error("exact iOS carrier manifest has invalid or duplicate extension identities");
}
if (JSON.stringify(names) !== JSON.stringify(planned)) {
throw new Error("exact iOS carrier manifest does not match the planner-selected extension set");
}
process.stdout.write(names.join(","));
')"
node src/sdks/react-native/tools/stage-ios-app.mjs \
--carrier "$IOS_CARRIER_MANIFEST" \
--output-dir "$IOS_CARRIER_STAGE" \
--extensions "$extensions" \
--icu \
--cache-dir "$IOS_CARRIER_CACHE" \
--allow-file-urls
tools/dev/bun.sh -e '
const manifest = JSON.parse(await Bun.file(process.env.IOS_CARRIER_MANIFEST).text());
const selection = JSON.parse(await Bun.file(process.env.IOS_CARRIER_STAGE + "/selection.json").text());
const expected = String(process.env.PLANNED_EXTENSION_SQL_NAMES ?? "")
.split(",").filter(Boolean).sort();
const manifested = manifest.extensions.map((row) => row.sqlName).sort();
const requested = [...selection.requestedExtensions].sort();
const resolved = selection.extensions.map((row) => row.sqlName).sort();
if (JSON.stringify(manifested) !== JSON.stringify(expected) || !selection.icu || JSON.stringify(requested) !== JSON.stringify(expected) || JSON.stringify(resolved) !== JSON.stringify(expected)) {
throw new Error("staged iOS carrier selection does not exactly cover every manifest extension plus ICU");
}
'
mkdir -p target/release/ios-carriers/qualification
cp "$IOS_CARRIER_STAGE/selection.json" \
target/release/ios-carriers/qualification/all-extensions-selection.json
cp "$IOS_CARRIER_STAGE/resources/OliphauntReactNativeResources.bundle/oliphaunt/package-size.tsv" \
target/release/ios-carriers/qualification/all-extensions-package-size.tsv
rm -rf "$IOS_CARRIER_STAGE" "$IOS_CARRIER_CACHE"
- name: Run exact-extension Swift release consumer
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_SWIFT_NATIVE_ASSET_DIR: ${{ github.workspace }}/target/liboliphaunt/release-assets
OLIPHAUNT_SWIFT_SDK_ARTIFACT_DIR: ${{ github.workspace }}/target/sdk-artifacts/oliphaunt-swift
PLANNED_EXTENSION_PRODUCTS: ${{ needs.affected.outputs.extension_package_products_csv }}
run: |
source_carrier=target/sdk-artifacts/oliphaunt-swift/release-tree/src/sdks/swift/Carriers/oliphaunt-react-native-ios-carriers.json
react_native_source_carrier=target/sdk-artifacts/oliphaunt-react-native/ios-carriers/oliphaunt-react-native-ios-carriers.json
cache_warm_carrier=target/release/ios-carriers/oliphaunt-react-native-ios-carriers.json
if ! cmp -s "$source_carrier" "$react_native_source_carrier"; then
echo 'Swift and React Native package artifacts disagree on the selection-neutral source carrier.' >&2
diff -u "$source_carrier" "$react_native_source_carrier" || true
exit 1
fi
consumer_args=(
--source-carrier "$source_carrier"
--cache-warm-carrier "$cache_warm_carrier"
)
evidence_dir=target/release/ios-carriers/qualification/swift-independent-carriers
mkdir -p "$evidence_dir"
cp "$source_carrier" "$evidence_dir/selection-neutral-source-carrier.json"
cp "$react_native_source_carrier" "$evidence_dir/react-native-selection-neutral-source-carrier.json"
product_count=0
while IFS= read -r product; do
[[ -n "$product" ]] || continue
if [[ ! "$product" =~ ^oliphaunt-extension-[A-Za-z0-9._-]+$ ]]; then
echo "Planner returned an invalid exact-extension product id: $product" >&2
exit 1
fi
release_assets="target/extension-artifacts/$product/release-assets"
product_carriers=()
while IFS= read -r carrier; do
product_carriers+=("$carrier")
done < <(find "$release_assets" -maxdepth 1 -type f -name '*-swift-extension-carrier.json' | LC_ALL=C sort)
if (( ${#product_carriers[@]} != 1 )); then
echo "Planner-selected $product must provide exactly one independent Swift carrier; found ${#product_carriers[@]}" >&2
exit 1
fi
consumer_args+=(--extension-carrier "${product_carriers[0]}")
cp "${product_carriers[0]}" "$evidence_dir/$(basename "${product_carriers[0]}")"
product_count=$((product_count + 1))
done < <(printf '%s' "$PLANNED_EXTENSION_PRODUCTS" | tr ',' '\n')
if (( product_count == 0 )); then
echo 'Exact-extension Swift release qualification resolved no independent extension carriers.' >&2
exit 1
fi
printf '%s\n' "${consumer_args[@]}" > "$evidence_dir/consumer-arguments.txt"
src/sdks/swift/tools/check-extension-release-consumer.sh "${consumer_args[@]}"
- name: Build iOS mobile app
env:
OLIPHAUNT_EXPO_ALLOW_NATIVE_BUILDS: "0"
OLIPHAUNT_EXPO_REQUIRE_SDK_ARTIFACTS: "1"
OLIPHAUNT_EXPO_SDK_ARTIFACT_ROOT: ${{ github.workspace }}/target/sdk-artifacts
OLIPHAUNT_EXPO_IOS_CONFIGURATION: Release
OLIPHAUNT_EXPO_IOS_EXTENSIONS: ${{ needs.affected.outputs.extension_package_sql_names_csv }}
OLIPHAUNT_EXPO_IOS_SDK: iphonesimulator
OLIPHAUNT_EXPO_REQUIRE_PREBUILT_EXTENSIONS: "1"
OLIPHAUNT_EXPO_EXTENSION_ARTIFACT_ROOT: ${{ github.workspace }}/target/extension-artifacts
OLIPHAUNT_EXPO_IOS_OLIPHAUNT_XCFRAMEWORK: ${{ github.workspace }}/target/liboliphaunt-ios-xcframework/out/liboliphaunt.xcframework
OLIPHAUNT_EXPO_IOS_RUNTIME_DIR: ${{ github.workspace }}/target/liboliphaunt-pg18/install
OLIPHAUNT_EXPO_IOS_INITDB: ${{ github.workspace }}/target/liboliphaunt-pg18/install/bin/initdb
OLIPHAUNT_REACT_NATIVE_IOS_BASE_CARRIER: ${{ github.workspace }}/target/release/ios-carriers/oliphaunt-react-native-ios-carriers.json
run: |
OLIPHAUNT_CI_JOB_TARGETS_JSON='${{ needs.affected.outputs.job_targets }}' OLIPHAUNT_MOON_UPSTREAM=none MOON_CACHE=off .github/scripts/run-planned-moon-job.sh mobile-build-ios
- name: Validate iOS mobile app artifacts
run: tools/dev/bun.sh tools/release/check-staged-artifacts.mjs --require-mobile ios --require-mobile-prebuilt-extensions
- name: Pack fidelity-preserving iOS app transport
run: |
node src/sdks/react-native/tools/ios-app-transport.mjs pack \
--app-dir target/mobile-build/react-native/ios \
--transport-dir target/mobile-build/react-native/ios-transport
- name: Upload iOS mobile build logs
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-ios-build-logs
path: |
target/mobile/react-native/ios-build/logs
target/mobile/react-native/ios-build/xcodebuild.log
target/oliphaunt-expo-ios-*/logs
target/oliphaunt-expo-ios-*/xcodebuild.log
if-no-files-found: ignore
- name: Upload iOS mobile app
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-ios-app
path: target/mobile-build/react-native/ios-transport
if-no-files-found: error
- name: Upload exact-SHA iOS carrier evidence
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-react-native-ios-carriers
path: target/release/ios-carriers
if-no-files-found: error
overwrite: true
builds:
name: Builds
if: ${{ always() }}
needs:
- affected
- extension-artifacts-native
- extension-artifacts-wasix
- extension-packages
- mobile-extension-packages
- liboliphaunt-native-android
- liboliphaunt-native-desktop
- liboliphaunt-native-ios
- liboliphaunt-native-release-assets
- rust-sdk-package
- broker-runtime
- broker-release-assets
- node-direct
- node-direct-release-assets
- swift-sdk-package
- kotlin-sdk-package
- kotlin-maven-staging
- react-native-sdk-package
- js-sdk-package
- js-sdk-exact-candidate-consumer
- wasix-rust-package
- liboliphaunt-wasix-runtime
- liboliphaunt-wasix-aot
- liboliphaunt-wasix-release-assets
- wasix-release-regression
- mobile-build-android
- mobile-build-ios
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check selected build jobs
id: selected_builds_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
SELECTED_JOBS_JSON: ${{ needs.affected.outputs.builder_jobs }}
GATE_LABEL: selected build jobs
run: bun .github/scripts/check-ci-gate.mjs selected
- name: Check exact-candidate WASIX regression
id: wasix_regression_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
SELECTED_JOBS_JSON: ${{ needs.affected.outputs.wasix_release_regression_required == 'true' && '["wasix-release-regression"]' || '[]' }}
GATE_LABEL: exact-candidate WASIX regression
run: bun .github/scripts/check-ci-gate.mjs selected
mobile-e2e-android:
name: E2E / mobile-android
needs:
- affected
- mobile-build-android
if: ${{ always() && !cancelled() && needs.affected.result == 'success' && needs.mobile-build-android.result == 'success' && contains(fromJson(needs.affected.outputs.jobs), 'mobile-build-android') }}
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Node
id: setup_android_e2e_node
uses: ./.github/actions/setup-node-runtime
with:
node-version: ${{ env.NODE_VERSION }}
- name: Reclaim Android emulator disk
id: reclaim_android_emulator_disk
run: node .github/scripts/reclaim-android-mobile-build-disk.mjs
- name: Set up Android
id: setup_android_e2e
uses: ./.github/actions/setup-android
with:
gradle-cache: "false"
- name: Set up Maestro
uses: ./.github/actions/setup-maestro
- name: Download Android app artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: react-native-mobile-android-app-android-x86_64
path: target/mobile-build/react-native/android
- name: List Android app artifact
run: find target/mobile-build/react-native/android -maxdepth 2 -type f -print
- name: Start Android emulator
id: start_android_emulator
env:
OLIPHAUNT_ANDROID_EMULATOR_API: "35"
OLIPHAUNT_ANDROID_EMULATOR_DISK_HEADROOM_MB: "2048"
OLIPHAUNT_ANDROID_EMULATOR_PARTITION_SIZE_MB: "6144"
run: tools/dev/start-android-emulator-ci.sh
- name: Run Android installed-app E2E
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_EXPO_ANDROID_BUILD_ARTIFACT_DIR: ${{ github.workspace }}/target/mobile-build/react-native/android
OLIPHAUNT_EXPO_ANDROID_BUILD_TYPE: release
OLIPHAUNT_EXPO_ANDROID_LIFECYCLE_SMOKE: "0"
OLIPHAUNT_MOBILE_E2E_ASSERTION_RUNNER: maestro
run: bash src/sdks/react-native/tools/mobile-e2e.sh android
- name: Upload Android E2E reports
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-android-e2e-reports
path: |
target/mobile/react-native/android-e2e/reports
target/mobile/react-native/android-e2e/logs
${{ runner.temp }}/oliphaunt-android-emulator.log
if-no-files-found: ignore
mobile-e2e-ios:
name: E2E / mobile-ios
needs:
- affected
- mobile-build-ios
if: ${{ contains(fromJson(needs.affected.outputs.jobs), 'mobile-build-ios') }}
runs-on: macos-26
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Node and pnpm
uses: ./.github/actions/setup-node-pnpm
with:
node-version: ${{ env.NODE_VERSION }}
pnpm-version: ${{ env.PNPM_VERSION }}
- name: Set up Apple
uses: ./.github/actions/setup-apple
- name: Set up Maestro
uses: ./.github/actions/setup-maestro
- name: Download iOS app artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: react-native-mobile-ios-app
path: target/mobile-build/react-native/ios-transport
- name: Verify and extract iOS app artifact
id: ios_app_transport_verify
run: |
rm -rf target/mobile-build/react-native/ios
node src/sdks/react-native/tools/ios-app-transport.mjs verify-extract \
--transport-dir target/mobile-build/react-native/ios-transport \
--output-dir target/mobile-build/react-native/ios
- name: List iOS app artifact
run: find target/mobile-build/react-native/ios -maxdepth 2 -print
- name: Run iOS installed-app E2E
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
OLIPHAUNT_EXPO_IOS_BUILD_ARTIFACT_DIR: ${{ github.workspace }}/target/mobile-build/react-native/ios
OLIPHAUNT_EXPO_IOS_CONFIGURATION: Release
OLIPHAUNT_EXPO_IOS_SDK: iphonesimulator
OLIPHAUNT_EXPO_IOS_LIFECYCLE_SMOKE: "0"
OLIPHAUNT_MOBILE_E2E_ASSERTION_RUNNER: maestro
MAESTRO_DRIVER_STARTUP_TIMEOUT: "300000"
run: bash src/sdks/react-native/tools/mobile-e2e.sh ios
- name: Upload iOS E2E reports
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: react-native-mobile-ios-e2e-reports
path: |
target/mobile/react-native/ios-e2e/reports
target/mobile/react-native/ios-e2e/logs
target/mobile/react-native/ios-e2e/*.log
if-no-files-found: ignore
e2e:
name: E2E
if: ${{ always() }}
needs:
- affected
- native-extension-lifecycle-aggregate
- rust-sdk-exact-candidate-consumer
- wasix-rust-exact-candidate-consumer
- mobile-e2e-android
- mobile-e2e-ios
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check E2E jobs
id: selected_e2e_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
SELECTED_JOBS_JSON: ${{ needs.affected.outputs.e2e_jobs }}
GATE_LABEL: E2E jobs
run: bun .github/scripts/check-ci-gate.mjs selected
required:
name: Required
if: ${{ always() }}
needs:
- affected
- release-intent
- checks
- tests
- builds
- e2e
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Check required jobs
id: required_gate
env:
NEEDS_JSON: ${{ toJson(needs) }}
REQUIRED_JOBS_JSON: '["affected","release-intent","checks","tests","builds","e2e"]'
GATE_LABEL: required CI phases
run: bun .github/scripts/check-ci-gate.mjs required
qualified:
name: Qualified
if: ${{ always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch') }}
needs:
- affected
- required
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Require full CI success
id: require_full_ci
env:
CI_EVENT_NAME: ${{ github.event_name }}
CI_MOBILE_TARGET: ${{ inputs.mobile_target }}
CI_NATIVE_TARGET: ${{ inputs.native_target }}
CI_WASM_TARGET: ${{ inputs.wasm_target }}
run: |
if [[ '${{ needs.affected.result }}' != success || '${{ needs.required.result }}' != success ]]; then
echo 'release qualification requires successful Plan and Required jobs' >&2
exit 1
fi
if [[ "$CI_EVENT_NAME" == workflow_dispatch ]] && \
[[ "$CI_WASM_TARGET" != all || "$CI_NATIVE_TARGET" != all || "$CI_MOBILE_TARGET" != all ]]; then
echo 'focused workflow_dispatch runs are diagnostic only and cannot qualify a release candidate' >&2
exit 1
fi
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Set up Node.js
uses: ./.github/actions/setup-node-runtime
with:
node-version: ${{ env.NODE_VERSION }}
- name: Download same-run affected plan
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: artifact-build-plan
path: target/qualification/affected-plan
- name: Download required same-run WASIX evidence
if: ${{ needs.affected.outputs.wasix_release_regression_required == 'true' }}
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
with:
name: wasix-release-regression-evidence
path: target/qualification/wasix-release-regression-evidence
- name: Write exact-SHA qualification record
id: qualification_record
env:
CI_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
CI_PLAN_PATH: target/qualification/affected-plan/ci-plan.json
WASIX_RELEASE_REGRESSION_REQUIRED: ${{ needs.affected.outputs.wasix_release_regression_required }}
WASIX_EVIDENCE_ROOT: target/qualification/wasix-release-regression-evidence
run: node .github/scripts/write-release-candidate.mjs
- name: Upload exact-SHA qualification record
id: qualification_evidence
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: oliphaunt-release-candidate
path: target/qualification/oliphaunt-release-candidate.json
if-no-files-found: error
overwrite: true
retention-days: 14