To integrate your software into the Fuchsia project as prebuilt packages, you need to publish your prebuilt packages to Chrome Infrastructure Package Deployment (CIPD{: .external}). A prebuilt package is a Fuchsia archive (FAR) file that contains the binaries and metadata of your software.
Once you set up continuous integration (CI) with Fuchsia, whenever you publish new versions of the prebuilt packages to CIPD, Fuchsia’s CI system fetches those new packages and roll them into Fuchsia through the global integration process.
Before you start working on publishing prebuilt packages, you need to know how to build a prebuilt package.
The main purpose of publishing prebuilt packages to CIPD is for Fuchsia’s CI system to fetch your most recent prebuilt packages from CIPD for global integration.
Note: CIPD is not a package repository for Fuchsia devices. A running Fuchsia device doesn't install prebuilt packages from CIPD.
Both Fuchsia and CIPD have the notion of a package. The differences between a prebuilt package and a CIPD package are:
Updating the content of a CIPD package creates a new instance of the CIPD package. Every CIPD package maintains the history of its instances (see Figure 1 below).
To publish your prebuilt packages to CIPD, see Publish a CIPD package below.
Additionally, if your CIPD package contains ELF binaries{: .external}, see Publish a CIPD package with unstripped ELF binaries below.
Fuchsia has the following requirements for a CIPD package:
Use the following naming convention:
<PROJECT>/fuchsia/<PACKAGE>-<ARCHITECTURE>
For example, chromium/fuchsia/webrunner-arm64{: .external} and chromium/fuchsia/castrunner-amd64{: .external}.
Include a LICENSE
file that contains the legal notices of the software.
Provide a Fuchsia archive (FAR) file per prebuilt package. For example, chromium.far
, webrunner.far
.
Tag{: .external} each instance with a version identifier in the form of:
version:<VERSION_ID_OF_INSTANCE>
For example, version:77.0.3835.0
and version:176326.
Create a ref{: .external} labeled latest
and point it to the most recent instance of your CIPD package.
Fuchsia developers need to be able to identify which source code is used to generate an instance of the CIPD package based on the version identifier of the instance. Fuchsia recommends that in your project’s documentation you provide instructions on how to obtain an instance’s source code.
When you publish a new instance of your CIPD package, you need to update the latest
ref so that it now points to the new instance. Fuchsia’s CI system monitors your package’s latest
ref; when the CI system detects that the latest
ref is updated, it fetches the new package and rolls it into Fuchsia.
The following example shows the content of a CIPD package:
LICENSE chromium.far webrunner.far
If your CIPD package contains ELF binaries{: .external} (executables and shared libraries), you need to publish a CIPD package that contains the unstripped versions of those ELF binaries. The unstripped ELF binaries allow Fuchsia developers to debug your software. For example, the unstripped ELF binaries enable symbolizing stack traces.
Typically the owner of prebuilt packages publishes a sibling CIPD package for the unstripped ELF binaries per architecture, in addition to publishing a CIPD package that contains the prebuilt packages. To allow these CIPD packages to be rolled together, the instances of these CIPD packages must share the same version identifier tag{: .external}.
Fuchsia requires a CIPD package with unstripped ELF binaries to have the following directory structure:
.tar.bz2
file per prebuilt package..tar.bz2
file, once uncompressed and unpacked, is a .build-id
directory.Note: Don't include a directory named .build-id
as a root directory in the .tar.bz2
file. The unpacked content of the .tar.bz2
file is a collection of subdirectories (see the example below).
.build-id
directory has subdirectories and the subdirectories contain unstripped ELF binaries.build-id
(see the example below).Fuchsia requires the following requirements for an unstripped ELF binary:
debug
extension, which indicates that the binary contains DWARF debug information.build-id
for the name of the subdirectory and the rest of the build-id
for its filename. For example, if build-id
is 1dbca0bd1be33e19
, then its subdirectory name is 1d
and its unstripped ELF binary filename is bca0bd1be33e19.debug
.NT_GNU_BUILD_ID
note (obtained by passing the -build-id
flag to the linker).-g
flag to the compiler).This example shows the directory structure of a CIPD package with unstripped ELF binaries:
chromium.symbols.tar.bz2 1d/ bca0bd1be33e19.debug 2b/ 0e519bcf3942dd.debug 5b/ 66bc85af2da641697328996cbc04d62b84fc58.debug webrunner.symbols.tar.bz2 1f/ 512abdcbe453ee.debug 90dd45623deab1.debug 3d/ aca0b11beff127.debug 5b/ 66bc85af2da641697328996cbc04d62b84fc58.debug