write shell in sh.yml
Project description
Sometimes gnu make reminds me how old I am, shyml makes me feel like a baby again.
Getting started
Install
Install with pip install shyml.
Executable and shebang
Create a executable yaml file in your repo (name it sh.yml by convention) with shyml in the shebang as such:
#!/usr/bin/env shyml
Then, start adding a YAML document in it.
Example
#!/usr/bin/env shyml
name: foo
help: bar
requires:
- other
script:
- ./super
long
line
- shyml_otherjob # call another job as a bash function
---
name: otherjob
script: |
your code here
Document model
Each YAML document (separated by —) should contain a name key.
Other keys it can define:
script: a bash script in list or string format, arguments will be proxied
help: a help text to describe the job
color: a color to render the job name
requires: the list of other jobs to execute prior to this job
hook: set to before toautomatically execute before any other
env: a YAML hash of env var
CLI Usage
./sh.yml # lists jobs
./sh.yml jobname # run a job in a local bash shell
shell=xonsh ./sh.yml jobname # apparently you your sh.yml contains xonsh instead of bash ^^
./sh.yml debug jobname # print a job script code
./sh.yml test jobname # print a job help
Examples
Replace tox.ini
So, initially shyml was born because I wanted to get too much out of tox. Namely, centralizing test automation and eventually deployment (for integration testing) in a single multi-script file, for usage in various contexts:
in the system python environment, ie. in a built container
in the user python environment, that is where i have checked out all development source code I want to hack at the version that I develop with (and I try hard to stick to upstream and have forward-compatible code)
in a virtualenv, to test against released module versions.
To address this, I use such shyml job, that will make a venv with python3 by default, not setup any venv if venv=none, and use the user environment if venv=user.
---
name: install
help: |
Setup and activate a venv for a python executable
If venv=none, it will not do any venv.
If venv=user, it will use pip install --user.
script: |
if [ "${venv-}" = "user" ]; then
pip_install="pip install --user"
elif [ "${venv-}" != "none" ]; then
export python="${python-python3}"
export path="${path-.venv.$python}"
test -d $path || virtualenv --python=$python $path
set +eux; echo activating $path; source $path/bin/activate; set -eux
fi
${pip_install-pip install} -Ue .[test]
---
name: test
help: Run test in a python3 venv by default.
script: shyml_install && py.test -vv --cov src --strict -r fEsxXw ${@-src}
Then, I can run:
venv=user ./sh.yml test # in my home
venv=none ./sh.yml test # in a built container
./sh.yml test # just run tests in the default venv tox-like
Embed docker-compose.yml
--- name: compose script: | docker-compose -p $(pwd) -f <(cat <<EOF version: '3.5' services: django: build: dockerfile: Dockerfile context: ./ shm_size: 512mb depends_on: - postgres volumes: - ./:/app postgres: image: postgres:10 EOF ) $@
Replace Dockerfile with buildah
--- name: buildah script: - buildcntr1=$(buildah from --quiet docker.io/node:10-alpine) - buildmnt1=$(buildah mount $buildcntr1) - buildah config --env DJANGO_SETTINGS_MODULE=mrs.settings --env UWSGI_MODULE=mrs.wsgi:application --env NODE_ENV=production --env PYTHONIOENCODING=UTF-8 --env PYTHONUNBUFFERED=1 --env STATIC_URL=/static/ --env STATIC_ROOT=/app/static --env UWSGI_SPOOLER_NAMES=mail,stat --env UWSGI_SPOOLER_MOUNT=/app/spooler --env VIRTUAL_PROTO=uwsgi --env LOG=/app/log --env VIRTUAL_PROTO=uwsgi --env GIT_COMMIT=$CI_COMMIT_SHA $buildcntr1 - mkdir -p .cache/{apk,pip,npm} - buildah run -v $(pwd)/.cache/apk:/root/.cache/apk $buildcntr1 apk add --update --cache-dir /root/.cache/apk ca-certificates gettext shadow python3 py3-pillow py3-psycopg2 dumb-init bash git curl uwsgi-python3 uwsgi-http uwsgi-spooler uwsgi-cache uwsgi-router_cache uwsgi-router_static - buildah -v $(pwd)/.cache/pip:/root/.cache/pip run $buildcntr1 pip3 install --upgrade pip - buildah run $buildcntr1 bash -c 'curl -sL https://sentry.io/get-cli/ | bash' - buildah run $buildcntr1 bash -c 'mkdir -p /app && usermod -d /app -l app node && groupmod -n app node && chown -R app:app /app' - buildah config --workingdir /app $buildcntr1 - buildah copy $buildcntr1 yarn.lock .babelrc package.json webpack.config.js /app/ - buildah run $buildcntr1 yarn install --frozen-lockfile - buildah copy $buildcntr1 src/mrs/static /app/src/mrs/static - buildah run $(pwd)/.cache/npm:/npm $buildcntr1 yarn --cache-folder /npm prepare - buildah copy $buildcntr1 requirements.txt /app/ - buildah run -v $(pwd)/.cache/pip:/root/.cache/pip $buildcntr1 pip3 install --upgrade -r /app/requirements.txt - buildah run $buildcntr1 bash - buildah copy $buildcntr1 setup.py src /app/ - buildah run $buildcntr1 bash - buildah run -v $(pwd)/.cache/pip:/root/.cache/pip $buildcntr1 pip3 install --editable /app - buildah run $buildcntr1 mkdir -p /app/{log,static} - buildah run $buildcntr1 mrs collectstatic --noinput --clear - buildah copy $buildcntr1 locale /app/locale - buildah run $buildcntr1 mrs compilemessages -l fr - buildah run $buildcntr1 'find $STATIC_ROOT -type f | xargs gzip -f -k -9'
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file shyml-1.0.2.tar.gz
.
File metadata
- Download URL: shyml-1.0.2.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1eee8b86658b2f05228bfb397a6b18365baa0271cee0dcf047615c1502f41fe2 |
|
MD5 | 96cffac52caee9ff625831e5fa24b082 |
|
BLAKE2b-256 | 8f07c01a0edae75fe58baf077c11dd0d3840b776e42b0a11cc9e6d1051dd2b8a |