Skip to content

Commit 5bd2a99

Browse files
authored
Add automated Rust toolchain upgrade workflow
Runs daily to check for new Rust nightly versions and creates a PR if one is available with all required components.
1 parent 20052f8 commit 5bd2a99

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
# Check if rust-toolchain.toml exists
5+
if [ ! -f "rust-toolchain.toml" ]; then
6+
echo "::error::rust-toolchain.toml not found"
7+
exit 1
8+
fi
9+
10+
# Read current channel from rust-toolchain.toml
11+
CURRENT_CHANNEL=$(grep '^channel = ' rust-toolchain.toml | head -1 | sed 's/channel = "\(.*\)"/\1/')
12+
CURRENT_DATE=$(echo "$CURRENT_CHANNEL" | sed 's/nightly-//')
13+
14+
echo "Current toolchain: $CURRENT_CHANNEL"
15+
16+
# Fetch latest nightly manifest
17+
MANIFEST_TOML_URL="https://static.rust-lang.org/dist/channel-rust-nightly.toml"
18+
MANIFEST_CONTENT=$(curl -sf "$MANIFEST_TOML_URL") || {
19+
echo "::error::Failed to fetch manifest from $MANIFEST_TOML_URL"
20+
exit 1
21+
}
22+
23+
LATEST_DATE=$(echo "$MANIFEST_CONTENT" | grep '^date = ' | head -1 | sed 's/date = "\(.*\)"/\1/')
24+
25+
if [ -z "$LATEST_DATE" ]; then
26+
echo "::error::Could not extract date from manifest"
27+
exit 1
28+
fi
29+
30+
echo "Latest nightly date: $LATEST_DATE"
31+
32+
# Convert dates to comparable format (remove dashes for numeric comparison)
33+
CURRENT_DATE_NUM=$(echo "$CURRENT_DATE" | tr -d '-')
34+
LATEST_DATE_NUM=$(echo "$LATEST_DATE" | tr -d '-')
35+
36+
# Compare dates numerically
37+
if [ "$LATEST_DATE_NUM" -gt "$CURRENT_DATE_NUM" ]; then
38+
echo "::notice::New nightly available: $LATEST_DATE (current: $CURRENT_DATE)"
39+
40+
# Get commit hash from the already fetched manifest
41+
COMMIT_HASH=$(echo "$MANIFEST_CONTENT" | grep -A 50 '\[pkg.rust\]' | grep 'git-commit-hash = ' | head -1 | sed 's/git-commit-hash = "\(.*\)"/\1/')
42+
43+
if [ -z "$COMMIT_HASH" ]; then
44+
echo "::error::Could not extract commit hash from manifest"
45+
exit 1
46+
fi
47+
48+
echo "New commit hash: $COMMIT_HASH"
49+
50+
# Write outputs for GitHub Actions
51+
echo "SHOULD_UPGRADE=true" >> "${GITHUB_OUTPUT:-/dev/stdout}"
52+
echo "NEW_DATE=$LATEST_DATE" >> "${GITHUB_OUTPUT:-/dev/stdout}"
53+
echo "NEW_COMMIT_HASH=$COMMIT_HASH" >> "${GITHUB_OUTPUT:-/dev/stdout}"
54+
else
55+
echo "::notice::No newer nightly available (current: $CURRENT_DATE, latest: $LATEST_DATE)"
56+
echo "SHOULD_UPGRADE=false" >> "${GITHUB_OUTPUT:-/dev/stdout}"
57+
fi
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
name: Rust Toolchain Upgrade
2+
3+
on:
4+
schedule:
5+
# Run every day at 2 AM UTC
6+
- cron: '0 2 * * *'
7+
workflow_dispatch: # Allow manual triggering
8+
9+
permissions:
10+
contents: write
11+
pull-requests: write
12+
13+
jobs:
14+
check-and-upgrade:
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Checkout repository
18+
uses: actions/checkout@v4
19+
20+
- name: Check for new nightly
21+
id: check-nightly
22+
run: .github/check-rust-toolchain-upgrade.sh
23+
24+
- name: Update toolchain files
25+
if: steps.check-nightly.outputs.SHOULD_UPGRADE == 'true'
26+
run: |
27+
NEW_DATE="${{ steps.check-nightly.outputs.NEW_DATE }}"
28+
NEW_COMMIT_HASH="${{ steps.check-nightly.outputs.NEW_COMMIT_HASH }}"
29+
30+
# Update rust-toolchain.toml
31+
sed -i "s/^channel = \"nightly-[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\"/channel = \"nightly-${NEW_DATE}\"/" rust-toolchain.toml
32+
sed -i "s/^# commit_hash = [a-f0-9]\+/# commit_hash = ${NEW_COMMIT_HASH}/" rust-toolchain.toml
33+
34+
# Update REQUIRED_RUST_TOOLCHAIN in build.rs
35+
sed -i "s/^channel = \"nightly-[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\"/channel = \"nightly-${NEW_DATE}\"/" crates/rustc_codegen_spirv/build.rs
36+
sed -i "s/^# commit_hash = [a-f0-9]\+/# commit_hash = ${NEW_COMMIT_HASH}/" crates/rustc_codegen_spirv/build.rs
37+
38+
- name: Build project
39+
if: steps.check-nightly.outputs.SHOULD_UPGRADE == 'true'
40+
run: |
41+
# The updated rust-toolchain.toml will cause cargo to download the required toolchain
42+
cargo build
43+
44+
- name: Run tests
45+
if: steps.check-nightly.outputs.SHOULD_UPGRADE == 'true'
46+
run: |
47+
cargo compiletest
48+
49+
- name: Create Pull Request
50+
if: steps.check-nightly.outputs.SHOULD_UPGRADE == 'true'
51+
uses: peter-evans/create-pull-request@v6
52+
with:
53+
token: ${{ secrets.GITHUB_TOKEN }}
54+
commit-message: |
55+
Upgrade Rust toolchain to nightly-${{ steps.check-nightly.outputs.NEW_DATE }}
56+
57+
Updates:
58+
- rust-toolchain.toml: nightly-${{ steps.check-nightly.outputs.NEW_DATE }}
59+
- commit hash: ${{ steps.check-nightly.outputs.NEW_COMMIT_HASH }}
60+
- REQUIRED_RUST_TOOLCHAIN in build.rs
61+
branch: rust-toolchain-upgrade
62+
delete-branch: true
63+
title: "Upgrade Rust toolchain to nightly-${{ steps.check-nightly.outputs.NEW_DATE }}"
64+
body: |
65+
This PR upgrades the Rust toolchain to the latest available nightly version.
66+
67+
## Changes
68+
- Updated `rust-toolchain.toml` to use `nightly-${{ steps.check-nightly.outputs.NEW_DATE }}`
69+
- Updated commit hash to `${{ steps.check-nightly.outputs.NEW_COMMIT_HASH }}`
70+
- Updated `REQUIRED_RUST_TOOLCHAIN` in `crates/rustc_codegen_spirv/build.rs`
71+
72+
## Verification
73+
- All required components are available
74+
- Project builds successfully
75+
- Tests pass
76+
77+
This PR was automatically generated by the [Rust toolchain upgrade workflow](https://github.com/Rust-GPU/rust-gpu/blob/main/.github/workflows/rust-toolchain-upgrade.yml).

0 commit comments

Comments
 (0)