summary refs log tree commit diff
path: root/.github/workflows/dependencies.yml
blob: b7b5a03bd41f3aeefcf781a79a1ed2ffbb61bbe3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Automatically run `cargo update` periodically

---
name: Bump dependencies in Cargo.lock
on:
  schedule:
    # Run weekly
    - cron: '0 0 * * Sun'
  workflow_dispatch:
    # Needed so we can run it manually
permissions:
  contents: read
defaults:
  run:
    shell: bash
env:
  # So cargo doesn't complain about unstable features
  RUSTC_BOOTSTRAP: 1
  PR_TITLE: Weekly `cargo update`
  PR_MESSAGE: |
    Automation to keep dependencies in `Cargo.lock` current.

    The following is the output from `cargo update`:
  COMMIT_MESSAGE: "cargo update \n\n"

jobs:
  not-waiting-on-bors:
    if: github.repository_owner == 'rust-lang'
    name: skip if S-waiting-on-bors
    runs-on: ubuntu-latest
    steps:
      - env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Fetch state and labels of PR
          # Or exit successfully if PR does not exist
          JSON=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json labels,state || exit 0)
          STATE=$(echo "$JSON" | jq -r '.state')
          WAITING_ON_BORS=$(echo "$JSON" | jq '.labels[] | any(.name == "S-waiting-on-bors"; .)')

          # Exit with error if open and S-waiting-on-bors
          if [[ "$STATE" == "OPEN" && "$WAITING_ON_BORS" == "true" ]]; then
            exit 1
          fi

  update:
    if: github.repository_owner == 'rust-lang'
    name: update dependencies
    needs: not-waiting-on-bors
    runs-on: ubuntu-latest
    steps:
      - name: checkout the source code
        uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: install the bootstrap toolchain
        run: |
          # Extract the stage0 version
          TOOLCHAIN=$(awk -F= '{a[$1]=$2} END {print(a["compiler_version"] "-" a["compiler_date"])}' src/stage0)
          # Install and set as default
          rustup toolchain install --no-self-update --profile minimal $TOOLCHAIN
          rustup default $TOOLCHAIN

      - name: cargo update compiler & tools
        # Remove first line that always just says "Updating crates.io index"
        run: |
          echo -e "\ncompiler & tools dependencies:" >> cargo_update.log
          cargo update 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
      - name: cargo update library
        run: |
          echo -e "\nlibrary dependencies:" >> cargo_update.log
          cargo update --manifest-path library/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
      - name: cargo update rustbook
        run: |
          echo -e "\nrustbook dependencies:" >> cargo_update.log
          cargo update --manifest-path src/tools/rustbook/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
      - name: upload Cargo.lock artifact for use in PR
        uses: actions/upload-artifact@v4
        with:
          name: Cargo-lock
          path: |
            Cargo.lock
            library/Cargo.lock
            src/tools/rustbook/Cargo.lock
          retention-days: 1
      - name: upload cargo-update log artifact for use in PR
        uses: actions/upload-artifact@v4
        with:
          name: cargo-updates
          path: cargo_update.log
          retention-days: 1

  pr:
    if: github.repository_owner == 'rust-lang'
    name: amend PR
    needs: update
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    steps:
      - name: checkout the source code
        uses: actions/checkout@v4

      - name: download Cargo.lock from update job
        uses: actions/download-artifact@v4
        with:
          name: Cargo-lock
      - name: download cargo-update log from update job
        uses: actions/download-artifact@v4
        with:
          name: cargo-updates

      - name: craft PR body and commit message
        run: |
          echo "${COMMIT_MESSAGE}" > commit.txt
          cat cargo_update.log >> commit.txt

          echo "${PR_MESSAGE}" > body.md
          echo '```txt' >> body.md
          cat cargo_update.log >> body.md
          echo '```' >> body.md

      - name: commit
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git switch --force-create cargo_update
          git add ./Cargo.lock ./library/Cargo.lock ./src/tools/rustbook/Cargo.lock
          git commit --no-verify --file=commit.txt

      - name: push
        run: git push --no-verify --force --set-upstream origin cargo_update

      - name: edit existing open pull request
        id: edit
        # Don't fail job if we need to open new PR
        continue-on-error: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Exit with error if PR is closed
          STATE=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json state --jq '.state')
          if [[ "$STATE" != "OPEN" ]]; then
            exit 1
          fi

          gh pr edit cargo_update --title "${PR_TITLE}" --body-file body.md --repo $GITHUB_REPOSITORY

      - name: open new pull request
        # Only run if there wasn't an existing PR
        if: steps.edit.outcome != 'success'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: gh pr create --title "${PR_TITLE}" --body-file body.md --repo $GITHUB_REPOSITORY