tree: a01c357bb5f45cc2746946a16e2e6693aeae37cc [path history] [tgz]
  1. .vscode/
  2. api/
  3. bin/
  4. cbuildbot/
  5. cidb/
  6. cli/
  7. config/
  8. contrib/
  9. cros/
  10. cros_bisect/
  11. docs/
  12. infra/
  13. lib/
  14. licensing/
  15. scripts/
  16. sdk/
  17. service/
  18. signing/
  19. ssh_keys/
  20. test/
  21. third_party/
  22. utils/
  23. venv/
  24. .dir-locals.el
  25. .env
  26. .gitignore
  27. .style.yapf
  28. .vpython
  29. __init__.py
  30. AUTHORS
  31. codereview.settings
  32. conftest.py
  33. LICENSE
  34. navbar.md
  35. OWNERS
  36. OWNERS.au
  37. OWNERS.build
  38. OWNERS.chrome
  39. OWNERS.ci
  40. OWNERS.kernel
  41. OWNERS.testplatform
  42. PRESUBMIT.cfg
  43. PRESUBMIT.py
  44. pylintrc
  45. pytest.ini
  46. README.chromium
  47. README.md
  48. run_pytest
  49. run_tests
  50. unblocked_terms.txt
README.md

Chromite Development: Starter Guide

This doc tries to give an overview and head start to anyone just starting out on Chromite development.

Background

Before you get started on Chromite, we recommend that you go through ChromeOS developer guides at external (first) and then goto/chromeos-building for internal. The Gerrit starter guide may also be helpful. You should flash a built image on a test device (Ask around for one!).

Chromite was intended to be the unified codebase for anything related to building ChromeOS/ChromiumOS. Currently, it is the codebase responsible for several things including: building the OS from the requisite packages for the necessary board (parallel_emerge), driving the infrastructure build workflow (CBuildBot), hosting a Google App Engine App, and providing utility functions for various scripts scattered around ChromeOS repositories. It is written for the most part in Python with some Bash sprinkled in.

Directory Overview

You can use Code Search to lookup things in Chromite or Chromium OS in general.

Non-public code has a separate internal Code Search site. It's organized into different “repositories”, and we have two: “Chrome OS - Internal” (only internal repositories) & “Chrome OS - Public” (only public repositories). You can add a search query for a single combined view (public & private) in the Saved Queries settings page. Use the query package:^chromeos_(internal|public)$. NB: The “Chrome OS - Public” repository is exactly the same as the public source.chromium.org site.

chromite/api

The Chromite API for the CI system. The API exposes a subset of the chromite functionality that needs to be strictly maintained as much as possible.

chromite/cbuildbot

CBuildBot is the collection of entire code that runs on both the parent and the child build machines. It kicks off the individual stages in a particular build. It is a configurable bot that builds ChromeOS. More details on CBuildBot can be found in this tech talk (slides).

chromite/cbuildbot/builders

This folder contains configurations of the different builders in use. Each has its own set of stages to run usually called under RunStages function. Most builders used regularly are derived from SimpleBuilder class.

chromite/cbuildbot/stages

Each file here has implementations of stages in the build process grouped by similarity. Each stage usually has PerformStage as its primary function.

chromite/docs

Additional documentation.

chromite/lib

Code here is expected to be imported whenever necessary throughout Chromite.

chromite/scripts

Unlike lib, code in scripts will not and should not be imported anywhere. Instead they are executed as required in the build process. Each executable is linked to either wrapper.py or virtualenv_wrapper.py. Some of these links are in chromite/bin. The wrapper figures out the directory of the executable script and the $PYTHONPATH. Finally, it invokes the correct Python installation by moving up the directory structure to find which git repo is making the call.

chromite/service

These files act as the centralized business logic for processes, utilizing lib for the implementation details. Any process that's implemented in chromite should generally have an entry point somewhere in a service such that it can be called from a script, the API, or anywhere else in lib where the process may be useful.

chromite/third_party

This folder contains all the third_party python libraries required by Chromite. You need a very strong reason to add any library to the current list. Please confirm with the owners beforehand.

chromite/utils

This folder contains smaller, generic utility functionality that is not tied to any specific entities in the codebase that would make them more at home in a lib module.

chromite/infra

This folder contains the chromite-specific infra repos.

chromite/test

This folder contains test-only utilities and helper functions used to make writing tests in other modules easier.

chromite/*

There are smaller folders with miscellaneous functions like config, licencing, cidb, etc.

Testing your Chromite changes

Before any testing, you should check your code for lint errors with:

$ cros lint <filename>

Unit Tests

Chromite now uses pytest for running and writing unit tests. All new code & tests should be written with the expectation to be run under pytest.

Pytest is responsible for running unit tests under Python 3, with the legacy unit test runner scripts/run_tests responsible for running unit tests under Python 2.

Running Chromite's unit tests

Chromite has two unit test runners: scripts/run_pytest and scripts/run_tests, and two top-level entry points to the unit test suite: run_pytest and run_tests.

Every Python file in Chromite is accompanied by a corresponding *_unittest.py file. Running a particular file's unit tests is best done via

~/trunk/chromite $ ./run_pytest example_file_unittest.py

scripts/run_pytest

This script initializes a Python 3 virtualenv with necessary test dependencies and runs pytest inside that virtualenv over all tests in Chromite, with the configuration specified in pytest.ini. The default configuration runs tests in parallel and skips some tests known to be flaky or take a very long time.

scripts/run_tests

This script was the unit test runner prior to Chromite transitioning to using pytest. It is responsible for running unit tests under Python 2 while Chromite is in the process of migrating to Python 3. Once Chromite runs under Python 3 only, this script will be deprecated and removed.

Tests will not run in a standalone git checkout of chromite. Use the repo-based flow described above to obtain a functional-testing environment.

run_pytest

This top-level script is a convenience wrapper for scripts/run_pytest and has identical behavior.

run_tests

This top-level script runs both scripts/run_tests and scripts/run_pytest as a convenience wrapper for the full testing run done in the CQ. This script accepts no arguments, so if you want to customize test run behavior you should run one of scripts/run_pytest or scripts/run_tests directly.

Writing unit tests

As of writing this document (April 2020), Chromite is still in the process of migrating to run entirely under Python 3. New *_unittest.py files can assume that they are run on Python 3 only, but existing files must maintain backwards compatibility unless marked with a sys.version assertion at the top of the file.

Chromite‘s unit tests make use of pytest fixtures. Fixtures that are defined in a conftest.py file are visible to tests in the same directory and all child directories. If it’s unclear where a test function is getting an argument from, try searching for a fixture with that argument's name in a conftest.py file.

Be sure to consult pytest's excellent documentation for guidance on how to take advantage of the features pytest offers when writing unit tests.

Unit tests must clean up after themselves and in particular must not leak child processes after running. There is no guaranteed order in which tests are run or that tests are even run in the same process.

Pre-CQ

Once you mark your CL as Commit-Queue +1 on the Chromium Gerrit, the PreCQ will pick up your change and fire few preset config runs as a precursor to CQ.

Commit Queue

This is the final step in getting your change pushed. CQ is the most comprehensive of all tests. Once a CL is verified by CQ, it is merged into the codebase.

How does ChromeOS build work?

Refer to these talk slides on ChromeOS Build Overview.