blob: e9eab79aa20172287b9c9da6dd7ad67764f716e2 [file] [log] [blame] [view]
Brian Sheedy49f3942552019-06-13 22:19:011# GPU Pixel Testing With Gold
2
3This page describes in detail the GPU pixel tests that utilize Skia Gold for
4storing and comparing images (the `pixel_skia_gold_test` type). This includes
5information such as how Skia Gold works, how to triage images produced by these
6tests, and working on Gold itself.
7
8[TOC]
9
10## Skia Gold
11
12[Gold][gold documentation] is an image diff service developed by the Skia team.
13It was originally developed solely for Skia's usage and only supported
14post-submit tests, but has been picked up by other projects such as Chromium and
15PDFium and now supports trybots. Unlike other image diff solutions in Chromium,
16comparisons are done in an external service instead of locally on the testing
17machine.
18
19[gold documentation]: https://skia.org/dev/testing/skiagold
20
21### Why Gold
22
23Gold has three main advantages over the traditional local image comparison
24historically used by Chromium:
25
261. Triage time can be much lower. Because triaging is handled by an external
27service, new golden images don't need to go through the CQ and wait for
28waterfall bots to pick up the CL. Once an image is triaged in Gold, it
29becomes immediately available for future test runs.
302. Gold supports multiple approved images per test. It is not uncommon for
31tests to produce images that are visually indistinguishable, but differ in
32a handful of pixels by a small RGB value. Fuzzy image diffing can solve this
33problem, but introduces its own set of issues such as possibly causing a test
34to erroneously pass. Since most tests that exhibit this behavior only actually
35produce 2 or 3 possible valid images, being able to say that any of those
36images are acceptable is simpler and less error-prone.
373. Better image storage. Traditionally, images had to either be included
38directly in the repository or uploaded to a Google Storage bucket and pulled in
39using the image's hash. The former allowed users to easily see which images were
40currently approved, but storing large sized or numerous binary files in git is
41generally discouraged due to the way git's history works. The latter worked
42around the git issues, but made it much more difficult to actually see what was
43being used since the only thing the user had to go on was a hash. Gold moves the
44images out of the repository, but provides a GUI interface for easily seeing
45which images are currently approved for a particular test.
46
47### How It Works
48
49Gold consists of two main parts: the Gold instance/service and the `goldctl`
50binary. A Gold instance in turn consists of two parts: a Google Storage bucket
51that data is uploaded to and a server running on GCE that ingests the data and
52provides a way to triage diffs. `goldctl` simply provides a standardized way
53of interacting with Gold - uploading data to the correct place, retrieving
54baselines/golden information, etc.
55
56In general, the following order of events occurs when running a Gold-enabled
57test:
58
591. The test produces an image and passes it to `goldctl`, along with some
60information about the hardware and software configuration that the image was
61produced on, the test name, etc.
622. `goldctl` checks whether the hash of the produced image is in the list of
63approved hashes.
64 1. If it is, `goldctl` exits with a non-failing return code and nothing else
65 happens. At this point, the test is finished.
66 2. If it is not, `goldctl` uploads the image and metadata to the storage
67 bucket and exits with a failing return code.
683. The server sees the new data in the bucket and ingests it, showing a new
69untriaged image in the GUI.
704. A user approves the new image in the GUI, and the server adds the image's
71hash to the baselines. See the [Waterfall Bots](#Waterfall-Bots) and
72[Trybots](#Trybots) sections for specifics on this.
735. The next time the test is run, the new image is in the baselines, and
74assuming the test produces the same image again, the test passes.
75
76While this is the general order of events, there are several differences between
77waterfall/CI bots and trybots.
78
79#### Waterfall Bots
80
81Waterfall bots are the simpler of the two bot types. There is only a single
82set of baselines to worry about, which is whatever baselines were approved for
83a git revision. Additionally, any new images that are produced on waterfalls are
84all lumped into the same group of "untriaged images on master", and any images
85that are approved from here will immediately be added to the set of baselines
86for master.
87
88Since not all waterfall bots have a trybot counterpart that can be relied upon
89to catch newly produced images before a CL is committed, it is likely that a
90change that produces new goldens on the CQ will end up making some of the
91waterfall bots red for a bit, particularly those on chromium.gpu.fyi. They will
92remain red until the new images are triaged as positive or the tests stop
93producing the untriaged images. So, it is best to keep an eye out for a few
94hours after your CL is committed for any new images from the waterfall bots that
95need triaging.
96
97#### Trybots
98
99Trybots are a little more complicated when it comes to retrieving and approving
100images. First, the set of baselines that are provided when requested by a test
101is the union of the master baselines for the current revision and any baselines
102that are unique to the CL. For example, if an image with the hash `abcd` is in
103the master baselines for `FooTest` and the CL being tested has also approved
104an image with the hash `abef` for `FooTest`, then the provided baselines will
105contain both `abcd` and `abef` for `FooTest`.
106
107When an image associated with a CL is approved, the approval only applies to
108that CL until the CL is merged. Once this happens, any baselines produced by the
109CL are automatically merged into the master baselines for whatever git revision
110the CL was merged as. In the above example, if the CL was merged as commit
111`ffff`, then both `abcd` and `abef` would be approved images on master from
112`ffff` onward.
113
114## Triaging Failures
115
116### Standard Workflow
117
118The current approach to getting the triage links for new images is:
119
1201. Navigate to the failed build.
1212. Search for the failed step for the `pixel_skia_gold_test` test.
1223. Click on the `shard #0 (failed)` link
1234. Search for `untriaged` on the page and follow any links to
124https://chrome-gpu-gold.skia.org/ that the search finds.
1255. Triage images at those links (typically by approving them, but you can also
126mark them as a negative if it is an image that should not be produced). In the
127case of a negative image, a bug should be filed on [crbug] to investigate and
128fix the cause of the that particular image being produced, as future
129occurrences of it will cause the test to fail. Such bugs should include the
130`Internals>GPU>Testing` component and whatever component is suitable for the
131type of failing test (likely `Blink>WebGL`).
132
133[crbug]: https://crbug.com
134
135This is a known pain point about using Gold in Chromium, but should be
136alleviated in the future with several coming improvements:
137
1381. Links will be reported in a build's Milo output for a step, so you can skip
139digging through the task output.
1402. A comment will be automatically posted to CLs that produce new images with a
141link to triage them.
142
143In addition, you can see all currently untriaged images on master on the
144[GPU Gold instance's main page][gpu gold instance] and currently untriaged
145images for a CL by substituting the Gerrit CL number into
146`https://chrome-gpu-gold.skia.org/search?issue=[CL Number]&unt=true&master=true`.
147
148[gpu gold instance]: https://chrome-gpu-gold.skia.org
149
150### Triaging A Specific Image
151
152If for some reason an image is not showing up in Gold but you know the hash, you
153can manually navigate to the page for it by filling in the correct information
154to `https://chrome-gpu-gold.skia.org/detail?test=[test_name]&digest=[hash]`.
155From there, you should be able to triage it as normal.
156
157If this happens, please also file a bug in [Skia's bug tracker][skia crbug] so
158that the root cause can be investigated and fixed. It's likely that you will
159be unable to directly edit the owner, CC list, etc. directly, in which case
160ping kjlubick@ with a link to the filed bug to help speed up triaging. Include
161as much detail as possible, such as a links to the failed swarming task and
162the triage link for the problematic image.
163
164[skia crbug]: https://bugs.chromium.org/p/skia
165
166## Working On Gold
167
168### Modifying Gold And goldctl
169
170Although uncommon, changes to the Gold service and `goldctl` binary may be
171needed. To do so, simply get a checkout of the
172[Skia infrastructure repo][skia infra repo] and go through the same steps as
173a Chromium CL (`git cl upload`, etc.).
174
175[skia infra repo]: https://skia.googlesource.com/buildbot/
176
177The Gold service code is located in the `//golden/` directory, while `goldctl`
178is located in `//gold-client/`. Once your change is merged, you will have to
179either contact [email protected] to roll the service version or follow the
180steps in [Rolling goldctl](#Rolling-goldctl) to roll the `goldctl` version used
181by Chromium.
182
183### Rolling goldctl
184
185`goldctl` is available as a CIPD package and is DEPSed in as part of `gclient
186sync` To update the binary used in Chromium, perform the following steps:
187
1881. (One-time only) get an [infra checkout][infra repo]
1892. Run `infra $ ./go/env.py` and run each of the commands it outputs to change
190your GOPATH and other environment variables for your terminal
1913. Update the Skia revision in [`deps.yaml`][deps yaml] to match the revision
192of your `goldctl` CL (or some revision after it)
1934. Run `infra $ ./go/deps.py update` and copy the list of repos it updated
194(include this in your CL description)
1955. Upload the changelist ([sample CL][sample roll cl])
1966. Once the CL is merged, wait until the git revision of your merged CL shows
197up in the tags of one of the instances for the [CIPD package][goldctl package]
1987. Update the [revision in DEPS][goldctl deps entry] to be the merged CL's
199revision
200
201[infra repo]: https://chromium.googlesource.com/infra/infra/
202[deps yaml]: https://chromium.googlesource.com/infra/infra/+/91333d832a4d871b4219580dfb874b49a97e6da4/go/deps.yaml#432
203[sample roll cl]: https://chromium-review.googlesource.com/c/infra/infra/+/1493426
204[goldctl package]: https://chrome-infra-packages.appspot.com/p/skia/tools/goldctl/linux-amd64/+/
205[goldctl deps entry]: https://chromium.googlesource.com/chromium/src/+/6b7213a45382f01ac0a2efec1015545bd051da89/DEPS#1304
206
207If you want to make sure that `goldctl` builds after the update before
208committing (e.g. to ensure that no extra third party dependencies were added),
209run the following after the `./go/deps.py update` step:
210
2111. `infra $ ./go/deps.py install`
2122. `infra $ go install go.skia.org/infra/gold-client/cmd/goldctl`
2133. `infra $ which goldctl` which should point to a binary in `infra/go/bin/`
2144. `infra $ goldctl` to make sure it actually runs