Skip to content

Commit 35d6223

Browse files
committed
GHA: Enable Testing on Windows
- Update GitHub actions to also execute the automated testson Windows - Install zip/unzip on debian platform Relates to: #9427 Issue: rdar://165491718
1 parent 75c0af2 commit 35d6223

14 files changed

Lines changed: 273 additions & 105 deletions

File tree

.github/scripts/prebuild.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ if (-not $SkipAndroid) {
3838
# Work around a bug in the package causing the env var to be set incorrectly
3939
$env:ANDROID_NDK_ROOT = $env:ANDROID_NDK_ROOT.replace('-windows.zip','')
4040
}
41+
42+
Get-ChildItem Env:

.github/scripts/prebuild.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
##
1212
##===----------------------------------------------------------------------===##
1313

14-
set -e
14+
set -ex
1515

1616
if [[ $(uname) == Darwin ]] ; then
1717
if [[ "$INSTALL_CMAKE" == "1" ]] ; then
@@ -43,10 +43,16 @@ elif command -v apt-get >/dev/null 2>&1 ; then # bookworm, noble, jammy
4343
# Debug symbols
4444
apt-get install -y libc6-dbg
4545

46+
# SwiftPM requirements
47+
apt-get install -y zip unzip
48+
4649
if [[ "$INSTALL_CMAKE" == "1" ]] ; then
4750
apt-get install -y cmake ninja-build
4851
fi
4952

53+
# Install test dependencies
54+
apt-get install -y python3
55+
5056
# Android NDK
5157
dpkg_architecture="$(dpkg --print-architecture)"
5258
if [[ "$SKIP_ANDROID" != "1" ]] && [[ "$dpkg_architecture" == amd64 ]] ; then
@@ -82,4 +88,12 @@ elif command -v yum >/dev/null 2>&1 ; then # amazonlinux2
8288
# Debug symbols
8389
yum install -y yum-utils
8490
debuginfo-install -y glibc
91+
92+
# Install test dependencies
93+
yum install --assumeyes python3
94+
95+
# SwiftPM requirements
96+
yum install -y zip unzip
8597
fi
98+
99+
env | sort

.github/workflows/pull_request.yml

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,62 +16,71 @@ jobs:
1616
needs: [soundness]
1717
strategy:
1818
fail-fast: false
19-
matrix:
20-
executableTargetBuildSystem: ["native"]
21-
buildSystem: ["native", "swiftbuild"]
22-
linuxSwiftVersion: ['["nightly-main", "nightly-6.2"]', '["nightly-main"]']
23-
exclude:
24-
- buildSystem: "swiftbuild"
25-
linuxSwiftVersion: '["nightly-main", "nightly-6.2"]'
26-
- buildSystem: "native"
27-
linuxSwiftVersion: '["nightly-main"]'
28-
name: Build (${{ matrix.buildSystem }}) (exectable target built using ${{ matrix.executableTargetBuildSystem }})
19+
name: "Build"
2920
uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@0.0.11
3021
with:
3122
enable_cross_pr_testing: true
23+
# linux_publish_test_results: true
24+
enable_linux_checks: true
3225
linux_os_versions: '["amazonlinux2", "bookworm", "noble", "jammy", "rhel-ubi9"]'
33-
linux_swift_versions: ${{ matrix.linuxSwiftVersion }}
26+
linux_swift_versions: '["nightly-main"]'
3427
linux_pre_build_command: ./.github/scripts/prebuild.sh
35-
linux_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}}'
36-
# linux_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}} && swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-test --parallel --build-system ${{ matrix.buildSystem}}'
37-
windows_build_timeout: 180
38-
windows_swift_versions: '["nightly-main"]'
39-
windows_pre_build_command: 'Invoke-Program .\.github\scripts\prebuild.ps1'
40-
windows_build_command: 'Invoke-Program swift run -Xlinker /ignore:4217 --configuration release --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests -Xlinker /ignore:4217 --build-system ${{ matrix.buildSystem}}'
41-
# windows_build_command: 'Invoke-Program swift run -Xlinker /ignore:4217 --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests -Xlinker /ignore:4217 --build-system ${{ matrix.buildSystem}}; Invoke-Program swift run --build-system ${{ matrix.executableTargetBuildSystem }} -Xlinker /ignore:4217 swift-test -Xlinker /ignore:4217 --parallel --build-system ${{ matrix.buildSystem}}'
42-
enable_windows_checks: true
43-
enable_ios_checks: false
28+
linux_build_command: 'swift build --build-tests'
29+
enable_windows_checks: false
4430
enable_macos_checks: true
4531
macos_exclude_xcode_versions: "[{\"xcode_version\": \"16.4\"}]"
46-
macos_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}}'
47-
# macos_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}} && swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-test --parallel --build-system ${{ matrix.buildSystem}}'
48-
ios_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}} --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios'
49-
# ios_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem}} --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios && swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-test --parallel --build-system ${{ matrix.buildSystem }} --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios'
32+
macos_build_command: 'swift build --build-tests'
33+
enable_ios_checks: false
34+
enable_wasm_sdk_build: false
35+
5036

51-
build-using-swiftbuild:
37+
build-and-test:
38+
needs: [soundness]
5239
strategy:
5340
fail-fast: false
54-
matrix:
55-
executableTargetBuildSystem: ["swiftbuild"]
56-
buildSystem: ["swiftbuild"]
57-
name: Build (${{ matrix.buildSystem }}) (exectable target built using ${{ matrix.executableTargetBuildSystem }})
41+
name: "Build and Test"
42+
uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@0.0.11
43+
with:
44+
enable_cross_pr_testing: false
45+
# linux_publish_test_results: true
46+
enable_linux_checks: false
47+
# linux_os_versions: '["amazonlinux2", "bookworm", "noble", "jammy", "rhel-ubi9"]'
48+
linux_swift_versions: '["nightly-main", "6.2.0"]'
49+
linux_pre_build_command: ./.github/scripts/prebuild.sh
50+
linux_build_command: 'swift run swift-test --parallel --experimental-xunit-message-failure --xunit-output linux-xunit.xml'
51+
enable_windows_checks: true
52+
windows_build_timeout: 480
53+
windows_swift_versions: '["nightly-main", "6.2.0"]'
54+
windows_pre_build_command: 'Invoke-Program .\.github\scripts\prebuild.ps1 -SkipAndroid'
55+
windows_build_command: 'Invoke-Program swift run --configuration release swift-test --scratch-path .test --parallel --experimental-xunit-message-failure --xunit-output windows-xunit.xml'
56+
enable_macos_checks: false
57+
# Need to run against macOS OSS Toolchain: https://github.com/swiftlang/github-workflows/issues/240
58+
macos_build_timeout: 480
59+
macos_xcode_versions: "[\"26.4\"]"
60+
# macos_env_vars: |
61+
# SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"
62+
macos_build_command: 'swift build --product swiftpm-testing-helper && swift run swift-test --parallel --experimental-xunit-message-failure --xunit-output macos-xunit.xml'
63+
enable_ios_checks: false
64+
# ios_build_timeout: 240
65+
# ios_build_command: 'swift build --product swiftpm-testing-helper --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios && swift run swift-test--parallel --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios --experimental-xunit-message-failure --xunit-output ios-xunit.xml'
66+
67+
build-and-test-al2:
5868
needs: [soundness]
69+
strategy:
70+
fail-fast: false
71+
name: "Build and Test"
5972
uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@0.0.11
6073
with:
61-
linux_os_versions: '["amazonlinux2", "bookworm", "noble", "jammy", "rhel-ubi9"]'
62-
linux_swift_versions: '["nightly-main"]'
74+
enable_cross_pr_testing: false
75+
# linux_publish_test_results: true
76+
enable_linux_checks: false
77+
linux_os_versions: '["amazonlinux2"]'
78+
linux_swift_versions: '["6.2.0"]'
6379
linux_pre_build_command: ./.github/scripts/prebuild.sh
64-
linux_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem }}'
80+
linux_build_command: 'swift run swift-test --parallel --experimental-xunit-message-failure --xunit-output linux-xunit.xml'
6581
enable_windows_checks: false
66-
windows_build_timeout: 180
67-
windows_swift_versions: '["nightly-main"]'
68-
windows_pre_build_command: 'Invoke-Program .\.github\scripts\prebuild.ps1'
69-
windows_build_command: 'Invoke-Program swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem }}'
82+
enable_macos_checks: false
7083
enable_ios_checks: false
71-
enable_macos_checks: true
72-
macos_exclude_xcode_versions: "[{\"xcode_version\": \"16.3\"}, {\"xcode_version\": \"16.4\"}]"
73-
macos_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem }}'
74-
ios_build_command: 'swift run --build-system ${{ matrix.executableTargetBuildSystem }} swift-build --build-tests --build-system ${{ matrix.buildSystem }} --sdk \"$(xcrun --sdk iphoneos --show-sdk-path)\" --triple arm64-apple-ios'
7584

7685
soundness:
7786
name: Soundness
@@ -100,7 +109,7 @@ jobs:
100109
wasm_sdk_versions: '["nightly-main"]'
101110
wasm_sdk_pre_build_command: ./.github/scripts/prebuild.sh
102111
# This is a hack - replace the build command with a test command and drop the --swift-sdk arg the workflow appends.
103-
wasm_sdk_build_command: "swift test --filter WebAssemblyIntegrationTests #"
112+
wasm_sdk_build_command: "swift test --parallel --experimental-xunit-message-failure --xunit-output wasm-xunit.xml --filter WebAssemblyIntegrationTests #"
104113

105114
static-linux-integration-tests:
106115
name: Static Linux Integration Tests
@@ -114,4 +123,4 @@ jobs:
114123
linux_static_sdk_versions: '["nightly-main"]'
115124
linux_static_sdk_pre_build_command: ./.github/scripts/prebuild.sh
116125
# This is a hack - replace the build command with a test command and drop the --swift-sdk arg the workflow appends.
117-
linux_static_sdk_build_command: "swift test --filter StaticLinuxIntegrationTests #"
126+
linux_static_sdk_build_command: "swift test --parallel --experimental-xunit-message-failure --xunit-output wasm-xunit.xml --filter StaticLinuxIntegrationTests #"

.github/workflows/pull_request_dependency_check.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
name: Pull Request
2+
13
on:
24
pull_request_target:
35
types: [opened, edited, reopened, labeled, unlabeled, synchronize]

Fixtures/Miscellaneous/Plugins/MyBinaryToolPlugin/Binaries/MyVendedSourceGenBuildTool.artifactbundle/mytool-windows/mytool.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ if "%verbose%" == "true" (
1818
echo "[mytool-windows] '%input%' '%output%'"
1919
)
2020
@echo on
21-
echo f | xcopy.exe /f "%input%" "%output%"
21+
echo f | copy.exe "%input%" "%output%"

Sources/_InternalTestSupport/ProcessInfo+hostutils.swift

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import Foundation
1313

1414
extension ProcessInfo {
15-
public static func isHostAmazonLinux2(_ content: String? = nil) -> Bool {
15+
package static func isHost(osName: String, _ content: String? = nil) -> Bool {
1616
let contentString: String
1717
if let content {
1818
contentString = content
@@ -24,8 +24,35 @@ extension ProcessInfo {
2424
return false
2525
}
2626
}
27-
let al2_name = "PRETTY_NAME=\"Amazon Linux 2\""
28-
return contentString.contains(al2_name)
27+
return contentString.contains(osName)
2928
}
3029

30+
public static func isHostAmazonLinux2() -> Bool {
31+
let name = "PRETTY_NAME=\"Amazon Linux 2\""
32+
return Self.isHost(osName: name)
33+
}
34+
35+
public static func isHostUbuntu20_04_bookworm() -> Bool {
36+
let name = "PRETTY_NAME=\"Ubuntu 20.04"
37+
return Self.isHost(osName: name)
38+
}
39+
40+
public static func isHostUbuntu22_04_jammy() -> Bool {
41+
let name = "PRETTY_NAME=\"Ubuntu 22.04"
42+
return Self.isHost(osName: name)
43+
}
44+
45+
public static func isHostUbuntu24_04_noble() -> Bool {
46+
let name = "PRETTY_NAME=\"Ubuntu 24.04"
47+
return Self.isHost(osName: name)
48+
}
49+
50+
public static func isHostRHEL9() -> Bool {
51+
do {
52+
let name = "PRETTY_NAME=\"Red Hat Enterprise Linux 9"
53+
return Self.isHost(osName: name)
54+
} catch {
55+
return false
56+
}
57+
}
3158
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift open source project
4+
//
5+
// Copyright (c) 2026 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See http://swift.org/LICENSE.txt for license information
9+
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
14+
extension String {
15+
public var fixwin: String {
16+
#if os(Windows)
17+
return self.replacingOccurrences(of: "/", with: "\\")
18+
#else
19+
return self
20+
#endif
21+
}
22+
}

Sources/_InternalTestSupport/XCTAssertHelpers.swift

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,50 @@ public func XCTSkipOnWindows(because reason: String? = nil, skipPlatformCi: Bool
9797
#endif
9898
}
9999

100-
public func _requiresTools(_ executable: String) throws {
100+
public func XCTSkipOnAmazonLinux2(because reason: String, file: StaticString = #filePath, line: UInt = #line) throws {
101+
swiftTestingTestCalledAnXCTestAPI()
102+
try XCTSkipIf(
103+
ProcessInfo.isHostAmazonLinux2(),
104+
"Skiping test: \(reason)",
105+
file: file,
106+
line: line,
107+
)
108+
}
109+
110+
public func XCTSkipOnUbuntu20_04_bookworm(because reason: String, file: StaticString = #filePath, line: UInt = #line) throws {
111+
swiftTestingTestCalledAnXCTestAPI()
112+
try XCTSkipIf(
113+
ProcessInfo.isHostUbuntu20_04_bookworm(),
114+
"Skiping test: \(reason)",
115+
file: file,
116+
line: line,
117+
)
118+
}
119+
120+
public func XCTSkipOnUbuntu22_04_jammy(because reason: String, file: StaticString = #filePath, line: UInt = #line) throws {
121+
swiftTestingTestCalledAnXCTestAPI()
122+
try XCTSkipIf(
123+
ProcessInfo.isHostUbuntu22_04_jammy(),
124+
"Skiping test: \(reason)",
125+
file: file,
126+
line: line,
127+
)
128+
}
129+
130+
public func _requiresTools(
131+
_ executable: String,
132+
fs: FileSystem = localFileSystem,
133+
) throws {
101134
func getAsyncProcessArgs(_ executable: String) -> [String] {
102135
#if os(Windows)
103136
let args = ["cmd.exe", "/c", "where.exe", executable]
104137
#else
105-
let args = ["which", executable]
138+
let command = if fs.exists("/usr/bin/which") {
139+
"/usr/bin/which"
140+
} else {
141+
"/usr/bin/whereis"
142+
}
143+
let args = [command, executable]
106144
#endif
107145
return args
108146
}

0 commit comments

Comments
 (0)