Woow, long one really. Ok, I think the idea is really good. Of course a lot
of work. I as a maintainer of a gnome desktop version for Slackware would
like to ask how this would handle the distros which do not use systemd ?

Rgds
Saxa
www.droplinegnome.org

On Tue, Apr 25, 2017 at 4:38 PM, Tristan Van Berkom <
tristan.vanber...@codethink.co.uk> wrote:

> TL;DR: We are working to improve build tooling for GNOME software
> development, and
>        are very interested in GNOME developer community feedback on the
> BuildStream
>        approach we are taking, and how to achieve a successful transition.
>
>
> Hi all,
>
>     By now many participants of this list are already aware of our efforts
> on
> the BuildStream tooling from reading my blog posts ([0] and [1]), which we
> aspire
> to use in GNOME to improve GNOME's developer experience as well as
> improving the
> process around maintaining GNOME releases.
>
> At this time I would like to start a more open conversation about our
> plans,
> ensure that we are all aligned on what the best approach should be for
> building
> GNOME and also look at how we can implement a better build story for GNOME,
> hopefully over the following months.
>
> There is a lot to say here as it's a big topic, so to structure this a bit,
> I'll talk about:
>
>   o What are the existing use cases of building GNOME ?
>     o What are the pain points related to these use cases ?
>   o How do we plan to address these pain points using BuildStream ?
>   o How would we implement BuildStream in GNOME with a smooth transition ?
>
>
> What are the existing use cases of building GNOME ?
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>   o A developer uses JHBuild to build and hack on parts of
>     GNOME on their local laptop or desktop machine, which
>     can be any linux distro.
>
>     Pain Points:
>
>     * Non deterministic set of dependencies cause builds to fail in
>       random unpredictable ways, which can be off putting for newcomers
>       and also an annoyance to seasoned developers who want to fix some
>       specific bug, but get caught up fixing other bugs instead.
>
>     * It's difficult to debug core components such as the interactions
>       of gnome-keyring, Linux-PAM, GDM, GNOME Session, GNOME Shell.
>
>       Manual tinkering is needed, you either need a separate machine or
>       a VM you've setup manually to recreate login scenarios and
>       gnome-initial-setup scenarios, ensuring a seamless handoff to the
>       initial user with their online accounts setup and all of this.
>
>   o The release team needs to build and publish GNOME releases
>
>     Pain Points:
>
>     * Non deterministic dependencies again make things unclear as to
>       what exactly we are releasing.
>
>       E.g., we might know that this vector of GNOME module versions
>       work well on some specific distro it has been tried with, but
>       we can't know for sure that the result of a JHBuild of GNOME
>       will behave the same on any person's distro.
>
>       By the same logic, it becomes difficult as time passes to
>       build older releases of GNOME in the future on more modern
>       dependency sets.
>
>     * Current tooling does not allow for any distinction from
>       a specific version of something (be it a commit sha in a git
>       repository or a specific tarball), and a symbolic branch name.
>
>       With JHBuild (or flatpak-builder for that matter), you must
>       either specify a symbolic branch, or a specific commit.
>
>       To advertise a specific release involves a lot of tedious
>       editing of build metadata to communicate new versions of a stable
>       or development release set manually.
>
>   o The Flatpak maintainers currently maintain their own set
>     of build metadata to build the GNOME SDK and runtime.
>
>     Pain Points:
>
>     * Arguably the flatpak maintainership should not be accountable
>       for maintaining the GNOME Runtime and SDK builds. I think we
>       mostly agree by now that it would be great to have the GNOME
>       release team have control of their own flatpak builds.
>
>       There is however a large overlap of libraries and tooling
>       which must appear in the GNOME Runtimes/SDKs and must also
>       appear on an operating system running GNOME (libraries and
>       services to support the display manager, the shell,
>       the session, control center, etc.).
>
>       Maintaining these sets of build metadata in separate formats
>       and separate repositories is both burdensome and error prone:
>       releases are not communicated atomically and nothing guarantees
>       that GNOME 3.24 moduleset versions and GNOME 3.24 flatpak runtime
>       versions coincide at all times.
>
>   o Application module maintainers need to either build Flatpaks
>     of their module or at least provide some flatpak-builder json
>     for a third party to build it on your behalf.
>
>     Pain Points:
>
>     * Here there is not much in terms of pain points for the author
>       of a Flatpak application. As long as the only bundled format
>       your application wants to support is Flatpak, you'll only
>       need to maintain one set of build metadata.
>
>   o The CI story of building GNOME on automated build machines.
>
>     Pain Points:
>
>     * Here again the problem of maintaining multiple sets of
>       build metadata in various formats comes up for the release team.
>
>       We should ideally be using the same build metadata for building
>       GNOME releases as we do for CI.
>
>
> How do we plan to address these pain points using BuildStream ?
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>
>   For Developers
>   ~~~~~~~~~~~~~~
>   First off, BuildStream never allows the build to be contaminated
>   by host dependencies or tooling in any way. This means that for a given
>   GNOME release moduleset, every developer will be using exactly the same
>   set of dependencies and the same tools to build with; any and all
> failures
>   perceived by one developer will be reproducible by any other developer
>   regardless of what is installed on their host.
>
>   Secondly, in addition to being able to quickly setup a shell environment
>   and test application code inside a sandbox (similar to how people
> generally
>   use jhbuild), we will also by default provide some build metadata to
> allow
>   users to easily spin up a full VM of GNOME. This means developers can
> more
>   easily test their components against a fully assembled GNOME environment
>   with the latest master or latest stable of everything in GNOME, also it
> will
>   become a lot easier to hack on core components which deal with the login
>   scenario (i.e. GNOME Session, GDM, GNOME Keyring etc).
>
>   We care a lot about the developer experience, so our aim is to achieve
>   a comfortable developer experience for dealing with build failures and
>   to accelerate your edit/compile/test cycles. We hope that the user will
>   be able to modify a line of code in glib, and have a new booting VM of
>   a fully functional GNOME system to test within minutes.
>
>
>   For the Release Team
>   ~~~~~~~~~~~~~~~~~~~~
>
>
>     Deterministic builds
>     ~~~~~~~~~~~~~~~~~~~~
>     There are a few ways that the GNOME Release story can also be improved
>     by using a virtually entirely deterministic build system.
>
>     o We always know that what is released by GNOME is entirely
> reproducible
>       by anyone who wants to try a release of GNOME.
>
>     o We have much stronger provenance information about not only what
>       dependencies were chosen to build GNOME on top of, but also how
>       they were built, when compared to the minimal bound dependency model
>       we have where JHBuild interrogates the host for a 'sysdep'
>
>       We expect that this will be a great help to any distributions who
>       wish to integrate GNOME. By examining our own complete reference
> builds
>       it becomes easier to identify integration bugs both on GNOME's side
> and
>       on the given supporting distro's side.
>
>     o All GNOME releases or "reference builds", become entirely repeatable
>       in the future. This should mean that using build metadata to build
>       the entire GNOME 3.24.X and create a bootable image should produce
>       exactly the same thing in 2017 as it will in 2027
>
>
>     Tracking latest branch
>     ~~~~~~~~~~~~~~~~~~~~~~
>     Beyond deterministic builds and repeatability, I should also point out
>     the `bst track` feature which automates the update of a specific
> revision
>     from a symbolic tracking name (usually a branch).
>
>     So in BuildStream, Source plugins[2] are what import external data in
> the
>     pipeline, usually for the purpose of building, and usually Sources
> represent
>     VCSes or some other means for obtaining external data. Every different
> kind
>     of Source may be attributed both "ref" and "track" attributes:
>
>       o ref: A reference to an exact version, every time the same "ref" is
> used,
>              the imported data should be bit for bit identical as the last
> time.
>
>       o track: A symbolic name which the plugin can use to update "ref",
> usually
>                this is a branch name for a VCS.
>
>     For the purpose of running `bst build`, all involved sources must have
> a "ref"
>     already resolved (using git for instance, this means ensuring there
> are commit
>     shas specified for every module you will build). However, as long as
> modules
>     also specify a "track" attribute, their refs can be updated by
> invoking `bst track`.
>
>     We expect this can save time for a release team member who might want
> to
>     use the following kind of workflow:
>
>       o Branch the GNOME moduleset repository for a given stable release,
> or
>         use master branch for current dev.
>
>       o Manually specify only the appropriate branch names for each module
>         in the major point release (e.g.: all GNOME 3.24 branches).
>
>       o Periodically make a release:
>
>         - Checkout the appropriate modulesets branch locally
>         - run `bst track` on the whole pipeline, automatically updating
> the commit shas
>         - run `bst build` and make sure it at least builds
>         - git commit the modulesets with the `bst track` results, probably
> with
>           a commit message mentioning the release of GNOME "3.24.4" for
> example
>
>     Coincidentally, a lot of the above is also interesting for a CI setup
> where
>     a build machine would:
>
>       o Checkout the appropriate modulesets branch locally
>       o run `bst track` on the whole pipeline, automatically updating the
> commit shas
>       o run `bst build` and any additional tests on the result
>       o report any failures
>       o if the build succeeds, branch, commit and push a release candidate
> branch
>         for human review
>
>
>     Build Variants
>     ~~~~~~~~~~~~~~
>     Ideally soon, will come a time where the GNOME release team will be
> responsible
>     for rolling out the GNOME Flatpak SDKs in addition to the regular
> release
>     metadata.
>
>     This basically means for GNOME as a whole, we will start to have
> numerous
>     "build plans"
>
>        Plan A
>        ~~~~~~
>        - Stage a deterministic and bootable base system
>          (ideally produced by a third party distro)
>        - Build GNOME platform libraries on top of that
>        - Build GNOME core modules and services like GDM
>        - Deploy a bootable disk image
>
>        Plan B
>        ~~~~~~
>        - Stage a deterministic flatpak SDK: freedesktop-sdk-images
>        - Build some dependencies not provided by freedesktop-sdk-images
>        - Build GNOME platform libraries on top of that
>        - Filter and separate parts of the output (the Debug, SDK and
> Locale)
>        - Deploy these separated results to an ostree repo, i.e. a Flatpak
> Runtime & SDK
>
>     Our view is that the above two "build plans" can be described in the
> same
>     build metadata (or "BuildStream project"), and that modifying the
> upstream
>     GNOME build metadata in one place should immediately be reflected in
> any
>     builds of either Flatpak runtimes or GNOME bootable images.
>
>     Our vehicle for achieving this is called "variants", the semantics of
>     "variants" are described in more detail in the documentation[3]. There
> are various
>     ways to achieve configurability in build systems, however we have
> found that:
>
>       o In build systems which treat every configuration as a "variable"
>         and then allow build scripts to make conditional statements on
>         any variable, we arrive at a combinatorial explosion of complexity
>         where the project as a whole is virtually impossible to validate
>         since it purports to support a staggering number of possible
>         configurations (think of the buildroot configuration system
>         or gentoo's "use flags").
>
>       o In build systems which avoid this configurability, we end up
> duplicating
>         the same metadata in cases where one module can be built in more
> than
>         one way, and so we have a lot more metadata to maintain.
>
>     Our concept of "variants" is the compromise, every element may itself
>     advertise a fixed number of named configurations which it supports and
>     consequently reduces the number of supported configurations.
> Conversely,
>     one may depend on an element in such a way that is ambivalent of the
>     variant, which avoids the need for duplication of any build metadata.
>
>     Long story short, we have a very nice plan to allow GNOME to maintain
>     a tree of build metadata which produces both Flatpak runtimes and
> bootable
>     GNOME systems from the same metadata and software, demonstrating this
>     is next on our milestones.
>
>
>   For CI
>   ~~~~~~
>   Here I am unsure what the best way forward is for CI in GNOME. Clearly
>   we want to be running installed tests and whatever other tests we can
>   run on a booted GNOME disk image, and clearly we dont want to maintain
>   separate sets of build metadata to do any of this.
>
>   We may want to repurpose the existing GNOME continuous framework to
>   just replace the build procedure with a BuildStream build of the GNOME
>   release metadata. Alternatively, I think that running a gitlab instance
>   for the CI cases may get us something superior as we can leverage
>   a lot of gitlab features and maybe even offer an opt-in pre-merge CI
>   experience for participating GNOME projects.
>
>   Further than this, I should mention there is some movement to implement
>   Source plugins to represent distro packaging sources, e.g. the dpkg
>   source plugin[4]. With this plugin in place, I suspect it will be
>   very easy to run tests of building and running GNOME against various
>   third party distributions and versions of those. Imagine we could have
>   a board somewhere which displays which distributions GNOME builds on
>   without failing tests (we could always know when GNOME master is failing
>   against debian sid, or latest fedora, etc).
>
>
>
> How would we implement BuildStream in GNOME with a smooth transition ?
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Ideally we would like to demonstrate all of this working in a side branch
> of the GNOME release modulesets, without being disruptive or calling for
> a flag day where everyone needs to switch over atomically.
>
> While we were able to achieve something close to that for the Baserock
> project which now has some automation to build converted BuildStream
> projects beside the YBD tooling, the situation for GNOME is a bit more
> complex since we already have two important sources to convert from (the
> gnome-sdk-images repository and the release team's JHBuild modulesets).
>
> So, I'm testing the water in advance to see how the community feels
> about this plan in general, and also to gather opinions on what exactly
> we should be doing next.
>
> This is not the whole roadmap[5], but what I have on the menu specifically
> for the cases of building GNOME and satisfying GNOME related requirements,
> which is my top priority for the next months and listed in the order I
> would currently have them done:
>
> What we have on the menu right now, in the order I would have them done:
>
>   o Complete the Source implementations needed for Flatpak JSON (almost
> done,
>     bzr is supported by flatpak-builder and we need only add some more
> tests
>     to merge bzr support in BuildStream)
>
>   o Complete the Source implementations needed for converting JHBuild
>     modulesets (I think we will only need svn to complete this list,
> possibly
>     but hopefully not cvs or hg).
>
>   o Experiment with Flatpak deployments
>
>     Most of what BuildStream will have to do to generate Flatpak output for
>     runtimes and applications is straight forward, just building into some
> custom
>     prefixes and encoding some metadata files for Flatpak to read.
>
>     Looking through flatpak-builder code however there are some
> customizations
>     like post-install manipulation of build output specifically for the
> locale
>     data to end up where Flatpak wants it to be.
>
>   o Create conversion script for JHBuild modulesets.
>
>     Here I would by default use a debian base system to build on top of if
>     the development of the dpkg plugin[4] works soon. Then I would create
>     a script which parses the JHBuild XML and outputs a BuildStream
> project.
>
>     This is going to need some additional static supporting metadata:
>
>     - We will need to maintain a list of modules (or 'elements') which
> should
>       be built for the GNOME Flatpak SDK/Runtime but not for the GNOME
> Releases,
>
>       E.g. non-GNOME dependencies which need to be added to the runtime
> but are
>       not necessarily provided by the freedesktop runtime.
>
>     - Conversely, we need the list of things to be included in GNOME
> Releases
>       but are not built in the GNOME Flatpak runtime/SDK.
>
>       E.g. core GNOME components such as gdm and gnome-session
>
>     With this script in place, we should be able to continuously produce
> GNOME
>     releases which boot in a VM, and also produce the GNOME SDK/runtimes
> for Flatpak
>     without requiring a "flag day" to switch over.
>
>   o Developer Experience
>
>     The developer experience needs work before I can confidently say that
> it
>     can replace JHBuild for the regular day to day requirements of
> developers.
>
>     What we absolutely need for this is:
>
>       o Developer Workspaces[6]
>
>         These will allow the developer to override a Source plugin in their
>         local checkout of the GNOME release metadata, so that for example,
>         you build everything directly from gits or tarballs, but you build
>         gedit from a local directory of your choosing.
>
>       o Dual Cache Key Modes[7]
>
>         The shape of this might change a bit, but the gist of it is that
>         in a release setting, one wants to be sure that everything was
> rebuilt
>         in the case that any of its dependencies have changed (this is
> currently
>         the default for calculating whether something needs to be rebuilt).
>
>         In a developer setting however, you want to go all the way down to
>         glibc (or lets say glib) and add one printf() statement, or change
> a line
>         of code, and then you want to rebuild only glib and start some
> application
>         or run a fresh new VM with that modified glib, without rebuilding
> the
>         whole world to get there.
>
>         These two scenarios are obviously at odds with eachother so we
> will want
>         some user configuration to make the decision of what to build and
> when.
>
>     In addition to the above, it will be nice to also tie up:
>
>       o Artifact Cache Sharing[8]
>
>         Authenticated users or CI machines should be able to upload the
>         results of individual builds. In this way when a developer wants
>         to hack on a given module, they really only need to build the
>         module(s) they are concerned with but can reuse (download) the
> build
>         results of any other builds, provided those were built once and
>         uploaded to an artifact share.
>
>   o CI Investigation and implementation
>
>     I prefer to keep this as the last piece of the puzzle, as stated above
>     it's quite possible that we discover more powerful ways to leverage CI
>     using gitlab, or it may be that refactoring current GNOME Continuous to
>     build with the same build metadata maintained by the release team is
>     the way to go.
>
>     In either case I think the requirements here are:
>
>       o Use the same metadata as release team, not a separate format/repo
>
>       o Should be easily repeatable. As in anyone should be able to setup
>         a new instance to run CI on GNOME in their home by following some
>         steps in a README somewhere, ideally this should not take all day
>         and it should be reliably repeatable.
>
>       o Should not have any regressions over the current solution. Which
>         means installed-tests should run, some screenshots proving a booted
>         system and some apps, fast build times preferred over rebuilding
>         everything on every dependency change.
>
>     Asides from the above, it will be nice to:
>
>       o Have also full builds run (i.e. rebuilds of anything with a
>         changed dependency)
>
>       o Have CI builds contribute to a shared artifact cache which users
>         can tap into in order to save cycles on their own machines.
>
>
> In Closing
> ~~~~~~~~~~
> I am of course very excited about what we can accomplish and I very much
> hope that you will share in my enthusiasm.
>
> Does this look like a lot of work to do ? Yes it does, however there is
> already a great deal of work done and momentum is on our side. Thanks to
> Codethink sponsoring this project, we also fully expect to have budget to
> work on this full time for some months to come, so I'm confident that we
> can deliver on our promises.
>
> Feedback and involvement in any form are greatly appreciated, are
> there parts of the picture you think we've missed ? Please reply and
> tell us about them :)
>
> Any questions about what we have created so far and how it works ? Please
> reply and ask about these !
>
> Best Regards,
>     -Tristan
>
>
> [0]: https://blogs.gnome.org/tvb/2017/02/06/introducing-buildstream-2/
> [1]: https://blogs.gnome.org/tvb/2017/04/10/buildstream-
> progress-and-booting-images/
> [2]: https://buildstream.gitlab.io/buildstream/#sources
> [3]: https://buildstream.gitlab.io/buildstream/format.html#
> variant-conditionals
> [4]: https://gitlab.com/BuildStream/buildstream/issues/10
> [5]: https://wiki.gnome.org/Projects/BuildStream/Roadmap
> [6]: https://wiki.gnome.org/Projects/BuildStream/Roadmap/Workspaces
> [7]: https://wiki.gnome.org/Projects/BuildStream/Roadmap/CacheKeyModes
> [8]: https://wiki.gnome.org/Projects/BuildStream/Roadmap/ArtifactSharing
> _______________________________________________
> desktop-devel-list mailing list
> desktop-devel-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/desktop-devel-list
>
_______________________________________________
desktop-devel-list mailing list
desktop-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/desktop-devel-list

Reply via email to