Shell to Python Continuous Deployment https://spcd.rwx.work
  • Shell 75.1%
  • Python 24.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Marc Beninca 959318c3e6
Some checks failed
/ alpine (push) Failing after 12s
/ debian (push) Failing after 30s
/ ubuntu (push) Failing after 37s
/ arch (push) Failing after 6s
/ opensuse (push) Failing after 1m31s
/ fedora (push) Failing after 2s
/ alma (push) Failing after 2m51s
/ rocky (push) Failing after 3m15s
docs(readme): restructure with subdirectory
readme / systems.md, variables.md
2026-08-04 12:52:00 +02:00
.forgejo/workflows chore: add existing codebase 2026-01-30 19:20:59 +01:00
.gitea/workflows chore: add existing codebase 2026-01-30 19:20:59 +01:00
.github/workflows chore: add existing codebase 2026-01-30 19:20:59 +01:00
readme docs(readme): restructure with subdirectory 2026-08-04 12:52:00 +02:00
spcd refactor(bootstrap): align constant & lint functions 2026-05-05 22:24:13 +02:00
.gitignore chore: add existing codebase 2026-01-30 19:20:59 +01:00
.gitlab-ci.yml chore: add existing codebase 2026-01-30 19:20:59 +01:00
license.md chore: add existing codebase 2026-01-30 19:20:59 +01:00
pyproject.toml chore: add existing codebase 2026-01-30 19:20:59 +01:00
readme.md docs(readme): restructure with subdirectory 2026-08-04 12:52:00 +02:00
render.py chore: add existing codebase 2026-01-30 19:20:59 +01:00
spcd.sh chore: add existing codebase 2026-01-30 19:20:59 +01:00

Shell to Python Continuous Deployment

1 What 2 Why 3 How 4 Where 5 Who 6 When

1 What

Get a common set of Python based CI / CD commands
from various contexts of CA, DNS, CI and OS / OCI.

License AGPL

Features

Handle project workflows in a unified way:

  • whether the network infrastructure is

    • online
    • offline with custom
      • Certificate Authorities
      • Domain Name System servers
  • whatever the Continuous Integration platform

    • ForgeJo
    • Gitea
    • GitHub
    • GitLab
    • SourceHut
    • Tangled
  • whatever the container’s Operating System

    System Latest Previous
    Alma ☑ 10 ☑ 9
    Alpine ☑ 3.20 ☑ 3.19
    Arch ☑ 20240818 (.0.255804) ☑ 20240101 (.0.204074)
    Debian ☑ Trixie (13) ☑ Bookworm (12)
    Fedora ☑ 40 ☑ 39
    OpenSUSE ☐ 15.6 ☐ 15.5
    Rocky ☑ 10 ☑ 9
    Ubuntu ☑ Noble (24.04) ☐ Jammy (22.04)

Stack

  • POSIX shell
  • Python

2 Why

Project workflows can occur in:

  • an online or offline context, dealing with custom CA & DNS servers
  • various Continuous Integration platforms, with different workflow syntaxes
  • specific Operating Systems, having different commands and package names
  • specific containers for JavaScript based actions (ForgeJo, Gitea, GitHub)

What if there was a unified way to do so?


3 How

Group environment variables

Full list

  • numbered
    • Certificate Authority armored certificates
    • Domain Name System servers IP addresses
  • ref names for deployment contexts of feature, staging & release
  • alternate locations of
    • Operating Systems & Software packages
    • Git repositories of
      • this project
      • its parent framework
      • projects not available in some distributions
        • shunit2
  • SSH key & hosts for deployments
  • a standalone POSIX shell script payload

Workflow files

  • calling the POSIX shell script payload as their very first step
  • using a unified YAML syntax made of actions implemented in Python

Continuous Integration & Deployment

Shell

  • setting up the chosen Operating System container
    • Domain Name System resolving
    • package manager configuration & repositories
    • Certificate Authorities trusting
    • Operating System updating
  • installing Git to clone
    • this project
    • its parent project
  • installing Python
    • system environment
    • virtual environment
    • managed version
  • generating a Python module to switch context

Python

  • setting up an OpenSSH client
    • known hosts
    • private key
  • and finally parsing commands from
    • system
    • workflow
  • to run available actions
    • check project
    • build project
    • browse workspace
    • synchronize

4 Where

Repository

Repo Feed CI
forgejo forge.rwx.work rss actions
tangled tangled.org atom pipelines

Sites

Web https://spcd.rwx.work

Spaces

ATProto colibri.social
ATProto roomy.space
IRC libera.chat

5 Who

Authors Marc Beninca

6 When

Priority 1

Documentation

  • build instead of readme
  • generate graphs
  • list behavior differences
    • Continuous Integration platforms
    • Operating Systems

Shell

  • comment
  • git/pypi fallback for rwx/spcd
  • handle errors
  • packages
    • configure
      • apk
      • pacman
      • zypper
    • repositories
      • codecs
        • epel
        • fedora
        • opensuse
      • opensuse
        • disable & enable https
  • locales
    • persist
  • test
  • workspace variable

Shell → Python

  • check file & variable sums
  • install system packages
    • epel
      • plantuml
      • shellcheck
    • graphviz
    • openssh
    • rsync
    • shfmt
    • shunit
  • python virtual environment
    • install system package
    • configure pip
    • venv
      • create
      • activate
  • query package
  • relay environment module name

Python

  • check
    • .py
    • .sh
      • maximum line length
  • comment
  • detect ssh private key type
  • fit banner to text
  • implement substeps
  • list sys.path
  • set workflow templates
    • actions
    • includes
  • try git repo url variable first for shunit
  • test

Priority 2

  • automate versions fetching
  • gource, xvfb, xauth
  • handle openh264 repositories
  • link from workspace to actions root
  • rpm fusion
  • tex
  • translate to french
  • try to support
    • guix
    • nix
  • uv