https://github.com/kennethreitz/bake
Bake — the strangely familiar workflow utility.
https://github.com/kennethreitz/bake
bake bakefile bash homebrew-tap invoke make makefile rake shell shell-script shell-scripting
Last synced: about 1 month ago
JSON representation
Bake — the strangely familiar workflow utility.
- Host: GitHub
- URL: https://github.com/kennethreitz/bake
- Owner: kennethreitz
- License: isc
- Created: 2019-09-14T13:02:29.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-11-25T05:21:47.000Z (6 months ago)
- Last Synced: 2025-03-09T00:05:22.899Z (2 months ago)
- Topics: bake, bakefile, bash, homebrew-tap, invoke, make, makefile, rake, shell, shell-script, shell-scripting
- Language: Python
- Homepage:
- Size: 20.7 MB
- Stars: 634
- Watchers: 18
- Forks: 25
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
$ bake — a s☿rangely familiar workflow utility.
~ under development ~
$ cat Bakefile $ bake install
install: install/node install/python + Executing install/node:
echo 'All ready!' | yarn install v1.17.3
install/full: install/system install | info No lockfile found.
install/python: @skip:key=Pipfile.lock | [1/4] Resolving packages...
pipenv install | [2/4] Fetching packages...
install/node: @skip:key=yarn.lock | [3/4] Linking dependencies...
yarn install | [4/4] Building fresh packages...
install/system: @confirm | success Saved lockfile.
brew install pipenv yarn | Done in 0.05s.
+ Executing install/python:
python/format: | Installing dependencies from …
black . + Executing install:
| All ready!
utils/argv: + Done.
set -u && echo "$HELLO: $@"
Rinse and repeat…
utils/deploy: @confirm:secure
exit 0
## What's in the oven?
- A
Bakefile
, which looks and feels like the good parts of aMakefile
. - Except, you can write real
bash
code! Any and all syntax is accepted — no magic going on here. ;) - Unlike
Makefile
, you may utilize4 × U+0020 a.k.a. “spaces”
] for indentation. - Environment variables are explicitly passed or whitelisted (
--allow
), not inherited from the parent shell. - Tasks can be run safely and reliably. Rest assured that scripts are executed from the project root directory.
- There are many other benefits to this design, that have yet to be expressed in this document.
------------------
### Automate Workflows — Bootstrap Development Environments — Commit The Tasks
I love using `Makefile` for one-off **tasks** in projects.
The problem with doing this is that you can't use familiar bash–isms when doing so, as **GNU Make** doesn't use the familiar **Bash** syntax, nor does it allow for simple ad–hoc use of arbitrary scripting languages (e.g. **Python**).
project seeks to bridge all of these worlds into a single entrypoint — ideal for cross–language repositories
-------------------
## Bootstraping `bake` — (for local development workflows)
#### **Various `*`nix Distributions** (Python 3.6+):
The primary installation method of `bake`, today, is via `pip`:
```console
$ pip3 install bake-cli
Collecting bake-cli
…
Successfully installed bake-cli-0.2.0 delegator.py-0.1.1 pexpect-4.7.0 ptyprocess-0.6.0
```
This will always work, but it will not be the default recommendation.
#### MacOS (Previously known as OS X)
Installation of `bake` will (soon) be very easy, with Homebrew. The formula needs a subtle adjustment — if you want to help, [here's the repo](http://github.com/kennethreitz/homebrew--)!
```console
$ brew install kennethreitz/-/bake
==> Installing bake from kennethreitz/-
…
🍺 /usr/local/Cellar/bake/19-09-16: 1,563 files, 16.7MB, built in 11 seconds
```
Homebrew will be the primary installation target of `bake`.
✨🍰✨
## Bootstraping `bake` — (for production workflows)
#### Containers! *e.g.* Docker.
You an also run `bake` via Docker! An official image has been made available [on DockerHub](https://cloud.docker.com/u/kennethreitz/repository/docker/kennethreitz/bake):
```console
$ docker run kennethreitz/bake Wed Sep 18 10:11:01 2019
No Bakefile found!
Usage: [OPTIONS] [TASK] [ARGUMENTS]...
$ bake — the strangely familiar task–runner.
Options:
-b, --bakefile PATH The Bakefile to use.
-l, --list Lists available tasks (and their dependencies).
-h, --help Show this message and exit.
--allow TEXT Whitelist an environment variable for use.
--no-deps Do not run dependent tasks.
--yes Set medium–security prompts to yes.
--continue Continue, if a task fails.
-i, --interactive Run in interactive mode.
--insecure Inherit parent shell's environment variables.
-s, --silent Reduce output.
-e, --environ-json TEXT Provide environment variables via JSON.
-j, --json Output in JSON format (stdout).
```
- **`Bakefile`** is expected to live at **`/app/Bakefile`**.
- If you inherit from this image, **`ONBUILD`** directives will automatically copy your application code (build context) into the container, into **`/app`**.
**Bonus Points**: this image is also [available on the GitHub Package Registry](https://github.com/kennethreitz/bake/packages/24444) (beta).
---------------
### Team & Workflow Management
You can use `bake` to bootstrap your team's development environments, ensuring a smooth and optimal workflow & local development experience.
Here's an example, using the `Bakefile` provided above:
```console
$ bake install
+ Executing install/node:
| yarn install v1.17.3
| info No lockfile found.
| [1/4] Resolving packages...
| [2/4] Fetching packages...
| [3/4] Linking dependencies...
| [4/4] Building fresh packages...
| success Saved lockfile.
| Done in 0.05s.
+ Executing install/python:
| Installing dependencies from Pipfile.lock (f10bb0)…
+ Executing install:
+ Done.
```
### Skip Steps, Automatically
Because we configured `yarn.lock` and `Pipfile.lock` as cache keys,
bake will automatically skip the configured steps— only running them
when the files are changed!
So, let's run that command again :)
```console
$ bake install
+ Skipping install/node:
+ Skipping install/python.
+ Executing install:
+ Done.
```
Neat, eh?
### Arguments & Parameters: Passing Values In
```console
$ bake utils/argv KEY=VALUES 1 2 3
+ Executing utils/argv:
| VALUES: 1 2 3
+ Done.
```
### (Optional) Non-Deterministic Confirmation Dialouges
```console
$ bake utils/deploy
What is 10 times 2?: 7
Aborted.
```
---------------------
### Community / Contrib
- [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=kennethreitz.bake) — highlights `Bakefile`— adequately.
----------------------
This open source software has been designed, for you, with much joy, by the hands of:
☿