Skip to content

Commit c68f919

Browse files
committed
build: publish iOS simulator runner release assets
1 parent f0eb8c6 commit c68f919

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
name: Release iOS Runner
2+
3+
on:
4+
release:
5+
types:
6+
- published
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
publish-ios-simulator-runner:
13+
name: Publish iOS Simulator Runner
14+
runs-on: macos-26
15+
timeout-minutes: 90
16+
env:
17+
AGENT_DEVICE_XCUITEST_PLATFORM: ios
18+
AGENT_DEVICE_XCUITEST_DESTINATION: generic/platform=iOS Simulator
19+
AGENT_DEVICE_IOS_CLEAN_DERIVED: "1"
20+
AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH: ${{ runner.temp }}/ios-runner-derived
21+
RELEASE_ASSET_DIR: ${{ runner.temp }}/release-assets
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
25+
26+
- name: Setup Node.js
27+
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
28+
with:
29+
node-version: "22"
30+
31+
- name: Resolve release metadata
32+
id: meta
33+
run: |
34+
set -euo pipefail
35+
PACKAGE_VERSION="$(node -p "JSON.parse(require('node:fs').readFileSync('package.json', 'utf8')).version")"
36+
TAG_NAME="${{ github.event.release.tag_name }}"
37+
VERSION="${TAG_NAME#v}"
38+
if [ "$VERSION" != "$PACKAGE_VERSION" ]; then
39+
echo "Release tag $TAG_NAME does not match package.json version $PACKAGE_VERSION" >&2
40+
exit 1
41+
fi
42+
echo "tag=$TAG_NAME" >> "$GITHUB_OUTPUT"
43+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
44+
shell: bash
45+
46+
- name: Build iOS simulator runner
47+
run: sh ./scripts/build-xcuitest-apple.sh
48+
shell: bash
49+
50+
- name: Package iOS simulator runner
51+
id: package
52+
run: |
53+
set -euo pipefail
54+
mkdir -p "${RELEASE_ASSET_DIR}"
55+
sh ./scripts/package-ios-simulator-runner.sh \
56+
"${{ steps.meta.outputs.version }}" \
57+
"${{ steps.meta.outputs.tag }}" \
58+
"${RELEASE_ASSET_DIR}"
59+
shell: bash
60+
61+
- name: Upload runner assets to GitHub Release
62+
env:
63+
GH_TOKEN: ${{ github.token }}
64+
run: |
65+
set -euo pipefail
66+
gh release upload "${{ steps.meta.outputs.tag }}" \
67+
"${{ steps.package.outputs.archive_path }}" \
68+
"${{ steps.package.outputs.checksum_path }}" \
69+
"${{ steps.package.outputs.manifest_path }}" \
70+
--clobber
71+
shell: bash
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#!/bin/sh
2+
set -eu
3+
4+
if [ "$#" -ne 3 ]; then
5+
echo "Usage: $0 <version> <release-tag> <output-dir>" >&2
6+
exit 1
7+
fi
8+
9+
VERSION="$1"
10+
RELEASE_TAG="$2"
11+
OUTPUT_DIR="$3"
12+
13+
DERIVED_PATH="${AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH:-$HOME/.agent-device/ios-runner/derived}"
14+
PRODUCTS_DIR="$DERIVED_PATH/Build/Products"
15+
EXPECTED_RUNNER_BUNDLE_ID="${AGENT_DEVICE_IOS_RUNNER_RELEASE_BUNDLE_ID:-com.callstack.agentdevice.runner.uitests.xctrunner}"
16+
ARCHIVE_BASENAME="agent-device-ios-runner-$VERSION.app.zip"
17+
CHECKSUM_BASENAME="$ARCHIVE_BASENAME.sha256"
18+
MANIFEST_BASENAME="agent-device-ios-runner-$VERSION.manifest.json"
19+
GITHUB_SERVER="${GITHUB_SERVER_URL:-https://github.com}"
20+
REPOSITORY="${GITHUB_REPOSITORY:-}"
21+
22+
if [ ! -d "$PRODUCTS_DIR" ]; then
23+
echo "Runner build products not found at $PRODUCTS_DIR" >&2
24+
exit 1
25+
fi
26+
27+
read_plist_value() {
28+
plist_path="$1"
29+
key="$2"
30+
/usr/libexec/PlistBuddy -c "Print :$key" "$plist_path" 2>/dev/null || true
31+
}
32+
33+
write_github_output() {
34+
if [ -n "${GITHUB_OUTPUT:-}" ]; then
35+
printf '%s\n' "$1" >> "$GITHUB_OUTPUT"
36+
fi
37+
}
38+
39+
resolve_runner_app_path() {
40+
find "$PRODUCTS_DIR" -type d -name '*.app' | sort | while IFS= read -r app_path; do
41+
bundle_id="$(read_plist_value "$app_path/Info.plist" CFBundleIdentifier)"
42+
if [ "$bundle_id" = "$EXPECTED_RUNNER_BUNDLE_ID" ]; then
43+
printf '%s\n' "$app_path"
44+
exit 0
45+
fi
46+
done
47+
}
48+
49+
RUNNER_APP_PATH="$(resolve_runner_app_path)"
50+
if [ -z "$RUNNER_APP_PATH" ]; then
51+
echo "Unable to locate simulator runner app with bundle id $EXPECTED_RUNNER_BUNDLE_ID under $PRODUCTS_DIR" >&2
52+
exit 1
53+
fi
54+
55+
mkdir -p "$OUTPUT_DIR"
56+
57+
STAGE_DIR="$(mktemp -d "${TMPDIR:-/tmp}/agent-device-ios-runner.XXXXXX")"
58+
cleanup() {
59+
rm -rf "$STAGE_DIR"
60+
}
61+
trap cleanup EXIT INT TERM
62+
63+
STAGED_APP_PATH="$STAGE_DIR/agent-device-ios-runner-$VERSION.app"
64+
ARCHIVE_PATH="$OUTPUT_DIR/$ARCHIVE_BASENAME"
65+
CHECKSUM_PATH="$OUTPUT_DIR/$CHECKSUM_BASENAME"
66+
MANIFEST_PATH="$OUTPUT_DIR/$MANIFEST_BASENAME"
67+
RUNNER_BUNDLE_ID="$(read_plist_value "$RUNNER_APP_PATH/Info.plist" CFBundleIdentifier)"
68+
APP_NAME="$(read_plist_value "$RUNNER_APP_PATH/Info.plist" CFBundleName)"
69+
if [ -z "$APP_NAME" ]; then
70+
APP_NAME="$(basename "$RUNNER_APP_PATH" .app)"
71+
fi
72+
73+
ditto "$RUNNER_APP_PATH" "$STAGED_APP_PATH"
74+
rm -f "$ARCHIVE_PATH"
75+
(
76+
cd "$STAGE_DIR"
77+
COPYFILE_DISABLE=1 zip -qry "$ARCHIVE_PATH" "$(basename "$STAGED_APP_PATH")"
78+
)
79+
80+
SHA256="$(shasum -a 256 "$ARCHIVE_PATH" | awk '{print $1}')"
81+
printf '%s %s\n' "$SHA256" "$ARCHIVE_BASENAME" > "$CHECKSUM_PATH"
82+
83+
if [ -n "$REPOSITORY" ]; then
84+
ARCHIVE_URL="$GITHUB_SERVER/$REPOSITORY/releases/download/$RELEASE_TAG/$ARCHIVE_BASENAME"
85+
else
86+
ARCHIVE_URL=""
87+
fi
88+
89+
{
90+
printf '{\n'
91+
printf ' "version": "%s",\n' "$VERSION"
92+
printf ' "release_tag": "%s",\n' "$RELEASE_TAG"
93+
printf ' "asset_name": "%s",\n' "$ARCHIVE_BASENAME"
94+
if [ -n "$ARCHIVE_URL" ]; then
95+
printf ' "asset_url": "%s",\n' "$ARCHIVE_URL"
96+
else
97+
printf ' "asset_url": null,\n'
98+
fi
99+
printf ' "sha256": "%s",\n' "$SHA256"
100+
printf ' "checksum_name": "%s",\n' "$CHECKSUM_BASENAME"
101+
printf ' "bundle_id": "%s",\n' "$RUNNER_BUNDLE_ID"
102+
printf ' "bundle_name": "%s",\n' "$APP_NAME"
103+
printf ' "platform_target": "iphonesimulator",\n'
104+
printf ' "archive_format": "zip"\n'
105+
printf '}\n'
106+
} > "$MANIFEST_PATH"
107+
108+
write_github_output "runner_app_path=$RUNNER_APP_PATH"
109+
write_github_output "archive_path=$ARCHIVE_PATH"
110+
write_github_output "checksum_path=$CHECKSUM_PATH"
111+
write_github_output "manifest_path=$MANIFEST_PATH"
112+
write_github_output "archive_name=$ARCHIVE_BASENAME"
113+
write_github_output "sha256=$SHA256"
114+
write_github_output "bundle_id=$RUNNER_BUNDLE_ID"
115+
116+
printf 'archive=%s\n' "$ARCHIVE_PATH"
117+
printf 'checksum=%s\n' "$CHECKSUM_PATH"
118+
printf 'manifest=%s\n' "$MANIFEST_PATH"

0 commit comments

Comments
 (0)