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).
113#
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.
159
16- ---
1710name : CI
18- " on " :
11+ on :
1912 push :
2013 branches :
2114 - auto
@@ -25,176 +18,232 @@ name: CI
2518 pull_request :
2619 branches :
2720 - " **"
21+
2822permissions :
2923 contents : read
3024 packages : write
25+
3126defaults :
3227 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.)
3331 shell : bash
32+
3433concurrency :
35- 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 }}
3638 cancel-in-progress : true
3739env :
3840 TOOLSTATE_REPO : " https://github.com/rust-lang-nursery/rust-toolstate"
3941jobs :
42+ # The job matrix for `calculate_matrix` is defined in src/ci/github-actions/jobs.yml.
43+ # It calculates which jobs should be executed, based on the data of the ${{ github }} context.
44+ # If you want to modify CI jobs, take a look at src/ci/github-actions/jobs.yml.
4045 calculate_matrix :
4146 name : Calculate job matrix
4247 runs-on : ubuntu-latest
4348 outputs :
44- jobs : " ${{ steps.jobs.outputs.jobs }}"
49+ jobs : ${{ steps.jobs.outputs.jobs }}
50+ run_type : ${{ steps.jobs.outputs.run_type }}
4551 steps :
4652 - name : Checkout the source code
4753 uses : actions/checkout@v4
4854 - name : Calculate the CI job matrix
4955 run : python3 src/ci/github-actions/calculate-job-matrix.py >> $GITHUB_OUTPUT
5056 id : jobs
5157 job :
52- name : " ${{ matrix.name }}"
53- needs :
54- - calculate_matrix
58+ name : ${{ matrix.name }}
59+ needs : [ calculate_matrix ]
5560 runs-on : " ${{ matrix.os }}"
5661 defaults :
5762 run :
58- shell : " ${{ contains(matrix.os, 'windows') && 'msys2 {0}' || 'bash' }}"
63+ shell : ${{ contains(matrix.os, 'windows') && 'msys2 {0}' || 'bash' }}
5964 timeout-minutes : 600
6065 env :
61- CI_JOB_NAME : " ${{ matrix.image }}"
66+ CI_JOB_NAME : ${{ matrix.image }}
6267 CARGO_REGISTRIES_CRATES_IO_PROTOCOL : sparse
63- HEAD_SHA : " ${{ github.event.pull_request.head.sha || github.sha }}"
64- DOCKER_TOKEN : " ${{ secrets.GITHUB_TOKEN }}"
68+ # commit of PR sha or commit sha. `GITHUB_SHA` is not accurate for PRs.
69+ HEAD_SHA : ${{ github.event.pull_request.head.sha || github.sha }}
70+ DOCKER_TOKEN : ${{ secrets.GITHUB_TOKEN }}
6571 SCCACHE_BUCKET : rust-lang-ci-sccache2
6672 CACHE_DOMAIN : ci-caches.rust-lang.org
67- continue-on-error : " ${{ matrix.continue_on_error || false }}"
73+ continue-on-error : ${{ matrix.continue_on_error || false }}
6874 strategy :
6975 matrix :
70- include : " ${{ fromJSON(needs.calculate_matrix.outputs.jobs) }}"
71- if : " fromJSON(needs.calculate_matrix.outputs.jobs)[0] != null"
76+ # Check the `calculate_matrix` job to see how is the matrix defined.
77+ include : ${{ fromJSON(needs.calculate_matrix.outputs.jobs) }}
78+ # GitHub Actions fails the workflow if an empty list of jobs is provided to
79+ # the workflow, so we need to skip this job if nothing was produced by
80+ # the Python script.
81+ #
82+ # Unfortunately checking whether a list is empty is not possible in a nice
83+ # way due to GitHub Actions expressions limits.
84+ # This hack is taken from https://github.com/ferrocene/ferrocene/blob/d43edc6b7697cf1719ec1c17c54904ab94825763/.github/workflows/release.yml#L75-L82
85+ if : fromJSON(needs.calculate_matrix.outputs.jobs)[0] != null
7286 steps :
73- - if : " contains(matrix.os, 'windows')"
87+ - if : contains(matrix.os, 'windows')
7488 uses : msys2/setup-msys2@v2.22.0
7589 with :
76- msystem : " ${{ contains(matrix.name, 'i686') && 'mingw32' || 'mingw64' }}"
90+ # i686 jobs use mingw32. x86_64 and cross-compile jobs use mingw64.
91+ msystem : ${{ contains(matrix.name, 'i686') && 'mingw32' || 'mingw64' }}
92+ # don't try to download updates for already installed packages
7793 update : false
94+ # don't try to use the msys that comes built-in to the github runner,
95+ # so we can control what is installed (i.e. not python)
7896 release : true
97+ # Inherit the full path from the Windows environment, with MSYS2's */bin/
98+ # dirs placed in front. This lets us run Windows-native Python etc.
7999 path-type : inherit
80- install : " make dos2unix diffutils\n "
100+ install : >
101+ make
102+ dos2unix
103+ diffutils
104+
81105 - name : disable git crlf conversion
82106 run : git config --global core.autocrlf false
107+
83108 - name : checkout the source code
84109 uses : actions/checkout@v4
85110 with :
86111 fetch-depth : 2
112+
113+ # Rust Log Analyzer can't currently detect the PR number of a GitHub
114+ # Actions build on its own, so a hint in the log message is needed to
115+ # point it in the right direction.
87116 - name : configure the PR in which the error message will be posted
88- run : " echo \ " [CI_PR_NUMBER=$num]\" "
117+ run : echo "[CI_PR_NUMBER=$num]"
89118 env :
90- num : " ${{ github.event.number }}"
91- if : " success() && github.event_name == 'pull_request'"
119+ num : ${{ github.event.number }}
120+ if : needs.calculate_matrix.outputs.run_type == 'pr'
121+
92122 - name : add extra environment variables
93123 run : src/ci/scripts/setup-environment.sh
94124 env :
95- EXTRA_VARIABLES : " ${{ toJson(matrix.env) }}"
125+ # Since it's not possible to merge `${{ matrix.env }}` with the other
126+ # variables in `job.<name>.env`, the variables defined in the matrix
127+ # are passed to the `setup-environment.sh` script encoded in JSON,
128+ # which then uses log commands to actually set them.
129+ EXTRA_VARIABLES : ${{ toJson(matrix.env) }}
130+
96131 - name : ensure the channel matches the target branch
97132 run : src/ci/scripts/verify-channel.sh
133+
98134 - name : collect CPU statistics
99135 run : src/ci/scripts/collect-cpu-stats.sh
136+
100137 - name : show the current environment
101138 run : src/ci/scripts/dump-environment.sh
139+
102140 - name : install awscli
103141 run : src/ci/scripts/install-awscli.sh
142+
104143 - name : install sccache
105144 run : src/ci/scripts/install-sccache.sh
145+
106146 - name : select Xcode
107147 run : src/ci/scripts/select-xcode.sh
148+
108149 - name : install clang
109150 run : src/ci/scripts/install-clang.sh
151+
110152 - name : install tidy
111153 run : src/ci/scripts/install-tidy.sh
154+
112155 - name : install WIX
113156 run : src/ci/scripts/install-wix.sh
157+
114158 - name : disable git crlf conversion
115159 run : src/ci/scripts/disable-git-crlf-conversion.sh
160+
116161 - name : checkout submodules
117162 run : src/ci/scripts/checkout-submodules.sh
163+
118164 - name : install MSYS2
119165 run : src/ci/scripts/install-msys2.sh
166+
120167 - name : install MinGW
121168 run : src/ci/scripts/install-mingw.sh
169+
122170 - name : install ninja
123171 run : src/ci/scripts/install-ninja.sh
172+
124173 - name : enable ipv6 on Docker
125174 run : src/ci/scripts/enable-docker-ipv6.sh
175+
176+ # Disable automatic line ending conversion (again). On Windows, when we're
177+ # installing dependencies, something switches the git configuration directory or
178+ # re-enables autocrlf. We've not tracked down the exact cause -- and there may
179+ # be multiple -- but this should ensure submodules are checked out with the
180+ # appropriate line endings.
126181 - name : disable git crlf conversion
127182 run : src/ci/scripts/disable-git-crlf-conversion.sh
183+
128184 - name : ensure line endings are correct
129185 run : src/ci/scripts/verify-line-endings.sh
186+
130187 - name : ensure backported commits are in upstream branches
131188 run : src/ci/scripts/verify-backported-commits.sh
189+
132190 - name : ensure the stable version number is correct
133191 run : src/ci/scripts/verify-stable-version-number.sh
192+
134193 - name : run the build
194+ # Redirect stderr to stdout to avoid reordering the two streams in the GHA logs.
135195 run : src/ci/scripts/run-build-from-ci.sh 2>&1
136196 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 }}"
197+ AWS_ACCESS_KEY_ID : ${{ env.CACHES_AWS_ACCESS_KEY_ID }}
198+ AWS_SECRET_ACCESS_KEY : ${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.CACHES_AWS_ACCESS_KEY_ID)] }}
199+ TOOLSTATE_REPO_ACCESS_TOKEN : ${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }}
200+
140201 - name : create github artifacts
141202 run : src/ci/scripts/create-doc-artifacts.sh
203+
142204 - name : upload artifacts to github
143205 uses : actions/upload-artifact@v4
144206 with :
145- name : " ${{ env.DOC_ARTIFACT_NAME }}"
207+ # name is set in previous step
208+ name : ${{ env.DOC_ARTIFACT_NAME }}
146209 path : obj/artifacts/doc
147210 if-no-files-found : ignore
148211 retention-days : 5
212+
149213 - name : upload artifacts to S3
150214 run : src/ci/scripts/upload-artifacts.sh
151215 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- try-success :
156- needs :
157- - job
158- if : " success() && github.event_name == 'push' && (github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.repository == 'rust-lang-ci/rust'"
159- steps :
160- - name : mark the job as a success
161- run : exit 0
162- shell : bash
163- name : bors build finished
164- runs-on : ubuntu-latest
165- try-failure :
166- needs :
167- - job
168- if : " !success() && github.event_name == 'push' && (github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.repository == 'rust-lang-ci/rust'"
169- steps :
170- - name : mark the job as a failure
171- run : exit 1
172- shell : bash
216+ AWS_ACCESS_KEY_ID : ${{ env.ARTIFACTS_AWS_ACCESS_KEY_ID }}
217+ AWS_SECRET_ACCESS_KEY : ${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.ARTIFACTS_AWS_ACCESS_KEY_ID)] }}
218+ # Adding a condition on DEPLOY=1 or DEPLOY_ALT=1 is not needed as all deploy
219+ # builders *should* have the AWS credentials available. Still, explicitly
220+ # adding the condition is helpful as this way CI will not silently skip
221+ # deploying artifacts from a dist builder if the variables are misconfigured,
222+ # erroring about invalid credentials instead.
223+ if : github.event_name == 'push' || env.DEPLOY == '1' || env.DEPLOY_ALT == '1'
224+
225+ # This job isused to tell bors the final status of the build, as there is no practical way to detect
226+ # when a workflow is successful listening to webhooks only in our current bors implementation (homu).
227+ outcome :
173228 name : bors build finished
174229 runs-on : ubuntu-latest
175- auto-success :
176- needs :
177- - job
178- if : " success() && github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust'"
230+ needs : [ calculate_matrix, job ]
231+ # !cancelled() executes the job regardless of whether the previous jobs passed or failed
232+ if : ${{ !cancelled() && contains(fromJSON('["auto", "try"]'), needs.calculate_matrix.outputs.run_type) }}
179233 steps :
180234 - name : checkout the source code
181235 uses : actions/checkout@v4
182236 with :
183237 fetch-depth : 2
238+ # Calculate the exit status of the whole CI workflow.
239+ # If all dependent jobs were successful, this exits with 0 (and the outcome job continues successfully).
240+ # If a some dependent job has failed, this exits with 1.
241+ - name : calculate the correct exit status
242+ run : jq --exit-status 'all(.result == "success" or .result == "skipped")' <<< '${{ toJson(needs) }}'
243+ # Publish the toolstate if an auto build succeeds (just before push to master)
184244 - name : publish toolstate
185245 run : src/ci/publish_toolstate.sh
186246 shell : bash
247+ if : needs.calculate_matrix.outputs.run_type == 'auto'
187248 env :
188- TOOLSTATE_REPO_ACCESS_TOKEN : " ${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }}"
189- name : bors build finished
190- runs-on : ubuntu-latest
191- auto-failure :
192- needs :
193- - job
194- if : " !success() && github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust'"
195- steps :
196- - name : mark the job as a failure
197- run : exit 1
198- shell : bash
199- name : bors build finished
200- runs-on : ubuntu-latest
249+ TOOLSTATE_REPO_ACCESS_TOKEN : ${{ secrets.TOOLSTATE_REPO_ACCESS_TOKEN }}
0 commit comments