From 8dc1e90b5c7b4e72492ff5b672b1b838b7287409 Mon Sep 17 00:00:00 2001 From: Konrad 'ktoso' Malawski Date: Fri, 27 Jun 2025 14:22:30 +0900 Subject: [PATCH 1/4] Initial macOS CI, start with swift testing --- .github/workflows/macos_tests.yaml | 320 +++++++++++++++++++++++++++++ .github/workflows/pull_request.yml | 8 + 2 files changed, 328 insertions(+) create mode 100644 .github/workflows/macos_tests.yaml diff --git a/.github/workflows/macos_tests.yaml b/.github/workflows/macos_tests.yaml new file mode 100644 index 00000000..ba7427fa --- /dev/null +++ b/.github/workflows/macos_tests.yaml @@ -0,0 +1,320 @@ +name: macOS tests + +on: + workflow_call: + inputs: + xcode_15_4_enabled: + type: boolean + description: "⚠️ Jobs with this version of Xcode are deprecated." + default: false + xcode_15_4_test_arguments_override: + type: string + description: "⚠️ Deprecated." + default: "" + xcode_16_0_enabled: + type: boolean + description: "Boolean to enable the Xcode version 16.0 jobs. Defaults to false." + default: false + xcode_16_0_build_arguments_override: + type: string + description: "The arguments passed to swift build in the macOS 5.10 Swift version matrix job." + default: "" + xcode_16_0_test_arguments_override: + type: string + description: "The arguments passed to swift test in the macOS 5.10 Swift version matrix job." + default: "" + xcode_16_0_setup_command: + type: string + description: "The command(s) to be executed before all other work." + default: "" + xcode_16_1_enabled: + type: boolean + description: "Boolean to enable the Xcode version 16.1 jobs. Defaults to false." + default: false + xcode_16_1_build_arguments_override: + type: string + description: "The arguments passed to swift build in the Xcode version 16.1 job." + default: "" + xcode_16_1_test_arguments_override: + type: string + description: "The arguments passed to swift test in the Xcode version 16.1 job." + default: "" + xcode_16_1_setup_command: + type: string + description: "The command(s) to be executed before all other work." + default: "" + xcode_16_2_enabled: + type: boolean + description: "Boolean to enable the Xcode version 16.2 jobs. Defaults to true." + default: true + xcode_16_2_build_arguments_override: + type: string + description: "The arguments passed to swift build in the Xcode version 16.2 job." + default: "" + xcode_16_2_test_arguments_override: + type: string + description: "The arguments passed to swift test in the Xcode version 16.2 job." + default: "" + xcode_16_2_setup_command: + type: string + description: "The command(s) to be executed before all other work." + default: "" + xcode_16_3_enabled: + type: boolean + description: "Boolean to enable the Xcode version 16.3 jobs. Defaults to true." + default: true + xcode_16_3_build_arguments_override: + type: string + description: "The arguments passed to swift build in the Xcode version 16.3 job." + default: "" + xcode_16_3_test_arguments_override: + type: string + description: "The arguments passed to swift test in the Xcode version 16.3 job." + default: "" + xcode_16_3_setup_command: + type: string + description: "The command(s) to be executed before all other work." + default: "" + xcode_26_beta_enabled: + type: boolean + description: "Boolean to enable the Xcode version 26 beta 1 jobs. Defaults to true." + default: true + xcode_26_beta_1_build_arguments_override: + type: string + description: "The arguments passed to swift build in the Xcode version 26 beta 1 job." + default: "" + xcode_26_beta_1_test_arguments_override: + type: string + description: "The arguments passed to swift test in the Xcode version 26 beta 1 job." + default: "" + xcode_26_beta_1_setup_command: + type: string + description: "The command(s) to be executed before all other work." + default: "" + + build_scheme: + type: string + description: "The build scheme used in the Xcode builds." + swift_test_enabled: + type: boolean + description: "Boolean to enable test execution with `swift test`. Defaults to true." + default: true + macos_xcode_build_enabled: + type: boolean + description: "Boolean to enable the Xcode build targeting macOS. Defaults to true." + default: true + macos_xcode_test_enabled: + type: boolean + description: "Boolean to enable the Xcode test targeting macOS. Defaults to false." + default: false + ios_xcode_build_enabled: + type: boolean + description: "Boolean to enable the Xcode build targeting iOS. Defaults to true." + default: true + ios_xcode_test_enabled: + type: boolean + description: "Boolean to enable the Xcode test targeting iOS. Defaults to false." + default: false + watchos_xcode_build_enabled: + type: boolean + description: "Boolean to enable the Xcode build targeting watchOS. Defaults to true." + default: true + watchos_xcode_test_enabled: + type: boolean + description: "Boolean to enable the Xcode test targeting watchOS. Defaults to false." + default: false + tvos_xcode_build_enabled: + type: boolean + description: "Boolean to enable the Xcode build targeting tvOS. Defaults to true." + default: true + tvos_xcode_test_enabled: + type: boolean + description: "Boolean to enable the Xcode test targeting tvOS. Defaults to false." + default: false + visionos_xcode_build_enabled: + type: boolean + description: "Boolean to enable the Xcode build targeting visionOS. Defaults to true." + default: true + visionos_xcode_test_enabled: + type: boolean + description: "Boolean to enable the Xcode test targeting visionOS. Defaults to false." + default: false + + runner_pool: + type: string + description: "The runner pool which will be requested." + default: "nightly" + +jobs: + construct-matrix: + name: Construct Darwin matrix + runs-on: ubuntu-latest + outputs: + darwin-matrix: '${{ steps.generate-matrix.outputs.darwin-matrix }}' + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - id: generate-matrix + run: | + cat >> "$GITHUB_OUTPUT" << EOM + darwin-matrix=$( + runner_pool="${MATRIX_RUNNER_POOL:="nightly"}" + xcode_15_4_enabled="${MATRIX_MACOS_15_4_ENABLED:=true}" + xcode_15_4_build_arguments_override="${MATRIX_MACOS_15_4_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_15_4_test_arguments_override="${MATRIX_MACOS_15_4_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_15_4_setup_command="${MATRIX_MACOS_15_4_SETUP_COMMAND:=""}" + xcode_16_0_enabled="${MATRIX_MACOS_16_0_ENABLED:=true}" + xcode_16_0_build_arguments_override="${MATRIX_MACOS_16_0_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_16_0_test_arguments_override="${MATRIX_MACOS_16_0_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_16_0_setup_command="${MATRIX_MACOS_16_0_SETUP_COMMAND:=""}" + xcode_16_1_enabled="${MATRIX_MACOS_16_1_ENABLED:=true}" + xcode_16_1_build_arguments_override="${MATRIX_MACOS_16_1_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_16_1_test_arguments_override="${MATRIX_MACOS_16_1_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_16_1_setup_command="${MATRIX_MACOS_16_1_SETUP_COMMAND:=""}" + xcode_16_2_enabled="${MATRIX_MACOS_16_2_ENABLED:=true}" + xcode_16_2_build_arguments_override="${MATRIX_MACOS_16_2_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_16_2_test_arguments_override="${MATRIX_MACOS_16_2_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_16_2_setup_command="${MATRIX_MACOS_16_2_SETUP_COMMAND:=""}" + xcode_16_3_enabled="${MATRIX_MACOS_16_3_ENABLED:=true}" + xcode_16_3_build_arguments_override="${MATRIX_MACOS_16_3_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_16_3_test_arguments_override="${MATRIX_MACOS_16_3_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_16_3_setup_command="${MATRIX_MACOS_16_3_SETUP_COMMAND:=""}" + xcode_26_beta_1_enabled="${MATRIX_MACOS_26_BETA_1_ENABLED:=true}" + xcode_26_beta_1_build_arguments_override="${MATRIX_MACOS_26_BETA_1_BUILD_ARGUMENTS_OVERRIDE:=""}" + xcode_26_beta_1_test_arguments_override="${MATRIX_MACOS_26_BETA_1_TEST_ARGUMENTS_OVERRIDE:=""}" + xcode_26_beta_1_setup_command="${MATRIX_MACOS_26_BETA_1_SETUP_COMMAND:=""}" + + # Create matrix from inputs + matrix='{"config": []}' + + if [[ "$xcode_15_4_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_15_4_setup_command" \ + --arg build_arguments_override "$xcode_15_4_build_arguments_override" \ + --arg test_arguments_override "$xcode_15_4_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 15.4", "xcode_version": "15.4", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + if [[ "$xcode_16_0_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_16_0_setup_command" \ + --arg build_arguments_override "$xcode_16_0_build_arguments_override" \ + --arg test_arguments_override "$xcode_16_0_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 16.0", "xcode_version": "16.0", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + if [[ "$xcode_16_1_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_16_1_setup_command" \ + --arg build_arguments_override "$xcode_16_1_build_arguments_override" \ + --arg test_arguments_override "$xcode_16_1_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 16.1", "xcode_version": "16.1", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + if [[ "$xcode_16_2_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_16_2_setup_command" \ + --arg build_arguments_override "$xcode_16_2_build_arguments_override" \ + --arg test_arguments_override "$xcode_16_2_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 16.2", "xcode_version": "16.2", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + if [[ "$xcode_16_3_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_16_3_setup_command" \ + --arg build_arguments_override "$xcode_16_3_build_arguments_override" \ + --arg test_arguments_override "$xcode_16_3_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 16.3", "xcode_version": "16.3", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + if [[ "$xcode_26_beta_1_enabled" == "true" ]]; then + matrix=$(echo "$matrix" | jq -c \ + --arg setup_command "$xcode_26_beta_1_setup_command" \ + --arg build_arguments_override "$xcode_26_beta_1_build_arguments_override" \ + --arg test_arguments_override "$xcode_26_beta_1_test_arguments_override" \ + --arg runner_pool "$runner_pool" \ + '.config[.config| length] |= . + { "name": "Xcode 26 beta 1", "xcode_version": "26.b1", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }') + fi + + echo "$matrix" | jq -c + )" + EOM + env: + MATRIX_RUNNER_POOL: ${{ inputs.runner_pool }} + MATRIX_MACOS_15_4_ENABLED: ${{ inputs.xcode_15_4_enabled }} + MATRIX_MACOS_15_4_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_15_4_build_arguments_override }} + MATRIX_MACOS_15_4_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_15_4_test_arguments_override }} + MATRIX_MACOS_15_4_SETUP_COMMAND: ${{ inputs.xcode_15_4_setup_command }} + MATRIX_MACOS_16_0_ENABLED: ${{ inputs.xcode_16_0_enabled }} + MATRIX_MACOS_16_0_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_0_build_arguments_override }} + MATRIX_MACOS_16_0_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_0_test_arguments_override }} + MATRIX_MACOS_16_0_SETUP_COMMAND: ${{ inputs.xcode_16_0_setup_command }} + MATRIX_MACOS_16_1_ENABLED: ${{ inputs.xcode_16_1_enabled }} + MATRIX_MACOS_16_1_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_1_build_arguments_override }} + MATRIX_MACOS_16_1_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_1_test_arguments_override }} + MATRIX_MACOS_16_1_SETUP_COMMAND: ${{ inputs.xcode_16_1_setup_command }} + MATRIX_MACOS_16_2_ENABLED: ${{ inputs.xcode_16_2_enabled }} + MATRIX_MACOS_16_2_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_2_build_arguments_override }} + MATRIX_MACOS_16_2_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_2_test_arguments_override }} + MATRIX_MACOS_16_2_SETUP_COMMAND: ${{ inputs.xcode_16_2_setup_command }} + MATRIX_MACOS_16_3_ENABLED: ${{ inputs.xcode_16_3_enabled }} + MATRIX_MACOS_16_3_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_3_build_arguments_override }} + MATRIX_MACOS_16_3_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_16_3_test_arguments_override }} + MATRIX_MACOS_16_3_SETUP_COMMAND: ${{ inputs.xcode_16_3_setup_command }} + MATRIX_MACOS_26_BETA_1_ENABLED: ${{ inputs.xcode_26_beta_1_enabled }} + MATRIX_MACOS_26_BETA_1_BUILD_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_26_beta_1_build_arguments_override }} + MATRIX_MACOS_26_BETA_1_TEST_ARGUMENTS_OVERRIDE: ${{ inputs.xcode_26_beta_1_test_arguments_override }} + MATRIX_MACOS_26_BETA_1_SETUP_COMMAND: ${{ inputs.xcode_26_beta_1_setup_command }} + + darwin-job: + name: ${{ matrix.config.name }} + needs: construct-matrix + runs-on: [self-hosted, macos, "${{ matrix.config.os }}", "${{ matrix.config.arch }}", "${{ matrix.config.pool }}"] + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.construct-matrix.outputs.darwin-matrix) }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + submodules: true + - name: Setup command + run: | + if [ -n "${{ matrix.config.setup_command }}" ]; then + bash -c "${{ matrix.config.setup_command }}" + fi + - name: Swift build + run: | + if [ -n "${{ matrix.config.build_arguments_override }}" ]; then + swift build ${{ matrix.config.build_arguments_override }} + else + swift build --build-tests + fi + - name: Swift test + if: 'inputs.swift_test_enabled' + run: | + if [ -n "${{ matrix.config.test_arguments_override }}" ]; then + swift test ${{ matrix.config.test_arguments_override }} + else + swift test + fi + # see `xcodebuild -list` for schemes, `simctl list` for destinations + - name: macOS build + if: '!cancelled() && inputs.macos_xcode_build_enabled' + run: /usr/bin/xcodebuild -quiet -scheme ${BUILD_SCHEME} -destination "generic/platform=macos" build + - name: macOS test + if: '!cancelled() && inputs.macos_xcode_test_enabled' + run: /usr/bin/xcodebuild -quiet -scheme ${BUILD_SCHEME} -destination "name=My Mac" test + env: + XCODE_VERSION: ${{ matrix.config.xcode_version }} + DEVELOPER_DIR: "/Applications/Xcode_${{ matrix.config.xcode_version }}.app" + BUILD_SCHEME: ${{ inputs.build_scheme }} \ No newline at end of file diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 39fa7ee6..0b1a357c 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -39,6 +39,14 @@ jobs: - name: Gradle compile JMH benchmarks run: ./gradlew compileJmh --info + macos-tests: + name: macOS tests + # Workaround https://github.com/nektos/act/issues/1875 + uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@main + with: + runner_pool: general + build_scheme: SwiftJava-Package + test-swift: name: Swift tests (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }}) runs-on: ubuntu-latest From 4e7b0675c1f4280cdd2a2d28a8fa7eb88d3e85c5 Mon Sep 17 00:00:00 2001 From: Konrad 'ktoso' Malawski Date: Fri, 27 Jun 2025 14:25:42 +0900 Subject: [PATCH 2/4] wip --- .github/workflows/{macos_tests.yaml => macos_tests.yml} | 0 .github/workflows/pull_request.yml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{macos_tests.yaml => macos_tests.yml} (100%) diff --git a/.github/workflows/macos_tests.yaml b/.github/workflows/macos_tests.yml similarity index 100% rename from .github/workflows/macos_tests.yaml rename to .github/workflows/macos_tests.yml diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0b1a357c..df95bf82 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -42,7 +42,7 @@ jobs: macos-tests: name: macOS tests # Workaround https://github.com/nektos/act/issues/1875 - uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@main + uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@wip-macos-ci with: runner_pool: general build_scheme: SwiftJava-Package From 1332980c6268c18eeb0020f01de64a6fbaa26d87 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Sat, 28 Jun 2025 12:36:51 +0900 Subject: [PATCH 3/4] Update pull_request.yml --- .github/workflows/pull_request.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index df95bf82..c4de095c 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -44,7 +44,6 @@ jobs: # Workaround https://github.com/nektos/act/issues/1875 uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@wip-macos-ci with: - runner_pool: general build_scheme: SwiftJava-Package test-swift: From 03e93e6581e8da0954b9eb91dee089032d7b70ab Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Sat, 28 Jun 2025 12:49:40 +0900 Subject: [PATCH 4/4] Different way to run macos test --- .github/workflows/pull_request.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index c4de095c..f50bc47c 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -39,12 +39,24 @@ jobs: - name: Gradle compile JMH benchmarks run: ./gradlew compileJmh --info - macos-tests: - name: macOS tests - # Workaround https://github.com/nektos/act/issues/1875 - uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@wip-macos-ci - with: - build_scheme: SwiftJava-Package +# macos-tests: +# name: macOS tests +# # Workaround https://github.com/nektos/act/issues/1875 +# uses: swiftlang/swift-java/.github/workflows/macos_tests.yml@wip-macos-ci +# with: +# build_scheme: SwiftJava-Package + + macos-tests-selfhosted: + name: Swift tests (macOS Sequoia ARM64) + runs-on: [self-hosted, macos, sequoia, ARM64] + strategy: + fail-fast: false + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Build and Test + run: swift test + timeout-minutes: 20 test-swift: name: Swift tests (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }})