|
1 |
| -############################################################# |
2 |
| -# WARNING: automatically generated file, DO NOT CHANGE! # |
3 |
| -############################################################# |
4 |
| - |
5 |
| -# This file was automatically generated by the expand-yaml-anchors tool. The |
6 |
| -# source file that generated this one is: |
7 |
| -# |
8 |
| -# src/ci/github-actions/ci.yml |
9 |
| -# |
10 |
| -# Once you make changes to that file you need to run: |
| 1 | +# This file defines our primary CI workflow that runs on pull requests |
| 2 | +# and also on pushes to special branches (auto, try). |
11 | 3 | #
|
12 |
| -# ./x.py run src/tools/expand-yaml-anchors/ |
13 |
| -# |
14 |
| -# The CI build will fail if the tool is not run after changes to this file. |
| 4 | +# The actual definition of the executed jobs is calculated by a Python |
| 5 | +# script located at src/ci/github-actions/calculate-job-matrix.py, which |
| 6 | +# uses job definition data from src/ci/github-actions/jobs.yml. |
| 7 | +# You should primarily modify the `jobs.yml` file if you want to modify |
| 8 | +# what jobs are executed in CI. |
15 | 9 |
|
16 |
| ---- |
17 | 10 | name: CI
|
18 |
| -"on": |
| 11 | +on: |
19 | 12 | push:
|
20 | 13 | branches:
|
21 | 14 | - auto
|
22 | 15 | - try
|
23 | 16 | - try-perf
|
24 | 17 | - automation/bors/try
|
25 |
| - - master |
26 | 18 | pull_request:
|
27 | 19 | branches:
|
28 | 20 | - "**"
|
| 21 | + |
29 | 22 | permissions:
|
30 | 23 | contents: read
|
31 | 24 | packages: write
|
| 25 | + |
32 | 26 | defaults:
|
33 | 27 | run:
|
| 28 | + # On Linux, macOS, and Windows, use the system-provided bash as the default |
| 29 | + # shell. (This should only make a difference on Windows, where the default |
| 30 | + # shell is PowerShell.) |
34 | 31 | shell: bash
|
| 32 | + |
35 | 33 | concurrency:
|
36 |
| - group: "${{ github.workflow }}-${{ ((github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.sha) || github.ref }}" |
| 34 | + # For a given workflow, if we push to the same branch, cancel all previous builds on that branch. |
| 35 | + # We add an exception for try builds (try branch) and unrolled rollup builds (try-perf), which |
| 36 | + # are all triggered on the same branch, but which should be able to run concurrently. |
| 37 | + group: ${{ github.workflow }}-${{ ((github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.sha) || github.ref }} |
37 | 38 | cancel-in-progress: true
|
| 39 | + |
38 | 40 | jobs:
|
| 41 | + # The job matrix for `calculate_matrix` is defined in src/ci/github-actions/jobs.yml. |
| 42 | + # It calculates which jobs should be executed, based on the data of the ${{ github }} context. |
| 43 | + # If you want to modify CI jobs, take a look at src/ci/github-actions/jobs.yml. |
39 | 44 | calculate_matrix:
|
40 | 45 | name: Calculate job matrix
|
41 | 46 | runs-on: ubuntu-latest
|
42 | 47 | outputs:
|
43 |
| - jobs: "${{ steps.jobs.outputs.jobs }}" |
| 48 | + jobs: ${{ steps.jobs.outputs.jobs }} |
44 | 49 | steps:
|
45 | 50 | - name: Checkout the source code
|
46 | 51 | uses: actions/checkout@v4
|
47 | 52 | - name: Calculate the CI job matrix
|
48 | 53 | run: python3 src/ci/github-actions/calculate-job-matrix.py >> $GITHUB_OUTPUT
|
49 | 54 | id: jobs
|
50 | 55 | job:
|
51 |
| - name: "${{ matrix.name }}" |
52 |
| - needs: |
53 |
| - - calculate_matrix |
| 56 | + name: ${{ matrix.name }} |
| 57 | + needs: [ calculate_matrix ] |
| 58 | + runs-on: "${{ matrix.os }}" |
| 59 | + defaults: |
| 60 | + run: |
| 61 | + shell: ${{ contains(matrix.os, 'windows') && 'msys2 {0}' || 'bash' }} |
| 62 | + timeout-minutes: 600 |
54 | 63 | env:
|
55 |
| - CI_JOB_NAME: "${{ matrix.image }}" |
| 64 | + CI_JOB_NAME: ${{ matrix.image }} |
56 | 65 | CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
|
57 |
| - HEAD_SHA: "${{ github.event.pull_request.head.sha || github.sha }}" |
58 |
| - DOCKER_TOKEN: "${{ secrets.GITHUB_TOKEN }}" |
| 66 | + # commit of PR sha or commit sha. `GITHUB_SHA` is not accurate for PRs. |
| 67 | + HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} |
| 68 | + DOCKER_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
59 | 69 | SCCACHE_BUCKET: rust-lang-ci-sccache2
|
60 |
| - TOOLSTATE_REPO: "https://github.com./rust-lang-nursery/rust-toolstate" |
| 70 | + TOOLSTATE_REPO: https://github.com./rust-lang-nursery/rust-toolstate |
61 | 71 | CACHE_DOMAIN: ci-caches.rust-lang.org
|
62 |
| - continue-on-error: "${{ matrix.continue_on_error || false }}" |
| 72 | + continue-on-error: ${{ matrix.continue_on_error || false }} |
63 | 73 | strategy:
|
64 | 74 | matrix:
|
65 |
| - include: "${{ fromJSON(needs.calculate_matrix.outputs.jobs) }}" |
66 |
| - if: "fromJSON(needs.calculate_matrix.outputs.jobs)[0] != null" |
67 |
| - defaults: |
68 |
| - run: |
69 |
| - shell: "${{ contains(matrix.os, 'windows') && 'msys2 {0}' || 'bash' }}" |
70 |
| - timeout-minutes: 600 |
71 |
| - runs-on: "${{ matrix.os }}" |
| 75 | + # Check the `calculate_matrix` job to see how is the matrix defined. |
| 76 | + include: ${{ fromJSON(needs.calculate_matrix.outputs.jobs) }} |
| 77 | + # GitHub Actions fails the workflow if an empty list of jobs is provided to |
| 78 | + # the workflow, so we need to skip this job if nothing was produced by |
| 79 | + # the Python script. |
| 80 | + # |
| 81 | + # Unfortunately checking whether a list is empty is not possible in a nice |
| 82 | + # way due to GitHub Actions expressions limits. |
| 83 | + # This hack is taken from https://github.com./ferrocene/ferrocene/blob/d43edc6b7697cf1719ec1c17c54904ab94825763/.github/workflows/release.yml#L75-L82 |
| 84 | + if: fromJSON(needs.calculate_matrix.outputs.jobs)[0] != null |
72 | 85 | steps:
|
73 |
| - - if: "contains(matrix.os, 'windows')" |
| 86 | + - if: contains(matrix.os, 'windows') |
74 | 87 |
|
75 | 88 | with:
|
76 |
| - msystem: "${{ contains(matrix.name, 'i686') && 'mingw32' || 'mingw64' }}" |
| 89 | + # i686 jobs use mingw32. x86_64 and cross-compile jobs use mingw64. |
| 90 | + msystem: ${{ contains(matrix.name, 'i686') && 'mingw32' || 'mingw64' }} |
| 91 | + # don't try to download updates for already installed packages |
77 | 92 | update: false
|
| 93 | + # don't try to use the msys that comes built-in to the github runner, |
| 94 | + # so we can control what is installed (i.e. not python) |
78 | 95 | release: true
|
| 96 | + # Inherit the full path from the Windows environment, with MSYS2's */bin/ |
| 97 | + # dirs placed in front. This lets us run Windows-native Python etc. |
79 | 98 | path-type: inherit
|
80 |
| - install: "make dos2unix diffutils\n" |
| 99 | + install: > |
| 100 | + make |
| 101 | + dos2unix |
| 102 | + diffutils |
| 103 | +
|
81 | 104 | - name: disable git crlf conversion
|
82 | 105 | run: git config --global core.autocrlf false
|
| 106 | + |
83 | 107 | - name: checkout the source code
|
84 | 108 | uses: actions/checkout@v4
|
85 | 109 | with:
|
86 | 110 | fetch-depth: 2
|
| 111 | + |
| 112 | + # Rust Log Analyzer can't currently detect the PR number of a GitHub |
| 113 | + # Actions build on its own, so a hint in the log message is needed to |
| 114 | + # point it in the right direction. |
87 | 115 | - name: configure the PR in which the error message will be posted
|
88 |
| - run: "echo \"[CI_PR_NUMBER=$num]\"" |
| 116 | + run: echo "[CI_PR_NUMBER=$num]" |
89 | 117 | env:
|
90 |
| - num: "${{ github.event.number }}" |
91 |
| - if: "success() && github.event_name == 'pull_request'" |
| 118 | + num: ${{ github.event.number }} |
| 119 | + if: success() && github.event_name == 'pull_request' |
| 120 | + |
92 | 121 | - name: add extra environment variables
|
93 | 122 | run: src/ci/scripts/setup-environment.sh
|
94 | 123 | env:
|
95 |
| - EXTRA_VARIABLES: "${{ toJson(matrix.env) }}" |
| 124 | + # Since it's not possible to merge `${{ matrix.env }}` with the other |
| 125 | + # variables in `job.<name>.env`, the variables defined in the matrix |
| 126 | + # are passed to the `setup-environment.sh` script encoded in JSON, |
| 127 | + # which then uses log commands to actually set them. |
| 128 | + EXTRA_VARIABLES: ${{ toJson(matrix.env) }} |
| 129 | + |
96 | 130 | - name: ensure the channel matches the target branch
|
97 | 131 | run: src/ci/scripts/verify-channel.sh
|
| 132 | + |
98 | 133 | - name: collect CPU statistics
|
99 | 134 | run: src/ci/scripts/collect-cpu-stats.sh
|
| 135 | + |
100 | 136 | - name: show the current environment
|
101 | 137 | run: src/ci/scripts/dump-environment.sh
|
| 138 | + |
102 | 139 | - name: install awscli
|
103 | 140 | run: src/ci/scripts/install-awscli.sh
|
| 141 | + |
104 | 142 | - name: install sccache
|
105 | 143 | run: src/ci/scripts/install-sccache.sh
|
| 144 | + |
106 | 145 | - name: select Xcode
|
107 | 146 | run: src/ci/scripts/select-xcode.sh
|
| 147 | + |
108 | 148 | - name: install clang
|
109 | 149 | run: src/ci/scripts/install-clang.sh
|
| 150 | + |
110 | 151 | - name: install tidy
|
111 | 152 | run: src/ci/scripts/install-tidy.sh
|
| 153 | + |
112 | 154 | - name: install WIX
|
113 | 155 | run: src/ci/scripts/install-wix.sh
|
| 156 | + |
114 | 157 | - name: disable git crlf conversion
|
115 | 158 | run: src/ci/scripts/disable-git-crlf-conversion.sh
|
| 159 | + |
116 | 160 | - name: checkout submodules
|
117 | 161 | run: src/ci/scripts/checkout-submodules.sh
|
| 162 | + |
118 | 163 | - name: install MSYS2
|
119 | 164 | run: src/ci/scripts/install-msys2.sh
|
| 165 | + |
120 | 166 | - name: install MinGW
|
121 | 167 | run: src/ci/scripts/install-mingw.sh
|
| 168 | + |
122 | 169 | - name: install ninja
|
123 | 170 | run: src/ci/scripts/install-ninja.sh
|
| 171 | + |
124 | 172 | - name: enable ipv6 on Docker
|
125 | 173 | run: src/ci/scripts/enable-docker-ipv6.sh
|
| 174 | + |
| 175 | + # Disable automatic line ending conversion (again). On Windows, when we're |
| 176 | + # installing dependencies, something switches the git configuration directory or |
| 177 | + # re-enables autocrlf. We've not tracked down the exact cause -- and there may |
| 178 | + # be multiple -- but this should ensure submodules are checked out with the |
| 179 | + # appropriate line endings. |
126 | 180 | - name: disable git crlf conversion
|
127 | 181 | run: src/ci/scripts/disable-git-crlf-conversion.sh
|
| 182 | + |
128 | 183 | - name: ensure line endings are correct
|
129 | 184 | run: src/ci/scripts/verify-line-endings.sh
|
| 185 | + |
130 | 186 | - name: ensure backported commits are in upstream branches
|
131 | 187 | run: src/ci/scripts/verify-backported-commits.sh
|
| 188 | + |
132 | 189 | - name: ensure the stable version number is correct
|
133 | 190 | run: src/ci/scripts/verify-stable-version-number.sh
|
| 191 | + |
134 | 192 | - name: run the build
|
| 193 | + # Redirect stderr to stdout to avoid reordering the two streams in the GHA logs. |
135 | 194 | run: src/ci/scripts/run-build-from-ci.sh 2>&1
|
136 | 195 | env:
|
137 |
| - AWS_ACCESS_KEY_ID: "${{ env.CACHES_AWS_ACCESS_KEY_ID }}" |
138 |
| - AWS_SECRET_ACCESS_KEY: "${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.CACHES_AWS_ACCESS_KEY_ID)] }}" |
139 |
| - TOOLSTATE_REPO_ACCESS_TOKEN: "${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }}" |
| 196 | + AWS_ACCESS_KEY_ID: ${{ env.CACHES_AWS_ACCESS_KEY_ID }} |
| 197 | + AWS_SECRET_ACCESS_KEY: ${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.CACHES_AWS_ACCESS_KEY_ID)] }} |
| 198 | + TOOLSTATE_REPO_ACCESS_TOKEN: ${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }} |
| 199 | + |
140 | 200 | - name: create github artifacts
|
141 | 201 | run: src/ci/scripts/create-doc-artifacts.sh
|
| 202 | + |
142 | 203 | - name: upload artifacts to github
|
143 | 204 | uses: actions/upload-artifact@v4
|
144 | 205 | with:
|
145 |
| - name: "${{ env.DOC_ARTIFACT_NAME }}" |
| 206 | + # name is set in previous step |
| 207 | + name: ${{ env.DOC_ARTIFACT_NAME }} |
146 | 208 | path: obj/artifacts/doc
|
147 | 209 | if-no-files-found: ignore
|
148 | 210 | retention-days: 5
|
| 211 | + |
149 | 212 | - name: upload artifacts to S3
|
150 | 213 | run: src/ci/scripts/upload-artifacts.sh
|
151 | 214 | env:
|
152 |
| - AWS_ACCESS_KEY_ID: "${{ env.ARTIFACTS_AWS_ACCESS_KEY_ID }}" |
153 |
| - AWS_SECRET_ACCESS_KEY: "${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.ARTIFACTS_AWS_ACCESS_KEY_ID)] }}" |
154 |
| - if: "success() && (github.event_name == 'push' || env.DEPLOY == '1' || env.DEPLOY_ALT == '1')" |
155 |
| - master: |
156 |
| - name: master |
| 215 | + AWS_ACCESS_KEY_ID: ${{ env.ARTIFACTS_AWS_ACCESS_KEY_ID }} |
| 216 | + AWS_SECRET_ACCESS_KEY: ${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.ARTIFACTS_AWS_ACCESS_KEY_ID)] }} |
| 217 | + # Adding a condition on DEPLOY=1 or DEPLOY_ALT=1 is not needed as all deploy |
| 218 | + # builders *should* have the AWS credentials available. Still, explicitly |
| 219 | + # adding the condition is helpful as this way CI will not silently skip |
| 220 | + # deploying artifacts from a dist builder if the variables are misconfigured, |
| 221 | + # erroring about invalid credentials instead. |
| 222 | + if: success() && (github.event_name == 'push' || env.DEPLOY == '1' || env.DEPLOY_ALT == '1') |
| 223 | + |
| 224 | + # This job isused to tell bors the final status of the build, as there is no practical way to detect |
| 225 | + # when a workflow is successful listening to webhooks only in our current bors implementation (homu). |
| 226 | + outcome: |
| 227 | + name: bors build finished |
157 | 228 | runs-on: ubuntu-latest
|
158 |
| - env: |
159 |
| - SCCACHE_BUCKET: rust-lang-ci-sccache2 |
160 |
| - DEPLOY_BUCKET: rust-lang-ci2 |
161 |
| - TOOLSTATE_REPO: "https://github.com./rust-lang-nursery/rust-toolstate" |
162 |
| - TOOLSTATE_ISSUES_API_URL: "https://api.github.com./repos/rust-lang/rust/issues" |
163 |
| - TOOLSTATE_PUBLISH: 1 |
164 |
| - CACHES_AWS_ACCESS_KEY_ID: AKIA46X5W6CZI5DHEBFL |
165 |
| - ARTIFACTS_AWS_ACCESS_KEY_ID: AKIA46X5W6CZN24CBO55 |
166 |
| - AWS_REGION: us-west-1 |
167 |
| - CACHE_DOMAIN: ci-caches.rust-lang.org |
168 |
| - if: "github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'rust-lang-ci/rust'" |
| 229 | + needs: [ job ] |
| 230 | + # !cancelled() executes the job regardless of whether the previous jobs passed or failed |
| 231 | + if: "!cancelled() && github.event_name == 'push'" |
169 | 232 | steps:
|
170 |
| - - name: checkout the source code |
171 |
| - uses: actions/checkout@v4 |
172 |
| - with: |
173 |
| - fetch-depth: 2 |
| 233 | + # Calculate the exit status of the whole CI workflow (0 if all dependent jobs were either successful |
| 234 | + # or skipped, otherwise 1). |
| 235 | + - name: calculate the correct exit status |
| 236 | + id: status |
| 237 | + run: | |
| 238 | + jq --exit-status 'all(.result == "success" or .result == "skipped")' <<< '${{ toJson(needs) }}' |
| 239 | + echo "status=$?" >> $GITHUB_OUTPUT |
| 240 | + # Publish the toolstate if an auto build succeeds (just before push to master) |
174 | 241 | - name: publish toolstate
|
175 | 242 | run: src/ci/publish_toolstate.sh
|
176 | 243 | shell: bash
|
| 244 | + if: steps.outputs.status == 0 && github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust' |
177 | 245 | env:
|
178 |
| - TOOLSTATE_REPO_ACCESS_TOKEN: "${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }}" |
179 |
| - try-success: |
180 |
| - needs: |
181 |
| - - job |
182 |
| - if: "success() && github.event_name == 'push' && (github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.repository == 'rust-lang-ci/rust'" |
183 |
| - steps: |
184 |
| - - name: mark the job as a success |
185 |
| - run: exit 0 |
186 |
| - shell: bash |
187 |
| - name: bors build finished |
188 |
| - runs-on: ubuntu-latest |
189 |
| - try-failure: |
190 |
| - needs: |
191 |
| - - job |
192 |
| - if: "!success() && github.event_name == 'push' && (github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.repository == 'rust-lang-ci/rust'" |
193 |
| - steps: |
194 |
| - - name: mark the job as a failure |
195 |
| - run: exit 1 |
196 |
| - shell: bash |
197 |
| - name: bors build finished |
198 |
| - runs-on: ubuntu-latest |
199 |
| - auto-success: |
200 |
| - needs: |
201 |
| - - job |
202 |
| - if: "success() && github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust'" |
203 |
| - steps: |
204 |
| - - name: mark the job as a success |
205 |
| - run: exit 0 |
206 |
| - shell: bash |
207 |
| - name: bors build finished |
208 |
| - runs-on: ubuntu-latest |
209 |
| - auto-failure: |
210 |
| - needs: |
211 |
| - - job |
212 |
| - if: "!success() && github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust'" |
213 |
| - steps: |
214 |
| - - name: mark the job as a failure |
215 |
| - run: exit 1 |
216 |
| - shell: bash |
217 |
| - name: bors build finished |
218 |
| - runs-on: ubuntu-latest |
| 246 | + TOOLSTATE_REPO_ACCESS_TOKEN: ${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }} |
| 247 | + - name: set the correct exit status |
| 248 | + run: exit ${{ steps.outputs.status == 0 }} |
0 commit comments