Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[build][quality] more efficient CI, builds, improved linter config #272

Merged
merged 3 commits into from
Aug 11, 2023

Commits on Aug 7, 2023

  1. [build][Jenkins] more efficient Jenkins CI, builds, improved linter c…

    …onfig
    
    This is a significant refactoring of the repo and CI.
    
    1) Jenkins CI: more efficient, quicker builds
    
    I propose that we adopt a "run often, run quickly" approach to our Jenkins CI.
    ATM we mostly run Jenkins when it's time to release new Blueprint installers
    (when a PR is merged on master). The other case is if "jenkins" is detected
    in the PR branch or PR title, then almost a full Jenkins build is done, just
    stopping short of publishing new Blueprint installers (full signing and
    notarization is done, which can take a couple of hours).
    
    I made it so we run a very light version of the Jenkins CI by default, that
    builds the "dev" version of the app and pre-packages it using electron builder,
    generating a directory that contains the app but no installers.
    
    We really ought to run tests then, on the unpacked pre-packaged app, but
    it will need to be done separately. Until then, we do not require the built-in
    extensions (plugins), so I gave openvsx.org a rest and skip fetching them, by
    default.
    
    When it's detected that the Jenkins CI is processing the result of a merge on
    master or if the new "release dry-run" mode is enabled [1], a production version
    of the Blueprint apps will be produced, including built-in plugins, which will
    then be packaged for "real", producing genuine OS-specific installers, signed
    and notarized as required. This will take a lot longer to run, of course, but
    may be required only a minority of the time.
    
    Conclusion: with this PR, running Jenkins CI now takes about 12 minutes, and
    since this is relatively quick, we can afford to run this when any PR branch
    is created or updated.
    
    Running the same CI in "release dry-run mode" takes about an hour. A release
    will take longer, a bit over an hour, since additional steps are executed,
    like copying the various installers to a release folder.
    
    [1] About the "release dry-run" mode, it can be enabled in JenkinsFile,
    "pipeline" definition near the top, in "environment":
      BLUEPRINT_JENKINS_RELEASE_DRYRUN = 'true'
    
    I wish I found a better mechanism to enable this "release dry-run" mode. But
    this will serve for now. The "release dry-run" mode should be disabled before
    merging a PR to master, but can in the meantime be used to test or troubleshoot
    the whole pipeline, in particular signing and notarizing.
    
    2) tsconfig/eslint configs:
    
      Added configs, to improve linter coverage. This made it possible for some
      source files, not previously covered, to get ts/linter feedback, both while
      editing and when running `yarn lint`. This will help keep code in-line with
      our standards. The config is not perfect and I would welcome further
      improvements. But for now I think it's a nice improvement.
    
    3) Build "scripts" (package.json)
    
    Refactored the build commands ("scripts" section in package.json)
    
    - previously, merely running 'yarn" in the repo's root would rebuild
      every application from scratch. This prevents running a quick
      "yarn install", e.g. just to re-install build dependencies
    - the new version permits a granular build, with simple defaults
    - inspired from a similar change not so long ago in the main repo
    - see updated README for some examples
    
    Other misc items:
    
    - renamed extensions / applications
    - made the browser application a first class citizen, equal to the
      Electron application
    - all applications now share a common 'plugins' folder rather than
      each having their own. Moved the plugin-related entries to root
      package.json
    - to gain flexibility about which `yarn workspaces` are invoked for a
      given `lerna` command, using the `--scope=` CLI option.I renamed the
      repo's extensions and applications. This permits easily composing
      commands that target only the extensions or only the applications.
      e.g.:
    
      ``` json
      "build:extensions": "lerna run --scope=\"blueprint*ext\" build",
      "build:applications": "lerna run --scope=\"blueprint*app\" build --concurrency 1","
      ```
    
    - renamed the extensions folders, made them more straightforward
    - For systems with limited RAM, like on a Raspberry Pi 4B board with 4GB of RAM,
      it's now possible to successfully build Blueprint. e.g. use the following cmd:
      `yarn && yarn build:dev`, optionally followed by a packing command like:
      `yarn electron package`
      - (build:dev will build the Blueprint app in dev mode, which can be achieved
        in 4GB RAM)
    - [windows][jenkins] stash only dist folder: Currently, and only for Windows,
      we stash the whole git repo, which is very big and takes long to stash and
      un-stash. For the other OS, we only stash the dist folder, that contains the
      platform-specific installer, that we built. Let's try that for Windows too,
      and see if it works.
    - [jenkins] Decrease timeout from 5h to 3h" Looking at the build history, all
      recent builds that succeeded, did do under 2h30. OTOH, when a build hangs,
      it needs to wait for the timeout to expire, wasting time at the current value
      of 5h. Let's compromise at 3 hours and see how it goes?
    - [jenkins][installer build] exclude browser app for now: We do not yet publish
      the browser app, so let's skip building it to save time/resources. We may
      revisit when we use the new browser app bundling, recently made available
      upstream in the Theia framework.
    
    Signed-off-by: Marc Dumais <marc.dumais@ericsson.com>
    marcdumais-work committed Aug 7, 2023
    Configuration menu
    Copy the full SHA
    dc3a4bf View commit details
    Browse the repository at this point in the history
  2. [prod build] add rebuild

    #272 (review)
    
    Signed-off-by: Marc Dumais <marc.dumais@ericsson.com>
    marcdumais-work committed Aug 7, 2023
    Configuration menu
    Copy the full SHA
    d708d26 View commit details
    Browse the repository at this point in the history
  3. [browser.dockerfile] Fixed build issue

    Oops - I had forgotten to build the Theia extensions, which caused a
    problem at runtime.
    
    Signed-off-by: Marc Dumais <marc.dumais@ericsson.com>
    marcdumais-work committed Aug 7, 2023
    Configuration menu
    Copy the full SHA
    f462d26 View commit details
    Browse the repository at this point in the history