Skip to content

Commit ac56297

Browse files
authored
ci: simplistic way to get macOS running (#294)
1 parent 8c38d19 commit ac56297

File tree

22 files changed

+266
-61
lines changed

22 files changed

+266
-61
lines changed

.github/actions/prepare_env/action.yml

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,32 @@ description: 'Prepare the CI environment by installing Swift and selected JDK et
44
runs:
55
using: composite
66
steps:
7-
- name: Install System Dependencies
8-
run: apt-get -qq update && apt-get -qq install -y make curl wget libjemalloc2 libjemalloc-dev
9-
shell: bash
10-
- name: Cache JDKs
11-
id: cache-jdk
12-
uses: actions/cache@v4
13-
continue-on-error: true
7+
- name: Set up JDK ${{ matrix.jdk_version }}
8+
uses: actions/setup-java@v4
149
with:
15-
path: /usr/lib/jvm/
16-
key: ${{ runner.os }}-jdk-${{ matrix.jdk_vendor }}-${{ hashFiles('/usr/lib/jvm/*') }}
17-
restore-keys: |
18-
${{ runner.os }}-jdk-
19-
- name: Install JDK
20-
if: steps.cache-jdk.outputs.cache-hit != 'true'
21-
run: "bash -xc 'JDK_VENDOR=${{ matrix.jdk_vendor }} ./docker/install_jdk.sh'"
10+
distribution: ${{ matrix.jdk_vendor }}
11+
java-version: |
12+
24
13+
21
14+
cache: 'gradle'
15+
- name: Set JAVA_HOME_{N}
2216
shell: bash
23-
# TODO: not using setup-java since incompatible with the swiftlang/swift base image
24-
# - name: Install Untested Nightly Swift
25-
# run: "bash -xc './docker/install_untested_nightly_swift.sh'"
26-
- name: Cache local Gradle repository
27-
uses: actions/cache@v4
28-
continue-on-error: true
29-
with:
30-
path: |
31-
/root/.gradle/caches
32-
/root/.gradle/wrapper
33-
key: ${{ runner.os }}-gradle-${{ hashFiles('*/*.gradle*', 'settings.gradle') }}
34-
restore-keys: |
35-
${{ runner.os }}-gradle-
17+
run: |
18+
if [[ -n "$JAVA_HOME_21_X64" ]]; then
19+
echo "JAVA_HOME_21=$JAVA_HOME_21_X64" >> $GITHUB_ENV
20+
elif [[ -n "$JAVA_HOME_21_ARM64" ]]; then
21+
echo "JAVA_HOME_21=$JAVA_HOME_21_ARM64" >> $GITHUB_ENV
22+
fi
23+
if [[ -n "$JAVA_HOME_24_X64" ]]; then
24+
echo "JAVA_HOME_24=$JAVA_HOME_24_X64" >> $GITHUB_ENV
25+
elif [[ -n "$JAVA_HOME_24_ARM64" ]]; then
26+
echo "JAVA_HOME_24=$JAVA_HOME_24_ARM64" >> $GITHUB_ENV
27+
fi
28+
- name: Check Java environment
29+
shell: bash
30+
run: ./gradlew -q javaToolchains
3631
- name: Cache local SwiftPM repository
32+
if: matrix.os_version == 'jammy'
3733
uses: actions/cache@v4
3834
continue-on-error: true
3935
with:

.github/scripts/install_swiftly.sh

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/bin/bash
2+
3+
# This script is reused from Swiftly itself, see:
4+
# https://github.com/swiftlang/swiftly/blob/main/scripts/prep-gh-action.sh
5+
#
6+
# This script does a bit of extra preparation of the docker containers used to run the GitHub workflows
7+
# that are specific to this project's needs when building/testing. Note that this script runs on
8+
# every supported Linux distribution and macOS so it must adapt to the distribution that it is running.
9+
10+
if [[ "$(uname -s)" == "Linux" ]]; then
11+
# Install the basic utilities depending on the type of Linux distribution
12+
apt-get --help && apt-get update && TZ=Etc/UTC apt-get -y install curl make gpg tzdata
13+
yum --help && (curl --help && yum -y install curl) && yum install make gpg
14+
fi
15+
16+
set -e
17+
18+
while [ $# -ne 0 ]; do
19+
arg="$1"
20+
case "$arg" in
21+
snapshot)
22+
swiftMainSnapshot=true
23+
;;
24+
*)
25+
;;
26+
esac
27+
shift
28+
done
29+
30+
echo "Installing swiftly"
31+
32+
if [[ "$(uname -s)" == "Linux" ]]; then
33+
curl -O "https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz" && tar zxf swiftly-*.tar.gz && ./swiftly init -y --skip-install
34+
# shellcheck disable=SC1091
35+
. "/root/.local/share/swiftly/env.sh"
36+
else
37+
# shellcheck disable=SC2155
38+
export SWIFTLY_HOME_DIR="$(pwd)/swiftly-bootstrap"
39+
export SWIFTLY_BIN_DIR="$SWIFTLY_HOME_DIR/bin"
40+
export SWIFTLY_TOOLCHAINS_DIR="$SWIFTLY_HOME_DIR/toolchains"
41+
42+
curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg && pkgutil --check-signature swiftly.pkg && pkgutil --verbose --expand swiftly.pkg "${SWIFTLY_HOME_DIR}" && tar -C "${SWIFTLY_HOME_DIR}" -xvf "${SWIFTLY_HOME_DIR}"/swiftly-*/Payload && "$SWIFTLY_HOME_DIR/bin/swiftly" init -y --skip-install
43+
44+
# shellcheck disable=SC1091
45+
. "$SWIFTLY_HOME_DIR/env.sh"
46+
fi
47+
48+
hash -r
49+
50+
if [ -n "$GITHUB_ENV" ]; then
51+
echo "Updating GitHub environment"
52+
echo "PATH=$PATH" >> "$GITHUB_ENV" && echo "SWIFTLY_HOME_DIR=$SWIFTLY_HOME_DIR" >> "$GITHUB_ENV" && echo "SWIFTLY_BIN_DIR=$SWIFTLY_BIN_DIR" >> "$GITHUB_ENV" && echo "SWIFTLY_TOOLCHAINS_DIR=$SWIFTLY_TOOLCHAINS_DIR" >> "$GITHUB_ENV"
53+
fi
54+
55+
selector=()
56+
runSelector=()
57+
58+
if [ "$swiftMainSnapshot" == true ]; then
59+
echo "Installing latest main-snapshot toolchain"
60+
selector=("main-snapshot")
61+
runSelector=("+main-snapshot")
62+
elif [ -n "${SWIFT_VERSION}" ]; then
63+
echo "Installing selected swift toolchain from SWIFT_VERSION environment variable"
64+
selector=("${SWIFT_VERSION}")
65+
runSelector=()
66+
elif [ -f .swift-version ]; then
67+
echo "Installing selected swift toolchain from .swift-version file"
68+
selector=()
69+
runSelector=()
70+
else
71+
echo "Installing latest toolchain"
72+
selector=("latest")
73+
runSelector=("+latest")
74+
fi
75+
76+
swiftly install --post-install-file=post-install.sh "${selector[@]}"
77+
78+
if [ -f post-install.sh ]; then
79+
echo "Performing swift toolchain post-installation"
80+
chmod u+x post-install.sh && ./post-install.sh
81+
fi
82+
83+
echo "Displaying swift version"
84+
swiftly run "${runSelector[@]}" swift --version
85+
86+
if [[ "$(uname -s)" == "Linux" ]]; then
87+
CC=clang swiftly run "${runSelector[@]}" "$(dirname "$0")/install-libarchive.sh"
88+
fi

.github/scripts/validate_sample.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ declare -r RESET='\033[0m'
1111
declare -r sampleDir="$1"
1212
declare -r CI_VALIDATE_SCRIPT='ci-validate.sh'
1313

14+
echo "Using Swift: $(which swift)"
15+
1416
echo ""
1517
echo ""
1618
echo "========================================================================"

.github/workflows/pull_request.yml

Lines changed: 97 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,37 @@ jobs:
1515
license_header_check_project_name: Swift.org
1616

1717
test-java:
18-
name: Java tests (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }})
18+
name: Test (Java) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
1919
runs-on: ubuntu-latest
2020
strategy:
2121
fail-fast: true
2222
matrix:
2323
swift_version: ['6.1.2']
2424
os_version: ['jammy']
25-
jdk_vendor: ['Corretto']
25+
jdk_vendor: ['corretto']
2626
container:
2727
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
2828
env:
29-
JAVA_HOME: "/usr/lib/jvm/default-jdk"
29+
SWIFT_JAVA_VERBOSE: true
30+
steps:
31+
- uses: actions/checkout@v4
32+
- name: Prepare CI Environment
33+
uses: ./.github/actions/prepare_env
34+
- name: Gradle :SwiftKit:build
35+
run: ./gradlew build -x test
36+
- name: Gradle :SwiftKit:check
37+
run: ./gradlew :SwiftKit:check --info
38+
39+
test-java-macos:
40+
name: Test (Java) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
41+
runs-on: [self-hosted, macos, sequoia, ARM64]
42+
strategy:
43+
fail-fast: true
44+
matrix:
45+
swift_version: ['6.1.2']
46+
os_version: ['macos']
47+
jdk_vendor: ['corretto']
48+
env:
3049
SWIFT_JAVA_VERBOSE: true
3150
steps:
3251
- uses: actions/checkout@v4
@@ -36,22 +55,59 @@ jobs:
3655
run: ./gradlew build -x test
3756
- name: Gradle :SwiftKit:check
3857
run: ./gradlew :SwiftKit:check --debug
58+
59+
benchmark-java:
60+
name: Benchmark (JMH) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
61+
runs-on: ubuntu-latest
62+
strategy:
63+
fail-fast: true
64+
matrix:
65+
swift_version: ['6.1.2']
66+
os_version: ['jammy']
67+
jdk_vendor: ['corretto']
68+
container:
69+
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
70+
env:
71+
SWIFT_JAVA_VERBOSE: true
72+
steps:
73+
- uses: actions/checkout@v4
74+
- name: Prepare CI Environment
75+
uses: ./.github/actions/prepare_env
3976
- name: Gradle compile JMH benchmarks
4077
run: ./gradlew compileJmh --info
4178

4279
test-swift:
43-
name: Swift tests (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }})
80+
name: Test (Swift) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
4481
runs-on: ubuntu-latest
4582
strategy:
4683
fail-fast: false
4784
matrix:
4885
swift_version: ['6.1.2']
4986
os_version: ['jammy']
50-
jdk_vendor: ['Corretto']
87+
jdk_vendor: ['corretto']
5188
container:
5289
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
5390
env:
54-
JAVA_HOME: "/usr/lib/jvm/default-jdk"
91+
SWIFT_JAVA_VERBOSE: true
92+
steps:
93+
- uses: actions/checkout@v4
94+
- name: Prepare CI Environment
95+
uses: ./.github/actions/prepare_env
96+
- name: Swift Build
97+
run: "swift build --build-tests --disable-sandbox"
98+
- name: Swift Test
99+
run: "swift test"
100+
101+
test-swift-macos:
102+
name: Test (Swift) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
103+
runs-on: [self-hosted, macos, sequoia, ARM64]
104+
strategy:
105+
fail-fast: false
106+
matrix:
107+
swift_version: ['6.1.2']
108+
os_version: ['macos']
109+
jdk_vendor: ['corretto']
110+
env:
55111
SWIFT_JAVA_VERBOSE: true
56112
steps:
57113
- uses: actions/checkout@v4
@@ -63,30 +119,58 @@ jobs:
63119
run: "swift test"
64120

65121
verify-samples:
66-
name: Verify Sample ${{ matrix.sample_app }} (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }})
122+
name: Sample ${{ matrix.sample_app }} (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
67123
runs-on: ubuntu-latest
68124
strategy:
69125
fail-fast: false
70126
matrix:
71127
swift_version: ['6.1.2']
72128
os_version: ['jammy']
73-
jdk_vendor: ['Corretto']
74-
sample_app: [
129+
jdk_vendor: ['corretto']
130+
sample_app: [ # TODO: use a reusable-workflow to generate those names
75131
'JavaDependencySampleApp',
76132
'JavaKitSampleApp',
77133
'JavaProbablyPrime',
78134
'JavaSieve',
79135
'SwiftAndJavaJarSampleLib',
80136
'SwiftKitSampleApp',
81-
'JExtractJNISampleApp'
137+
'JExtractJNISampleApp',
82138
]
83139
container:
84140
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
85-
env:
86-
JAVA_HOME: "/usr/lib/jvm/default-jdk"
87141
steps:
88142
- uses: actions/checkout@v4
89143
- name: Prepare CI Environment
90144
uses: ./.github/actions/prepare_env
91-
- name: "Verify sample"
145+
- name: "Verify sample: ${{ matrix.sample_app }}"
146+
run: .github/scripts/validate_sample.sh Samples/${{ matrix.sample_app }}
147+
148+
149+
verify-samples-macos:
150+
name: Sample ${{ matrix.sample_app }} (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}})
151+
runs-on: [self-hosted, macos, sequoia, ARM64]
152+
strategy:
153+
fail-fast: false
154+
matrix:
155+
swift_version: ['6.1.2']
156+
os_version: ['macos']
157+
jdk_vendor: ['corretto']
158+
sample_app: [ # TODO: use a reusable-workflow to generate those names
159+
'JavaDependencySampleApp',
160+
'JavaKitSampleApp',
161+
'JavaProbablyPrime',
162+
'JavaSieve',
163+
'SwiftAndJavaJarSampleLib',
164+
'SwiftKitSampleApp',
165+
'JExtractJNISampleApp',
166+
]
167+
steps:
168+
- uses: actions/checkout@v4
169+
- name: Prepare CI Environment
170+
uses: ./.github/actions/prepare_env
171+
- name: Install Swiftly # we specifically install Swiftly in macOS jobs because we want a simpler way to find the right dylib paths for libraries
172+
run: ./.github/scripts/install_swiftly.sh
173+
env:
174+
SWIFT_VERSION: "${{ matrix.swift_version }}"
175+
- name: "Verify sample ${{ matrix.sample_app }}"
92176
run: .github/scripts/validate_sample.sh Samples/${{ matrix.sample_app }}

.licenseignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ Makefile
3535
**/CMakeLists.txt
3636
**/*.jar
3737
**/generated/*.java
38+
gradle.properties
39+
**/gradle.properties
3840
**/generated/*.swift
3941
gradle/wrapper/gradle-wrapper.properties
4042
gradlew
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../gradle.properties

Samples/JavaDependencySampleApp/Package.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ let package = Package(
4444
name: "JavaDependencySampleApp",
4545
platforms: [
4646
.macOS(.v15),
47+
.iOS(.v18),
48+
.watchOS(.v11),
49+
.tvOS(.v18),
4750
],
4851

4952
products: [
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../gradle.properties

Samples/JavaKitSampleApp/Package.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,10 @@ let javaIncludePath = "\(javaHome)/include"
4343
let package = Package(
4444
name: "JavaKitSampleApp",
4545
platforms: [
46-
.macOS(.v13),
47-
.iOS(.v13),
48-
.tvOS(.v13),
49-
.watchOS(.v6),
50-
.macCatalyst(.v13),
46+
.macOS(.v15),
47+
.iOS(.v18),
48+
.watchOS(.v11),
49+
.tvOS(.v18),
5150
],
5251

5352
products: [
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../gradle.properties

0 commit comments

Comments
 (0)