wip
This commit is contained in:
commit
d7800f4d82
12 changed files with 378 additions and 0 deletions
155
README.md
Normal file
155
README.md
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
# Just Build System
|
||||
|
||||
A modular build system using Just that supports container builds, Python tooling, and more.
|
||||
|
||||
## Installation
|
||||
|
||||
There are several ways to use this build system:
|
||||
|
||||
### Method 1: Global Installation with Symlinks
|
||||
|
||||
1. Clone this repository to a permanent location:
|
||||
```bash
|
||||
git clone https://github.com/yourusername/wjust ~/.wjust
|
||||
```
|
||||
|
||||
2. In your project, create the module directories and symlink the justfiles:
|
||||
```bash
|
||||
# Create module directories
|
||||
mkdir -p container python
|
||||
|
||||
# Create symlinks to the global justfiles
|
||||
ln -s ~/.wjust/container/justfile container/justfile
|
||||
ln -s ~/.wjust/python/justfile python/justfile
|
||||
```
|
||||
|
||||
3. Create your project's `justfile`:
|
||||
```makefile
|
||||
# Import modules
|
||||
mod container
|
||||
mod python
|
||||
|
||||
# Override or add project-specific recipes here
|
||||
default:
|
||||
@just --list
|
||||
```
|
||||
|
||||
4. Create required files:
|
||||
```bash
|
||||
# For container module
|
||||
echo "registry.example.com/myproject" > container/name
|
||||
|
||||
# Optional: Set version
|
||||
echo "0.1.0" > version
|
||||
# Or use __about__.py with __version__ = "0.1.0"
|
||||
```
|
||||
|
||||
### Method 2: Local Copy (Traditional)
|
||||
|
||||
Copy the entire module directories to your project:
|
||||
```bash
|
||||
cp -r ~/.wjust/container ~/.wjust/python .
|
||||
```
|
||||
|
||||
Then create your `justfile` as shown above.
|
||||
|
||||
### Method 3: Remote Import (Advanced)
|
||||
|
||||
For advanced users who want to pull updates directly from the repository:
|
||||
|
||||
```bash
|
||||
# Create a script to update modules
|
||||
cat > update-just-modules.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
REPO="https://raw.githubusercontent.com/yourusername/wjust/main"
|
||||
mkdir -p {container,python}
|
||||
curl -o container/justfile "$REPO/container/justfile"
|
||||
curl -o python/justfile "$REPO/python/justfile"
|
||||
EOF
|
||||
|
||||
chmod +x update-just-modules.sh
|
||||
```
|
||||
|
||||
Then run `./update-just-modules.sh` whenever you want to update the modules.
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. Choose an installation method from above
|
||||
2. Run `just` to see available commands:
|
||||
```bash
|
||||
just
|
||||
|
||||
Available recipes:
|
||||
container ... # Container management
|
||||
python ... # Python tools
|
||||
```
|
||||
|
||||
## Container Module
|
||||
|
||||
The container module provides standardized container building and deployment.
|
||||
|
||||
### Setup
|
||||
|
||||
1. Create a `container/name` file with your container registry path:
|
||||
```
|
||||
registry.example.com/myproject
|
||||
```
|
||||
|
||||
2. Version will be detected from (in order):
|
||||
- Any `__about__.py` file containing `__version__ = "x.y.z"`
|
||||
- A `version` file in the project root
|
||||
- Defaults to "0.0.0" if neither exists
|
||||
|
||||
3. Create your `container/Containerfile`:
|
||||
```dockerfile
|
||||
FROM python:3.11
|
||||
# Add your container configuration
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
# Show available commands
|
||||
just
|
||||
|
||||
# Build container
|
||||
just container build
|
||||
|
||||
# Push container to registry
|
||||
just container deploy
|
||||
```
|
||||
|
||||
### Customization
|
||||
|
||||
The container module provides these recipes:
|
||||
- `build`: Builds the container with version tag
|
||||
- `deploy`: Pushes the container to the registry
|
||||
|
||||
## Python Module
|
||||
|
||||
The Python module provides linting with Ruff.
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
# Run linter
|
||||
just python lint
|
||||
|
||||
# Run linter with auto-fix
|
||||
just python lint-fix
|
||||
```
|
||||
|
||||
## Adding New Modules
|
||||
|
||||
1. Create a new directory for your module
|
||||
2. Add a `justfile` in the module directory
|
||||
3. Import it in your root `justfile` with `mod mymodule`
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `VERSION`: Automatically set from `__about__.py` or `version` file
|
||||
- `CONTAINER_NAME`: Set from `container/name` file
|
||||
|
||||
## Contributing
|
||||
|
||||
Feel free to submit issues and pull requests for additional modules or improvements.
|
||||
13
container/Containerfile
Normal file
13
container/Containerfile
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
FROM ubuntu:noble
|
||||
|
||||
ENV PATH="/root/.local/bin:$PATH"
|
||||
ENV VIRTUAL_ENV="/opt/venv"
|
||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||
|
||||
RUN apt-get update && apt-get install -y git curl
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
RUN uv python install 3.13
|
||||
RUN uv venv $VIRTUAL_ENV
|
||||
RUN uv pip install hatch
|
||||
RUN curl https://i.wayl.one/casey/just | bash && mv just /usr/local/bin
|
||||
|
||||
68
container/justfile
Normal file
68
container/justfile
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# container management
|
||||
set working-directory := '.'
|
||||
set shell := ["bash", "-c"]
|
||||
set quiet
|
||||
|
||||
# Read container name and version
|
||||
container_name := `
|
||||
cd $JUST_WORKING_DIRECTORY
|
||||
if [[ -f container/name ]]; then cat container/name; else echo "NONAME"; fi
|
||||
`
|
||||
|
||||
version := `
|
||||
cd $JUST_WORKING_DIRECTORY
|
||||
ABOUT_FILE=$(rg -l "__version__" --glob "**/__about__.py" 2>/dev/null | head -n 1) || true
|
||||
if [[ -n "$ABOUT_FILE" ]] && [[ -f "$ABOUT_FILE" ]]; then
|
||||
rg -oP "(?<=__version__ = ['\"])[^'\"]+" "$ABOUT_FILE"
|
||||
elif [[ -f "version" ]]; then
|
||||
cat version
|
||||
else
|
||||
echo "0.0.0"
|
||||
fi
|
||||
`
|
||||
|
||||
|
||||
|
||||
[group('container')]
|
||||
[private]
|
||||
@default: check
|
||||
#!/usr/bin/env bash
|
||||
cd $JUST_WORKING_DIRECTORY
|
||||
echo $PWD
|
||||
echo
|
||||
echo {{BOLD}}just container{{NORMAL}}
|
||||
echo {{MAGENTA}}{{container_name}}{{WHITE}}:{{GREEN}}{{version}}{{NORMAL}}
|
||||
|
||||
[group('container')]
|
||||
[private]
|
||||
check:
|
||||
#!/usr/bin/env bash
|
||||
cd $JUST_WORKING_DIRECTORY
|
||||
[[ -f container/Containerfile ]] || echo "{{RED}}WARNING: {{NORMAL}}Containerfile not found"
|
||||
|
||||
|
||||
# build the container
|
||||
[group('container')]
|
||||
build:
|
||||
@echo "Building {{container_name}}:{{version}}"
|
||||
@# @podman build \
|
||||
@# -t {{container_name}}:{{version}} \
|
||||
@# -f container/Containerfile .
|
||||
|
||||
# push the container
|
||||
[group('container')]
|
||||
@deploy:
|
||||
@podman push {{container_name}}
|
||||
@podman push {{container_name}}:{{version}}
|
||||
|
||||
# init container workflow
|
||||
[no-cd]
|
||||
[group('container')]
|
||||
init:
|
||||
#!/usr/bin/env bash
|
||||
[[ -d container ]] || mkdir container
|
||||
export project_name=$(basename $(pwd))
|
||||
[[ -f version ]] || echo "version = '0.0.0'" > version
|
||||
[[ -f container/name ]] || echo $project_name > container/name
|
||||
[[ -f container/Containerfile ]] || echo "FROM ubuntu" > container/Containerfile
|
||||
|
||||
1
container/name
Normal file
1
container/name
Normal file
|
|
@ -0,0 +1 @@
|
|||
registry.wayl.one/wjust
|
||||
1
container/repository
Normal file
1
container/repository
Normal file
|
|
@ -0,0 +1 @@
|
|||
registry.wayl.one
|
||||
62
justfile
Normal file
62
justfile
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# Main justfile
|
||||
set shell := ["bash", "-uc"]
|
||||
set quiet
|
||||
set allow-duplicate-recipes := true
|
||||
|
||||
|
||||
# wjust-dir := "~/.wjust"
|
||||
wjust-dir := "~/git/wjust"
|
||||
|
||||
# container management commands, run `just container` to see all subcommands
|
||||
mod container
|
||||
|
||||
# mod python
|
||||
|
||||
# mod container "{{wjust-dir}}/container/justfile"
|
||||
# mod container "~/git/wjust/container/justfile"
|
||||
# include "https://raw.githubusercontent.com/casey/just/refs/heads/master/justfile"
|
||||
# include {{wjust-dir}}/container/justfile
|
||||
|
||||
|
||||
[group('just')]
|
||||
[private]
|
||||
@default:
|
||||
echo $PWD
|
||||
@echo
|
||||
@echo {{BOLD}}just{{NORMAL}}
|
||||
@just --list
|
||||
# @just container
|
||||
|
||||
# fuzzy picker
|
||||
[group('just')]
|
||||
f:
|
||||
just --list | fzf | xargs just
|
||||
|
||||
pwd:
|
||||
pwd
|
||||
|
||||
get-version:
|
||||
#!/usr/bin/env bash
|
||||
if [[ -f "version" ]]; then \
|
||||
export PROJECT_VERSION=$(cat version); \
|
||||
elif ABOUT_FILE=$(rg -l "__version__" --glob "**/__about__.py" | head -n 1); then \
|
||||
export PROJECT_VERSION=$(rg -oP "(?<=__version__ = ['\"])[^'\"]+" "$ABOUT_FILE"); \
|
||||
else \
|
||||
echo "Version information not found!" >&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
export VERSION=$PROJECT_VERSION
|
||||
|
||||
version: get-version
|
||||
#!/usr/bin/env bash
|
||||
echo version is passed as $PROJECT_VERSION
|
||||
|
||||
# Run Ruff linter on Python files
|
||||
[group('python')]
|
||||
lint:
|
||||
uv run ruff check .
|
||||
|
||||
# Run Ruff with auto-fix
|
||||
[group('python')]
|
||||
lint-fix:
|
||||
uv run ruff check --fix .
|
||||
4
py_project/.__about__.py
Normal file
4
py_project/.__about__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# SPDX-FileCopyrightText: 2023-present Waylon S. Walker <waylon@waylonwalker.com>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
__version__ = "0.2.1"
|
||||
42
pyproject.toml
Normal file
42
pyproject.toml
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
[tool.ruff]
|
||||
# Enable pycodestyle (`E`), Pyflakes (`F`), and import sorting (`I`)
|
||||
select = ["E", "F", "I"]
|
||||
ignore = []
|
||||
|
||||
# Allow autofix for all enabled rules (when `--fix`) is provided.
|
||||
fixable = ["A", "B", "C", "D", "E", "F", "I"]
|
||||
unfixable = []
|
||||
|
||||
# Exclude a variety of commonly ignored directories.
|
||||
exclude = [
|
||||
".bzr",
|
||||
".direnv",
|
||||
".eggs",
|
||||
".git",
|
||||
".git-rewrite",
|
||||
".hg",
|
||||
".mypy_cache",
|
||||
".nox",
|
||||
".pants.d",
|
||||
".pytype",
|
||||
".ruff_cache",
|
||||
".svn",
|
||||
".tox",
|
||||
".venv",
|
||||
"__pypackages__",
|
||||
"_build",
|
||||
"buck-out",
|
||||
"build",
|
||||
"dist",
|
||||
"node_modules",
|
||||
"venv",
|
||||
]
|
||||
|
||||
# Same as Black.
|
||||
line-length = 88
|
||||
|
||||
# Allow unused variables when underscore-prefixed.
|
||||
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
||||
|
||||
# Assume Python 3.11
|
||||
target-version = "py311"
|
||||
30
python/justfile
Normal file
30
python/justfile
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
set working-directory := '..'
|
||||
set export
|
||||
set shell := ["bash", "-uc"]
|
||||
|
||||
|
||||
venv:
|
||||
#!/usr/bin/env bash
|
||||
[ -d .venv ] || uv venv
|
||||
[ -f requirements.txt ] && uv pip install -r requirements.txt
|
||||
source .venv/bin/activate
|
||||
|
||||
clean:
|
||||
rm -rf .venv
|
||||
rm -rf **/*/__pycache__
|
||||
rm -rf **/*/*.pyc
|
||||
rm -rf **/*/*.pyo
|
||||
|
||||
install: venv
|
||||
#!/usr/bin/env bash
|
||||
uv pip install .
|
||||
|
||||
check: venv
|
||||
#!/usr/bin/env bash
|
||||
which python
|
||||
|
||||
ipython: venv
|
||||
uv run ipython
|
||||
|
||||
install-uv:
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
pandas
|
||||
0
vars/justfile
Normal file
0
vars/justfile
Normal file
1
version
Normal file
1
version
Normal file
|
|
@ -0,0 +1 @@
|
|||
0.0.1
|
||||
Loading…
Add table
Add a link
Reference in a new issue