[roll] Roll fuchsia [build] Fix build archive dependencies.

This CL fixes flaky incremental issues that randomly
happen on CI bots, where pack-images.py is passed an
archive-images-manifest.json input file that lists image
files that were not generated by the build, and thus
fails with an error like:

```
no such file: gen/vendor/acme/products/foo/product_bundle.qemu-x64/product_bundle/system_a/fvm.blk
```

The root cause of the problem is that the action() target
that generates build-archive.tgz (and its variants)
used the `archive-images-manifest.json` file as input,
but did not depend on the target that generates it.

In certain rare cases, this would mean that the file would
list image entries that were not built (yet)  when the action is
invoked.

Unfortunately, just adding the missing dependency introduces
a dependency cycle, i.e.:

  //build/images/archive:archive-images-manifest
   -> //build/images:images
   -> //build/images:default-images
   -> //build/images/archive:paver-script             [extra dep]
   -> //build/images/archive:archive-images-manifest

And this was due to:

- //build/images/archive:paver-script being an action()
  that uses archive-images-manifest.json as an input.

- //build/images:default-images depending on
  //build/images/archive:paver-script when
  `recovery_is_zedboot` is set in the current build
  configuration.

The first point is not necessary, since generating a paver
script only needs the list of image files that come from
the target's transitive dependencies only, and not all
images generated in the current build configuration.

To solve this problem, the following is done in this CL:

- For each action() generating a script or archive in
  //build/images/archive/BUILD.gn, generate an archive image
  manifest that only contains entries matching its own set
  of transitive dependencies.

- Ensure that the archive-generating targets depend on
  //build/images and //build/images/tools:bootserver, which
  where dependencies of archive-images-manifest.json.

  Manual inspection shows that for the target that generates
  build-archive.tgz, its content is the same as
  archive-images-manifest.json (except for trivial ordering
  differences).

  For targets that generate paving/flashing scripts,
  their content only includes the dependencies required
  to run the script, which is sufficient and breaks
  the dependency cycle.

- Remove archive-images-manifest.json entirely.

+ Add documentation and better command-line parsing to
  the pack-images.py script.

+ Add missing documentation for the "archive" field
  in images.json entries.

Bug=b/291923285

Original-Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/887351
Original-Revision: d6997152782241bdc10c53f26828e4630fce62d8
GitOrigin-RevId: 9508a4c05b66de3ea3c4552df962c9dc586c0745
Change-Id: I0f3a9603d30aa35ed715fb70f3383232e6de9319
1 file changed
tree: 2e6cea8226f764f098c3a5124757816f6f0262bb
  1. git-hooks/
  2. infra/
  3. third_party/
  4. cts
  5. firmware
  6. flower
  7. jiri.lock
  8. MILESTONE
  9. minimal
  10. prebuilts
  11. README.md
  12. stem
  13. test_durations
  14. toolchain
README.md

Integration

This repository contains Fuchsia's Global Integration manifest files.

Making changes

All changes should be made to the internal version of this repository. Our infrastructure automatically updates this version when the internal one changes.

Currently all changes must be made by a Google employee. Non-Google employees wishing to make a change can ask for assistance via the IRC channel #fuchsia on Freenode.

Obtaining the source

First install Jiri.

Next run:

$ jiri init
$ jiri import minimal https://fuchsia.googlesource.com/integration
$ jiri update

Third party

Third party projects should have their own subdirectory in ./third_party.