Skip to content

Commit c116ccd

Browse files
CI: Add GitHub Action to archive PR toolchains
1 parent db6d9d9 commit c116ccd

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
name: Archive PR Toolchain
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
pr-url:
7+
required: true
8+
type: string
9+
description: "swiftlang/swift PR URL (e.g. https://github.com/swiftlang/swift/pull/86624)"
10+
11+
permissions:
12+
contents: write
13+
14+
jobs:
15+
archive:
16+
runs-on: ubuntu-latest
17+
env:
18+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19+
steps:
20+
- name: Resolve PR number and Jenkins builds
21+
run: |
22+
set -euo pipefail
23+
24+
pr_url="${{ inputs.pr-url }}"
25+
if [[ "$pr_url" =~ ^https://github.com/swiftlang/swift/pull/([0-9]+)(/.*)?$ ]]; then
26+
pr_number="${BASH_REMATCH[1]}"
27+
else
28+
echo "Input must be a swiftlang/swift PR URL, got: $pr_url" >&2
29+
exit 1
30+
fi
31+
32+
pr_payload="$(gh api "/repos/swiftlang/swift/pulls/${pr_number}")"
33+
statuses_url="$(echo "$pr_payload" | jq -r '._links.statuses.href')"
34+
merge_commit_sha="$(echo "$pr_payload" | jq -r '.merge_commit_sha')"
35+
gh api "${statuses_url}?per_page=100" > /tmp/statuses.json
36+
37+
macos_url="$(jq -r '.[] | select(.target_url != null) | .target_url | select(test("ci\\.swift\\.org/.*/swift-PR-toolchain-[Mm]acos"))' /tmp/statuses.json | head -n1)"
38+
linux_url="$(jq -r '.[] | select(.target_url != null) | .target_url | select(test("ci\\.swift\\.org/.*/swift-PR-toolchain-Linux"))' /tmp/statuses.json | head -n1)"
39+
40+
if [[ -z "$macos_url" ]]; then
41+
echo "No Jenkins macOS PR toolchain status found for PR #${pr_number}" >&2
42+
jq -r '.[].target_url // empty' /tmp/statuses.json >&2
43+
exit 1
44+
fi
45+
if [[ -z "$linux_url" ]]; then
46+
echo "No Jenkins Linux PR toolchain status found for PR #${pr_number}" >&2
47+
jq -r '.[].target_url // empty' /tmp/statuses.json >&2
48+
exit 1
49+
fi
50+
51+
macos_build="$(echo "$macos_url" | sed -n 's#.*/swift-PR-toolchain-[^/]*/\([0-9]\+\)/.*#\1#p')"
52+
linux_build="$(echo "$linux_url" | sed -n 's#.*/swift-PR-toolchain-[^/]*/\([0-9]\+\)/.*#\1#p')"
53+
if [[ -z "$macos_build" ]]; then
54+
echo "Failed to extract macOS Jenkins build number from ${macos_url}" >&2
55+
exit 1
56+
fi
57+
if [[ -z "$linux_build" ]]; then
58+
echo "Failed to extract Linux Jenkins build number from ${linux_url}" >&2
59+
exit 1
60+
fi
61+
62+
{
63+
echo "PR_NUMBER=${pr_number}"
64+
echo "JENKINS_BUILD_MACOS=${macos_build}"
65+
echo "JENKINS_BUILD_LINUX=${linux_build}"
66+
echo "STATUSES_URL=${statuses_url}"
67+
echo "MERGE_COMMIT_SHA=${merge_commit_sha}"
68+
} >> "$GITHUB_ENV"
69+
70+
- name: Download toolchain artifacts
71+
run: |
72+
set -euo pipefail
73+
mkdir -p artifacts/downloads
74+
75+
macos_url="https://download.swift.org/tmp/pull-request/${PR_NUMBER}/${JENKINS_BUILD_MACOS}/xcode/swift-PR-${PR_NUMBER}-${JENKINS_BUILD_MACOS}-osx.tar.gz"
76+
ubuntu_url="https://download.swift.org/tmp/pull-request/${PR_NUMBER}/${JENKINS_BUILD_LINUX}/ubuntu2204/PR-ubuntu2204.tar.gz"
77+
78+
echo "Fetching macOS toolchain from ${macos_url}"
79+
curl -fL --retry 5 --retry-delay 10 "$macos_url" -o artifacts/downloads/macos.tar.gz
80+
81+
echo "Fetching Ubuntu toolchain from ${ubuntu_url}"
82+
curl -fL --retry 5 --retry-delay 10 "$ubuntu_url" -o artifacts/downloads/ubuntu2204.tar.gz
83+
84+
- name: Repackage macOS toolchain
85+
run: |
86+
set -euo pipefail
87+
workdir="$(mktemp -d)"
88+
trap 'rm -rf "$workdir"' EXIT
89+
90+
tar -xf artifacts/downloads/macos.tar.gz -C "$workdir"
91+
toolchain_dir="$workdir/Library/Developer/Toolchains/swift-PR-${PR_NUMBER}-${JENKINS_BUILD_MACOS}.xctoolchain"
92+
if [[ ! -d "$toolchain_dir" ]]; then
93+
echo "Expected toolchain not found at ${toolchain_dir}" >&2
94+
echo "Available entries:" >&2
95+
find "$workdir" -maxdepth 3 -type d >&2
96+
exit 1
97+
fi
98+
99+
mkdir -p artifacts
100+
tar -czf "artifacts/swift-PR-${PR_NUMBER}-${JENKINS_BUILD_MACOS}-osx.tar.gz" -C "$(dirname "$toolchain_dir")" "$(basename "$toolchain_dir")"
101+
102+
- name: Repackage Ubuntu toolchain
103+
run: |
104+
set -euo pipefail
105+
workdir="$(mktemp -d)"
106+
trap 'rm -rf "$workdir"' EXIT
107+
108+
extracted="$workdir/extracted"
109+
tagged="$workdir/tagged"
110+
mkdir -p "$extracted" "$tagged"
111+
112+
tar -xf artifacts/downloads/ubuntu2204.tar.gz -C "$extracted"
113+
tag="swift-PR-${PR_NUMBER}-${JENKINS_BUILD_LINUX}"
114+
115+
# Mimic repackage-pr-toolchain.rb: move all extracted entries under the tag name before archiving.
116+
mkdir -p "$tagged/$tag"
117+
shopt -s dotglob
118+
for entry in "$extracted"/*; do
119+
mv "$entry" "$tagged/$tag/"
120+
done
121+
122+
tar -czf "artifacts/${tag}-ubuntu2204.tar.gz" -C "$tagged" "$tag"
123+
124+
- name: Publish release assets to swiftwasm/swift
125+
run: |
126+
set -euo pipefail
127+
128+
release_tag="swift-pr-${PR_NUMBER}-${MERGE_COMMIT_SHA}"
129+
release_title="Swift PR #${PR_NUMBER} merge ${MERGE_COMMIT_SHA}"
130+
release_notes=$(cat <<'EOF'
131+
Archived toolchain from swiftlang/swift Jenkins PR build.
132+
EOF
133+
)
134+
135+
if ! gh release view "$release_tag" --repo swiftwasm/swift >/dev/null 2>&1; then
136+
gh release create "$release_tag" \
137+
--target "$MERGE_COMMIT_SHA" \
138+
--repo swiftwasm/swift \
139+
--title "$release_title" \
140+
--notes "$release_notes"
141+
fi
142+
143+
gh release upload "$release_tag" \
144+
artifacts/swift-PR-${PR_NUMBER}-${JENKINS_BUILD_MACOS}-osx.tar.gz \
145+
artifacts/swift-PR-${PR_NUMBER}-${JENKINS_BUILD_LINUX}-ubuntu2204.tar.gz \
146+
--repo swiftwasm/swift \
147+
--clobber
148+
149+
- name: Summarize
150+
run: |
151+
{
152+
echo "Archived Swift PR #${PR_NUMBER} on merge commit ${MERGE_COMMIT_SHA} (Jenkins builds: macOS ${JENKINS_BUILD_MACOS}, Linux ${JENKINS_BUILD_LINUX})."
153+
echo ""
154+
echo "Artifacts:"
155+
echo "- swift-PR-${PR_NUMBER}-${JENKINS_BUILD_MACOS}-osx.tar.gz"
156+
echo "- swift-PR-${PR_NUMBER}-${JENKINS_BUILD_LINUX}-ubuntu2204.tar.gz"
157+
echo ""
158+
echo "Release tag: swift-pr-${PR_NUMBER}-${MERGE_COMMIT_SHA}"
159+
echo "Statuses source: ${STATUSES_URL}"
160+
} >> "$GITHUB_STEP_SUMMARY"

0 commit comments

Comments
 (0)