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