shaka-packager/.github/workflows
Joey Parrish 052fb64068
ci: Enable parallel builds (#1241)
Our workflows and Dockerfiles now use Ninja on Linux & Mac, which
enables safe parallel builds. This significantly speeds up our
workflows.

GitHub Actions typical compilation times (build step only):
 - Linux 19m => 9m
 - macOS 23m => 8m
 - Windows 12m => 10m
 - Linux arm64 (self-hosted) 72m => 29m
 - Docker build 25m => 14m

Overall workflow time: 84m => 33m

Compilation time on my workstation (12 CPUs @3.3GHz): 15m => 3m

This also adds a new environment variable "PACKAGER_LOW_MEMORY_BUILD".
If defined when CMake is first run, this will configure the build to
disable parallel linking to reduce memory usage. This helps us avoid
failures on our self-hosted arm64 machines, where 6 CPUs share 4GB of
RAM.

NOTE: Parallel builds are **NOT** recommended with Unix Makefiles due to
the use of excessive RAM during parallel linking. Unix Makefiles, unlike
Ninja, cannot be configured to restrict parallel linking during a
parallel build. Anecdotally, parallel builds with Makefiles have
exhausted a system with 32GB RAM. (My workstation.)

In a follow-up, I will update the build documentation to refer to CMake
and recommend all of the flags now used in our workflows.
2023-07-17 13:16:03 -07:00
..
README.md ci: Fix repo settings for self-hosted runners and debugging (#1110) 2022-10-25 08:53:45 -07:00
build-docs.yaml ci: Fix repo settings for self-hosted runners and debugging (#1110) 2022-10-25 08:53:45 -07:00
build-matrix.json ci: Enable parallel builds (#1241) 2023-07-17 13:16:03 -07:00
build.yaml ci: Enable parallel builds (#1241) 2023-07-17 13:16:03 -07:00
docker-hub-release.yaml fix: Fix protoc linking on macOS w/ update to fork (#1132) 2022-11-04 08:33:01 -07:00
docker-image.yaml fix: Fix protoc linking on macOS w/ update to fork (#1132) 2022-11-04 08:33:01 -07:00
github-release.yaml chore: Mass-update copyright headers (#1086) 2022-08-26 08:44:59 -07:00
lint.yaml chore: Mass-update copyright headers (#1086) 2022-08-26 08:44:59 -07:00
npm-release.yaml chore: Mass-update copyright headers (#1086) 2022-08-26 08:44:59 -07:00
pr.yaml ci: Fix repo settings for self-hosted runners and debugging (#1110) 2022-10-25 08:53:45 -07:00
settings.yaml ci: Fix repo settings for self-hosted runners and debugging (#1110) 2022-10-25 08:53:45 -07:00
sync-labels.yaml chore: Sync common workflows (#1120) 2022-10-27 11:20:43 -07:00
test-linux-distros.yaml fix: Fix protoc linking on macOS w/ update to fork (#1132) 2022-11-04 08:33:01 -07:00
update-docs.yaml chore: Mass-update copyright headers (#1086) 2022-08-26 08:44:59 -07:00
update-issues.yaml chore: Sync common workflows (#1120) 2022-10-27 11:20:43 -07:00
validate-pr-title.yaml chore: Sync common workflows (#1037) 2022-02-25 10:12:44 -08:00

README.md

GitHub Actions CI

Reusable workflows

  • build.yaml: Build and test all combinations of OS & build settings. Also builds docs on Linux.

  • build-docs.yaml: Build Packager docs. Runs only on Linux.

  • docker-image.yaml: Build the official Docker image.

  • lint.yaml: Lint Shaka Packager.

  • test-linux-distros.yaml: Test the build on all Linux distros via docker.

Composed workflows

  • On PR (pr.yaml), invoke:

    • lint.yaml
    • build.yaml
    • build-docs.yaml
    • docker-image.yaml
    • test-linux-distros.yaml
  • On release tag (github-release.yaml):

    • Create a draft release
    • Invoke:
      • lint.yaml
      • build.yaml
      • test-linux-distros.yaml
    • Publish the release with binaries from build.yaml attached
  • On release published:

    • docker-hub-release.yaml, publishes the official Docker image
    • npm-release.yaml, publishes the official NPM package
    • update-docs.yaml:
      • Invoke build-docs.yaml
      • Push the output to the gh-pages branch

Common workflows from shaka-project

  • sync-labels.yaml
  • update-issues.yaml
  • validate-pr-title.yaml

Required Repo Secrets

  • DOCKERHUB_CI_USERNAME: The username of the Docker Hub CI account
  • DOCKERHUB_CI_TOKEN: An access token for Docker Hub
  • DOCKERHUB_PACKAGE_NAME: Not a true "secret", but stored here to avoid someone pushing bogus packages to Docker Hub during CI testing from a fork
    • In a fork, set to a private name which differs from the production one
  • NPM_CI_TOKEN: An "Automation"-type access token for NPM for the shaka-bot account
  • NPM_PACKAGE_NAME: Not a true "secret", but stored here to avoid someone pushing bogus packages to NPM during CI testing from a fork
    • In a fork, set to a private name which differs from the production one

Repo Settings

Each of these workflow features can be enabled by creating a "GitHub Environment" with the same name in your repo settings. Forks will not have these enabled by default.

  • debug: enable debugging via SSH after a failure
  • self_hosted: enable self-hosted runners in the build matrix