Skip to content

Commit 3fff1f1

Browse files
committed
Adjust the weekly dependency update job to create separate PRs
Previously there was only one main workspace; within the past few months, it was split into three (root, library, and rustbook). These workspaces have somewhat different requirements for what can be updated and what may be problematic, and making one large PR for everything doesn't suit this well. Change the jobs to create separate pull requests for each relevant update. This will also make it easier to create a distinct job for bootstrap.
1 parent 55b7f8e commit 3fff1f1

File tree

2 files changed

+300
-76
lines changed

2 files changed

+300
-76
lines changed

.github/workflows/dependencies.yml

+53-76
Original file line numberDiff line numberDiff line change
@@ -16,84 +16,66 @@ defaults:
1616
env:
1717
# So cargo doesn't complain about unstable features
1818
RUSTC_BOOTSTRAP: 1
19-
PR_TITLE: Weekly `cargo update`
20-
PR_MESSAGE: |
21-
Automation to keep dependencies in `Cargo.lock` current.
22-
23-
The following is the output from `cargo update`:
24-
COMMIT_MESSAGE: "cargo update \n\n"
2519

2620
jobs:
27-
not-waiting-on-bors:
28-
if: github.repository_owner == 'rust-lang'
29-
name: skip if S-waiting-on-bors
30-
runs-on: ubuntu-latest
31-
steps:
32-
- env:
33-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
34-
run: |
35-
# Fetch state and labels of PR
36-
# Or exit successfully if PR does not exist
37-
JSON=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json labels,state || exit 0)
38-
STATE=$(echo "$JSON" | jq -r '.state')
39-
WAITING_ON_BORS=$(echo "$JSON" | jq '.labels[] | any(.name == "S-waiting-on-bors"; .)')
40-
41-
# Exit with error if open and S-waiting-on-bors
42-
if [[ "$STATE" == "OPEN" && "$WAITING_ON_BORS" == "true" ]]; then
43-
exit 1
44-
fi
45-
4621
update:
4722
if: github.repository_owner == 'rust-lang'
4823
name: update dependencies
49-
needs: not-waiting-on-bors
5024
runs-on: ubuntu-latest
25+
outputs:
26+
lockfile_names: ${{ steps.update_script.outputs.lockfile_names }}
27+
skip_keys: ${{ steps.check_status.outputs.skip_keys }}
5128
steps:
5229
- name: checkout the source code
5330
uses: actions/checkout@v4
5431
with:
5532
submodules: recursive
33+
5634
- name: install the bootstrap toolchain
5735
run: |
5836
# Extract the stage0 version
59-
TOOLCHAIN=$(awk -F= '{a[$1]=$2} END {print(a["compiler_version"] "-" a["compiler_date"])}' src/stage0)
37+
toolchain=$(awk -F= '{a[$1]=$2} END {print(a["compiler_version"] "-" a["compiler_date"])}' src/stage0)
6038
# Install and set as default
61-
rustup toolchain install --no-self-update --profile minimal $TOOLCHAIN
62-
rustup default $TOOLCHAIN
39+
rustup toolchain install --no-self-update --profile minimal "$toolchain"
40+
rustup default "$toolchain"
6341
64-
- name: cargo update compiler & tools
65-
# Remove first line that always just says "Updating crates.io index"
66-
run: |
67-
echo -e "\ncompiler & tools dependencies:" >> cargo_update.log
68-
cargo update 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
69-
- name: cargo update library
70-
run: |
71-
echo -e "\nlibrary dependencies:" >> cargo_update.log
72-
cargo update --manifest-path library/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
73-
- name: cargo update rustbook
42+
- name: run update script
43+
id: update_script
7444
run: |
75-
echo -e "\nrustbook dependencies:" >> cargo_update.log
76-
cargo update --manifest-path src/tools/rustbook/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
77-
- name: upload Cargo.lock artifact for use in PR
78-
uses: actions/upload-artifact@v4
79-
with:
80-
name: Cargo-lock
81-
path: |
82-
Cargo.lock
83-
library/Cargo.lock
84-
src/tools/rustbook/Cargo.lock
85-
retention-days: 1
86-
- name: upload cargo-update log artifact for use in PR
45+
# Update all lockfiles
46+
./src/ci/scripts/update-all-lockfiles.py --run-update
47+
# Make a list of which lockfiles were updated for future use
48+
lockfile_names="$(./src/ci/scripts/update-all-lockfiles.py --print-names)"
49+
echo "lockfile_names=$lockfile_names" >> "$GITHUB_OUTPUT"
50+
51+
- name: upload output file
8752
uses: actions/upload-artifact@v4
8853
with:
89-
name: cargo-updates
90-
path: cargo_update.log
54+
name: update-output
55+
path: update_output.json
9156
retention-days: 1
9257

58+
- name: check for S-waiting-on-bors
59+
id: check_status
60+
env:
61+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
62+
run: |
63+
# Build a json array of items to skip
64+
skip_keys="$(./src/ci/scripts/update-all-lockfiles.py --list-skip-branches)"
65+
echo "skip_keys=$skip_keys" >> "$GITHUB_OUTPUT"
66+
9367
pr:
94-
if: github.repository_owner == 'rust-lang'
95-
name: amend PR
96-
needs: update
68+
name: create or update PR
69+
needs: [update]
70+
strategy:
71+
fail-fast: false
72+
matrix:
73+
name: ${{ fromJson(needs.update.outputs.lockfile_names) }}
74+
# Don't run the job for a branch if we don't need to make a PR (because there is
75+
# already one in the queue).
76+
if: >
77+
github.repository_owner == 'rust-lang' &&
78+
!contains(fromJSON(needs.update.outputs.skip_keys), matrix.name)
9779
runs-on: ubuntu-latest
9880
permissions:
9981
contents: write
@@ -102,35 +84,30 @@ jobs:
10284
- name: checkout the source code
10385
uses: actions/checkout@v4
10486

105-
- name: download Cargo.lock from update job
87+
- name: download output file from update job
10688
uses: actions/download-artifact@v4
10789
with:
108-
name: Cargo-lock
109-
- name: download cargo-update log from update job
110-
uses: actions/download-artifact@v4
111-
with:
112-
name: cargo-updates
90+
name: update-output
11391

11492
- name: craft PR body and commit message
11593
run: |
116-
echo "${COMMIT_MESSAGE}" > commit.txt
117-
cat cargo_update.log >> commit.txt
118-
119-
echo "${PR_MESSAGE}" > body.md
120-
echo '```txt' >> body.md
121-
cat cargo_update.log >> body.md
122-
echo '```' >> body.md
94+
./src/ci/scripts/update-all-lockfiles.py --prepare-pr-files "${{ matrix.name }}"
95+
# Set some environment variables for later use from the JSON file
96+
echo "BRANCH=$(jq -r '.${{ matrix.name }}.branch' update_output.json)" >> "$GITHUB_OUTPUT"
97+
echo "PR_TITLE=$(jq -r '.${{ matrix.name }}.pr_title' update_output.json)" >> "$GITHUB_OUTPUT"
12398
12499
- name: commit
125100
run: |
126101
git config user.name github-actions
127102
git config user.email [email protected]
128-
git switch --force-create cargo_update
129-
git add ./Cargo.lock ./library/Cargo.lock ./src/tools/rustbook/Cargo.lock
103+
git switch --force-create "$BRANCH"
104+
# Add only the relevant lockfile
105+
./src/ci/scripts/update-all-lockfiles.py --restore-lockfile "${{ matrix.name }}"
106+
git add "$(jq -r '.${{ matrix.name }}.lockfile_path' update_output.json)"
130107
git commit --no-verify --file=commit.txt
131108
132109
- name: push
133-
run: git push --no-verify --force --set-upstream origin cargo_update
110+
run: git push --no-verify --force --set-upstream origin "$BRANCH"
134111

135112
- name: edit existing open pull request
136113
id: edit
@@ -140,16 +117,16 @@ jobs:
140117
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
141118
run: |
142119
# Exit with error if PR is closed
143-
STATE=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json state --jq '.state')
144-
if [[ "$STATE" != "OPEN" ]]; then
120+
state=$(gh pr view "$BRANCH" --repo "$GITHUB_REPOSITORY" --json state --jq '.state')
121+
if [[ "$state" != "OPEN" ]]; then
145122
exit 1
146123
fi
147124
148-
gh pr edit cargo_update --title "${PR_TITLE}" --body-file body.md --repo $GITHUB_REPOSITORY
125+
gh pr edit "$BRANCH" --title "$PR_TITLE" --body-file pr_body.md --repo "$GITHUB_REPOSITORY"
149126
150127
- name: open new pull request
151128
# Only run if there wasn't an existing PR
152129
if: steps.edit.outcome != 'success'
153130
env:
154131
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
155-
run: gh pr create --title "${PR_TITLE}" --body-file body.md --repo $GITHUB_REPOSITORY
132+
run: gh pr create --title "$PR_TITLE" --body-file pr_body.md --repo "$GITHUB_REPOSITORY"

0 commit comments

Comments
 (0)