-
Notifications
You must be signed in to change notification settings - Fork 52
212 lines (198 loc) · 10.9 KB
/
Copy pathunity-tests.yml
File metadata and controls
212 lines (198 loc) · 10.9 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
name: Unity Tests
# Path-filtered on purpose. This matrix is five game-ci jobs; before the monorepo
# it lived in a repo that only held C#, so firing on every push was harmless. Now
# a renderer or docs commit would light up all five for nothing.
#
# `push` is main-only, deliberately. It used to be `['**']` alongside the
# pull_request trigger, and the concurrency group is keyed on github.ref -- which is
# refs/heads/<branch> for a push but refs/pull/N/merge for a pull request, so the two
# runs landed in different groups and neither cancelled the other. Every push to a
# branch with an open PR ran the whole matrix twice. The cost of main-only is that a
# branch with no PR gets no run; open a draft PR to get one.
on:
push:
branches: [main]
paths:
- 'unity/**'
- 'tests/**'
- '.github/workflows/unity-tests.yml'
pull_request:
branches: [main]
paths:
- 'unity/**'
- 'tests/**'
- '.github/workflows/unity-tests.yml'
workflow_dispatch:
inputs:
overwrite-snapshots:
type: boolean
description: Overwrite snapshots
# The old workflow also had `repository_dispatch: [run-tests]`, fired by a
# trigger-tests.yml living on the orphan `tests` branch of another repo. Both
# sides are in this repo now, so the whole round trip is deleted.
concurrency:
group: unity-tests-${{ github.ref }}
cancel-in-progress: true
jobs:
tests:
name: ${{ matrix.suite.name }} - Unity ${{ matrix.unity.version }}
permissions:
contents: write
checks: write
pull-requests: write
# An explicit job list, not an axis product, because the whole list is swapped per
# event: a pull request runs only the job marked `main`, and everything else runs all
# three versions. Each job is ~18 minutes and they are parallel, so dropping to one on
# PRs cuts machine time to a third and leaves the ~19 minute wall clock alone.
#
# The cost is that a break in one version only -- as the :enter/:leave transition
# timing was, on 6000.x alone -- surfaces after merge rather than in the PR. Run the
# workflow by hand on a branch, or push to main, to get the full matrix.
#
# `main` marks the one job that owns the side effects: committing snapshots and
# pushing the badge gist. It stays on the newest version so a PR is checked against
# the one most people are on.
#
# 2021.3, 2022.3 and 2023.2 were dropped. 2021.3 had stopped contributing anything: its
# PlayMode run produced a 0-test result file, so the job only ever reported the
# EditMode suite. unity/core/package.json still declares `"unity": "2021.3"` --
# dropping a job is not the same as dropping support, so lower that separately if
# that is the intent.
#
# 2023.2 went because tests/Packages/manifest.json pins com.unity.inputsystem 1.14.2,
# which references BuildTarget.VisionOS -- absent in 2023.2, so InputSystemPluginControl
# fails to compile with CS0117 and no test runs at all. The pin is deliberate (the newer
# input system is what the project develops against), so the job could only have been
# kept by downgrading it, and older versions use the TreeView API that 6000.5 treats as
# obsolete-as-error locally. Trading a CI failure for a local one is not a trade.
#
# Worth knowing how long that was invisible: the job kept passing for a day after the
# pin landed in 555c206e, because its Library cache still held the pre-pin resolution.
# The cache key had no content hash, so the stale entry was restored on every run. It
# now hashes the manifests (see the cache step), which is what surfaced this.
#
# `platform` and `unity.license` are absent from every entry on purpose; the two
# places that read them fall back to 'ubuntu-latest' and 'UNITY_LICENSE'.
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(github.event_name == 'pull_request'
&& '[{"main":true,"unity":{"version":"6000.1.9f1"},"suite":{"name":"Unit Tests","assemblies":"ReactUnity.Tests;ReactUnity.Tests.Editor"}}]'
|| '[{"main":true,"unity":{"version":"6000.1.9f1"},"suite":{"name":"Unit Tests","assemblies":"ReactUnity.Tests;ReactUnity.Tests.Editor"}},{"unity":{"version":"6000.0.51f1"},"suite":{"name":"Unit Tests","assemblies":"ReactUnity.Tests;ReactUnity.Tests.Editor"}}]') }}
runs-on: ${{ matrix.platform || 'ubuntu-latest' }}
steps:
# One checkout. This replaced five (core, tests@tests branch, jint, quickjs,
# clearscript) plus the jq manifest rewriting that wired them together --
# tests/Packages/manifest.json now commits the correct file:../../unity/*
# paths, so there is nothing to patch at runtime.
- uses: actions/checkout@v7
with:
fetch-depth: 0
# The key carries the package manifests because tests/Library holds PackageCache, and a
# Library resolved for one set of packages has no business being restored for another.
#
# It is worth being clear about what this does NOT fix. The 2023.2 job wedged on a cache
# whose PackageCache was simply incomplete -- `CS0006: Metadata file
# codecoverage@1.2.5/.../ReportGeneratorMerged.dll could not be found`, and CS2001 for a
# dozen test-framework sources. Nothing in a key detects a corrupt entry, and with a key
# that never varied, that one was restored on every run until it was deleted by hand
# (`gh cache delete <id>`, still the fix for that). What the hash buys is that the wedge
# can no longer outlive a package change, and that a manifest edit cannot be served a
# Library built for the previous one.
#
# No restore-keys, deliberately: a prefix fallback would restore the newest older entry
# on a miss, which is precisely the poisoned one you are trying to get away from. A key
# change pays a cold import instead, which is the point.
- name: Cache Unity Library
uses: actions/cache@v6
with:
path: tests/Library
key: Library-${{ matrix.unity.version }}-${{ matrix.platform || 'ubuntu-latest' }}-${{ hashFiles('tests/Packages/manifest.json', 'tests/Packages/packages-lock.json') }}
# NOTE for tests/Packages/manifest.json, which is JSON and cannot hold this
# comment: `com.unity.test-framework.performance` was removed from `testables`.
# On Unity 6000.x, Unity upgrades that package 2.8.1-preview -> 3.1.0, and a
# package listed in `testables` makes Unity resolve its *related* test package
# too -- com.unity.test-framework.performance.tests@3.1.0, which does not exist.
# Resolution then failed for the whole project and the PlayMode run produced no
# results at all, so the 662-test UGUI suite silently did not run on 6000.0 or
# 6000.1 while the job still reported the 325 EditMode tests.
#
# The package stays a dependency (unity/core/Tests/Performance needs
# Unity.PerformanceTesting to compile) and this repo's own perf tests still run:
# they live in com.reactunity.core, which is still testable. Only Unity's own
# tests for that package are no longer requested.
- name: Run Unity Tests
uses: game-ci/unity-test-runner@v4
id: testRunner
continue-on-error: true
env:
UNITY_LICENSE: ${{ secrets[matrix.unity.license || 'UNITY_LICENSE'] }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
projectPath: tests
githubToken: ${{ secrets.GITHUB_TOKEN }}
checkName: ${{ matrix.suite.name }} ${{ matrix.unity.version }}
unityVersion: ${{ matrix.unity.version }}
testMode: ${{ contains(matrix.suite.assemblies, 'Editor') && 'All' || 'PlayMode' }}
# Code coverage instrumentation is gone along with Codecov. It cost
# -debugCodeOptimization on the slowest job and nothing consumed the
# result any more.
customParameters: >-
-assemblyNames ${{ matrix.suite.assemblies }}
${{ (contains(github.event.head_commit.message, '[snapshots]') || github.event.inputs.overwrite-snapshots == 'true') && '-reactOverwriteSnapshots' || '' }}
# Never on a pull request: checkout leaves a detached merge commit there, so there is
# no branch to push to. Overwrite mode cannot switch on for that event anyway -- it
# reads head_commit.message and the dispatch input, both null -- so no lockfile is
# written and this was already inert. Stated rather than relied on.
- name: Commit Snapshots
if: >
github.event_name != 'pull_request' && matrix.main &&
hashFiles('unity/core/Tests/.snapshots/snapshots.lock') != ''
uses: EndBug/add-and-commit@v10
with:
add: 'unity/core/Tests/.snapshots'
default_author: github_actions
message: 'Update snapshots'
- name: Set artifacts folder ownership to current user
run: sudo chown -R $(id -u):$(id -g) "${{ github.workspace }}/${{ steps.testRunner.outputs.artifactsPath }}"
- uses: EnricoMi/publish-unit-test-result-action@v2
id: test-results
with:
check_name: '${{ matrix.suite.name }} ${{ matrix.unity.version }}'
nunit_files: '${{ github.workspace }}/${{ steps.testRunner.outputs.artifactsPath }}/*.xml'
- name: Set badge color
shell: bash
run: |
case ${{ fromJSON( steps.test-results.outputs.json ).conclusion }} in
success) echo "BADGE_COLOR=31c653" >> $GITHUB_ENV ;;
failure) echo "BADGE_COLOR=800000" >> $GITHUB_ENV ;;
neutral) echo "BADGE_COLOR=696969" >> $GITHUB_ENV ;;
esac
- name: Create badge
uses: emibcn/badge-action@v2
with:
label: Tests
status: '${{ fromJSON( steps.test-results.outputs.json ).stats.tests_succ }}/${{ fromJSON( steps.test-results.outputs.json ).stats.tests }}'
color: ${{ env.BADGE_COLOR }}
path: ReactUnityTestBadge.svg
style: flat
scale: 1.4
- name: Upload badge to Gist
if: github.ref == 'refs/heads/main' && always() && matrix.main
uses: andymckay/append-gist-action@1fbfbbce708a39bd45846f0955ed5521f2099c6d
with:
token: ${{ secrets.GIST_TOKEN }}
gistURL: https://gist.githubusercontent.com/KurtGokhan/f744e86dd53cd0159d4f1d56ae9aae19
file: ReactUnityTestBadge.svg
- name: Upload Test Result Artifacts
uses: actions/upload-artifact@v7
if: always()
with:
name: '${{ matrix.suite.name }} ${{ matrix.unity.version }}'
path: ${{ steps.testRunner.outputs.artifactsPath }}
- name: Fail workflow if tests failed
if: steps.testRunner.outcome == 'failure' && (fromJSON(steps.test-results.outputs.json).conclusion == 'failure' || fromJSON(steps.test-results.outputs.json).stats.tests == 0)
uses: actions/github-script@v9
with:
script: core.setFailed('Tests failed!')