-
Notifications
You must be signed in to change notification settings - Fork 173
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update our release instructions with a way to run manual tasks via `doit`. Also, add developer documentation on how to use `doit`, and some tips and tricks.
- Loading branch information
Showing
2 changed files
with
85 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# Using the Doit Automation Tool | ||
|
||
Developers can use the [Doit](https://pydoit.org/) automation tool to create | ||
release artifacts. The purpose of the tool is to automate the manual release | ||
instructions in `RELEASE.md` file. Not everything is automated yet, since we're | ||
still experimenting with this tool. You can find our task definitions in this | ||
repo's `dodo.py` file. | ||
|
||
## Why Doit? | ||
|
||
We picked Doit out of the various tools out there for the following reasons: | ||
|
||
* **Pythonic:** The configuration file and tasks can be written in Python. Where | ||
applicable, it's easy to issue shell commands as well. | ||
* **File targets:** Doit borrows the file target concept from Makefiles. Tasks | ||
can have file dependencies, and targets they build. This makes it easy to | ||
define a dependency graph for tasks. | ||
* **Hash-based caching:** Unlike Makefiles, doit does not look at the | ||
modification timestamp of source/target files, to figure out if it needs to | ||
run them. Instead, it hashes those files, and will run a task only if the | ||
hash of a file dependency has changed. | ||
* **Parallelization:** Tasks can be run in parallel with the `-n` argument, | ||
which is similar to `make`'s `-j` argument. | ||
|
||
## How to Doit? | ||
|
||
First, enter your Poetry shell. Then, make sure that your environment is clean, | ||
and you have ample disk space. You can run: | ||
|
||
```bash | ||
doit clean --dry-run # if you want to see what would happen | ||
doit clean # you'll be asked to cofirm that you want to clean everything | ||
``` | ||
|
||
Finally, you can build all the release artifacts with `doit`, or a specific task | ||
with: | ||
|
||
``` | ||
doit <task> | ||
``` | ||
|
||
## Tips and tricks | ||
|
||
* You can run `doit list --all -s` to see the full list of tasks, their | ||
dependencies, and whether they are up to date. | ||
* You can run `doit info <task>` to see which dependencies are missing. | ||
* You can change this line in `pyproject.toml` to `true`, to allow using the | ||
Docker/Podman build cache: | ||
|
||
``` | ||
use_cache = true | ||
``` | ||
|
||
> [!WARNING] | ||
> Using caching may speed up image builds, but is not suitable for release | ||
> artifacts. The ID of our base container image (Alpine Linux) does not change | ||
> that often, but its APK package index does. So, if we use caching, we risk | ||
> skipping the `apk upgrade` layer and end up with packages that are days | ||
> behind. | ||
* You can pass the following environment variables to the script, in order to | ||
affect some global parameters: | ||
- `CONTAINER_RUNTIME`: The container runtime to use. Either `podman` (default) | ||
or `docker`. | ||
- `RELEASE_DIR`: Where to store the release artifacts. Default path is | ||
`~/release-assets/<version>` | ||
- `APPLE_ID`: The Apple ID to use when signing/notarizing the macOS DMG. |