Skip to content

Commit 99b51c1

Browse files
authored
Move CI to GitHub Actions (#786)
* Fix merge artifacts NoError -> Never * Move to GitHub Actions * Remove Travis CI config. * Fix tests building for Mac Catalyst. * Linux tests + Package Manager verification * Build only xcodebuild for watchOS. * Don't cache anything for SwiftPM macOS verification. * Use Swift 5.2.4 for Linux CI. * Fix checkout in Carthage verification step. * Don't fail fast. * Use swiftenv * Refactor a flaky async test case to use TestScheduler. * Use Carthage shared cache instead. * Change the trigger condition of the verification workflow * Cache the entirety of `~/Library/Caches/org.carthage.CarthageKit`. * Bump Carthage verification cache key * Use shorthands in the job matrix config.
1 parent 5a383c8 commit 99b51c1

File tree

9 files changed

+205
-183
lines changed

9 files changed

+205
-183
lines changed

.github/workflows/master.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
on:
2+
push:
3+
branches:
4+
- master
5+
pull_request:
6+
types: [labeled]
7+
branches:
8+
- master
9+
name: Verification
10+
jobs:
11+
carthage:
12+
if: ${{ github.event_name == 'push' || ( github.event_name == 'pull_request' && github.event.label.name == 'ci:verify' ) }}
13+
runs-on: macos-latest
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@v2
17+
- name: Recover cached dependencies
18+
uses: actions/cache@v1
19+
id: dependency-cache
20+
with:
21+
path: ~/Library/Caches/org.carthage.CarthageKit
22+
key: 4-carthage-verification-${{ runner.os }}-${{ hashFiles('Cartfile.resolved') }}
23+
- name: Carthage verification
24+
run: |
25+
carthage checkout
26+
carthage build --cache-builds --no-skip-current
27+
28+
swiftpm-macos:
29+
if: ${{ github.event_name == 'push' || ( github.event_name == 'pull_request' && github.event.label.name == 'ci:verify' ) }}
30+
name: SwiftPM macOS
31+
runs-on: macos-latest
32+
steps:
33+
- name: Checkout
34+
uses: actions/checkout@v2
35+
- name: Pull dependencies
36+
run: |
37+
swift package resolve
38+
- name: Test via SwiftPM
39+
run: |
40+
swift --version
41+
swift build
42+
43+
cocoapods:
44+
if: ${{ github.event_name == 'push' || ( github.event_name == 'pull_request' && github.event.label.name == 'ci:verify' ) }}
45+
runs-on: macos-latest
46+
steps:
47+
- name: Checkout
48+
uses: actions/checkout@v2
49+
- name: CocoaPods verification
50+
run: |
51+
pod repo update
52+
pod lib lint --use-libraries
53+

.github/workflows/test.yml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
on: pull_request
2+
name: Test
3+
jobs:
4+
test:
5+
name: Test
6+
runs-on: macos-latest
7+
strategy:
8+
fail-fast: false
9+
matrix:
10+
destination: [macOS, macCatalyst, iOS, tvOS, watchOS]
11+
steps:
12+
- name: Checkout
13+
uses: actions/checkout@v2
14+
- name: Recover cached dependencies
15+
uses: actions/cache@v1
16+
id: dependency-cache
17+
with:
18+
path: Carthage/Checkouts
19+
key: carthage-${{ hashFiles('Cartfile.resolved') }}
20+
- name: Pull dependencies
21+
if: steps.dependency-cache.outputs.cache-hit != 'true'
22+
run: |
23+
carthage checkout
24+
- name: Test via xcodebuild
25+
run: |
26+
ACTION=test
27+
DESTINATION=unknown
28+
SCHEME=unknown
29+
30+
case "${{ matrix.destination }}" in
31+
"iOS")
32+
DESTINATION="platform=iOS Simulator,name=iPhone 11 Pro"
33+
SCHEME=ReactiveSwift-iOS
34+
;;
35+
"tvOS")
36+
DESTINATION="platform=tvOS Simulator,name=Apple TV 4K"
37+
SCHEME=ReactiveSwift-tvOS
38+
;;
39+
"watchOS")
40+
ACTION=build
41+
DESTINATION="platform=watchOS Simulator,name=Apple Watch Series 5 - 44mm"
42+
SCHEME=ReactiveSwift-watchOS
43+
;;
44+
"macCatalyst")
45+
DESTINATION="platform=macOS,variant=Mac Catalyst"
46+
SCHEME=ReactiveSwift-iOS
47+
;;
48+
"macOS")
49+
DESTINATION="platform=macOS,arch=x86_64"
50+
SCHEME=ReactiveSwift-macOS
51+
;;
52+
*)
53+
echo "Unknown destination."
54+
exit 1
55+
;;
56+
esac
57+
58+
xcodebuild clean ${ACTION} \
59+
-destination "${DESTINATION}" \
60+
-scheme ${SCHEME} \
61+
-workspace ReactiveSwift.xcworkspace \
62+
CODE_SIGN_IDENTITY="" \
63+
CODE_SIGNING_REQUIRED=NO \
64+
ONLY_ACTIVE_ARCH=YES
65+
66+
swiftpm-linux:
67+
name: SwiftPM Linux
68+
runs-on: ubuntu-18.04
69+
steps:
70+
- name: Install Swift
71+
run: |
72+
eval "$(curl -sL https://swiftenv.fuller.li/install.sh)"
73+
- name: Checkout
74+
uses: actions/checkout@v2
75+
- name: Recover cached dependencies
76+
uses: actions/cache@v1
77+
id: dependency-cache
78+
with:
79+
path: .build
80+
key: swiftpm-linux-${{ hashFiles('Package.resolved') }}
81+
- name: Pull dependencies
82+
if: steps.dependency-cache.outputs.cache-hit != 'true'
83+
run: |
84+
swift package resolve
85+
- name: Test via SwiftPM
86+
run: |
87+
swift --version
88+
swift build
89+
swift test
90+

.travis.yml

Lines changed: 0 additions & 93 deletions
This file was deleted.

ReactiveSwift.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
57A4D1BE1BA13D7A00F7D4B1 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312BC19EF2A5800984962 /* Bag.swift */; };
3434
57A4D1C01BA13D7A00F7D4B1 /* FoundationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B4A3C19F4C39A009E02AC /* FoundationExtensions.swift */; };
3535
57A4D20A1BA13D7A00F7D4B1 /* ReactiveSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
36+
5B8CAB7F24787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8CAB7E24787D6500717AB5 /* QueueScheduler+Factory.swift */; };
37+
5B8CAB8024787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8CAB7E24787D6500717AB5 /* QueueScheduler+Factory.swift */; };
38+
5B8CAB8124787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8CAB7E24787D6500717AB5 /* QueueScheduler+Factory.swift */; };
3639
7DFBED081CDB8C9500EE435B /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57A4D2411BA13D7A00F7D4B1 /* ReactiveSwift.framework */; };
3740
7DFBED1E1CDB8D7000EE435B /* ReactiveSwift.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 57A4D2411BA13D7A00F7D4B1 /* ReactiveSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3841
7DFBED1F1CDB8D7800EE435B /* Quick.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -235,6 +238,7 @@
235238
57A4D2451BA13F9700F7D4B1 /* tvOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Base.xcconfig"; sourceTree = "<group>"; };
236239
57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Framework.xcconfig"; sourceTree = "<group>"; };
237240
57A4D2471BA13F9700F7D4B1 /* tvOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-StaticLibrary.xcconfig"; sourceTree = "<group>"; };
241+
5B8CAB7E24787D6500717AB5 /* QueueScheduler+Factory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QueueScheduler+Factory.swift"; sourceTree = "<group>"; };
238242
7DFBED031CDB8C9500EE435B /* ReactiveSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactiveSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
239243
9A090C131DA0309E00EE97CA /* Reactive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reactive.swift; sourceTree = "<group>"; };
240244
9A1A4F981E16961C006F3039 /* ValidatingPropertySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatingPropertySpec.swift; sourceTree = "<group>"; };
@@ -505,6 +509,7 @@
505509
D05E662419EDD82000904ACA /* Nimble.framework */,
506510
D037672B19EDA75D00A782A9 /* Quick.framework */,
507511
BFA6B94A1A76044800C846D1 /* SignalProducerNimbleMatchers.swift */,
512+
5B8CAB7E24787D6500717AB5 /* QueueScheduler+Factory.swift */,
508513
D04725FB19E49ED7006002AA /* Info.plist */,
509514
);
510515
name = "Supporting Files";
@@ -908,6 +913,7 @@
908913
7DFBED2F1CDB8DE300EE435B /* TestError.swift in Sources */,
909914
7DFBED301CDB8DE300EE435B /* TestLogger.swift in Sources */,
910915
9A1D067F1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */,
916+
5B8CAB8124787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */,
911917
9A1A4F9F1E16AE55006F3039 /* ValidatingPropertySpec.swift in Sources */,
912918
4A0E11061D2A95200065D310 /* LifetimeSpec.swift in Sources */,
913919
7DFBED6D1CDB8F7D00EE435B /* SignalProducerNimbleMatchers.swift in Sources */,
@@ -991,6 +997,7 @@
991997
02D2602B1C1D6DB8003ACC61 /* SignalLifetimeSpec.swift in Sources */,
992998
D0C3130C19EF2B1F00984962 /* DisposableSpec.swift in Sources */,
993999
9A1D067D1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */,
1000+
5B8CAB7F24787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */,
9941001
9A1A4F9D1E16AE50006F3039 /* ValidatingPropertySpec.swift in Sources */,
9951002
D0A2260B1A72E6C500D33B74 /* SignalProducerSpec.swift in Sources */,
9961003
D8024DB21B2E1BB0005E6B9A /* SignalProducerLiftingSpec.swift in Sources */,
@@ -1046,6 +1053,7 @@
10461053
CA6F28511C52626B001879D2 /* FlattenSpec.swift in Sources */,
10471054
579504341BB8A34300A5E482 /* BagSpec.swift in Sources */,
10481055
9A1D067E1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */,
1056+
5B8CAB8024787D6500717AB5 /* QueueScheduler+Factory.swift in Sources */,
10491057
9A1A4F9E1E16AE50006F3039 /* ValidatingPropertySpec.swift in Sources */,
10501058
4A0E11051D2A95200065D310 /* LifetimeSpec.swift in Sources */,
10511059
02D2602A1C1D6DAF003ACC61 /* SignalLifetimeSpec.swift in Sources */,
@@ -1367,6 +1375,7 @@
13671375
isa = XCBuildConfiguration;
13681376
baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */;
13691377
buildSettings = {
1378+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
13701379
INFOPLIST_FILE = Tests/ReactiveSwiftTests/Info.plist;
13711380
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
13721381
PRODUCT_NAME = "$(PROJECT_NAME)Tests";
@@ -1377,6 +1386,7 @@
13771386
isa = XCBuildConfiguration;
13781387
baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */;
13791388
buildSettings = {
1389+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
13801390
INFOPLIST_FILE = Tests/ReactiveSwiftTests/Info.plist;
13811391
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
13821392
PRODUCT_NAME = "$(PROJECT_NAME)Tests";
@@ -1441,6 +1451,7 @@
14411451
isa = XCBuildConfiguration;
14421452
baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */;
14431453
buildSettings = {
1454+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
14441455
INFOPLIST_FILE = Tests/ReactiveSwiftTests/Info.plist;
14451456
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
14461457
PRODUCT_NAME = "$(PROJECT_NAME)Tests";
@@ -1505,6 +1516,7 @@
15051516
isa = XCBuildConfiguration;
15061517
baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */;
15071518
buildSettings = {
1519+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
15081520
INFOPLIST_FILE = Tests/ReactiveSwiftTests/Info.plist;
15091521
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
15101522
PRODUCT_NAME = "$(PROJECT_NAME)Tests";

Tests/ReactiveSwiftTests/FlattenSpec.swift

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,14 +1378,7 @@ class FlattenSpec: QuickSpec {
13781378
}
13791379

13801380
it("should asynchronously merge up to the stated limit, buffer any subsequent producers and dequeue them in the submission order") {
1381-
let scheduler: QueueScheduler
1382-
1383-
if #available(macOS 10.10, *) {
1384-
scheduler = QueueScheduler()
1385-
} else {
1386-
scheduler = QueueScheduler(queue: DispatchQueue.global(priority: .default))
1387-
}
1388-
1381+
let scheduler = QueueScheduler.makeForTesting()
13891382
run { $0.start(on: scheduler) }
13901383
}
13911384
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import ReactiveSwift
2+
import Foundation
3+
4+
extension QueueScheduler {
5+
static func makeForTesting(file: String = #file, line: UInt = #line) -> QueueScheduler {
6+
let file = URL(string: file)?.lastPathComponent ?? "<unknown>"
7+
let label = "reactiveswift:\(file):\(line)"
8+
9+
#if targetEnvironment(macCatalyst)
10+
return QueueScheduler()
11+
#else
12+
if #available(OSX 10.10, iOS 8.0, *) {
13+
return QueueScheduler()
14+
} else {
15+
return QueueScheduler(queue: DispatchQueue(label: label))
16+
}
17+
#endif
18+
}
19+
}

Tests/ReactiveSwiftTests/SchedulerSpec.swift

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,7 @@ class SchedulerSpec: QuickSpec {
140140
describe("QueueScheduler") {
141141
it("should run enqueued actions on a global queue") {
142142
var didRun = false
143-
144-
let scheduler: QueueScheduler
145-
if #available(OSX 10.10, *) {
146-
scheduler = QueueScheduler(qos: .default, name: "\(#file):\(#line)")
147-
} else {
148-
scheduler = QueueScheduler(queue: DispatchQueue(label: "\(#file):\(#line)"))
149-
}
143+
let scheduler = QueueScheduler.makeForTesting()
150144

151145
scheduler.schedule {
152146
didRun = true
@@ -160,11 +154,7 @@ class SchedulerSpec: QuickSpec {
160154
var scheduler: QueueScheduler!
161155

162156
beforeEach {
163-
if #available(OSX 10.10, *) {
164-
scheduler = QueueScheduler(qos: .default, name: "\(#file):\(#line)")
165-
} else {
166-
scheduler = QueueScheduler(queue: DispatchQueue(label: "\(#file):\(#line)"))
167-
}
157+
scheduler = QueueScheduler.makeForTesting()
168158
scheduler.queue.suspend()
169159
}
170160

0 commit comments

Comments
 (0)