Library and CLI to prepare Linux VPS hosts as GitLab CI runners
Project description
esys-ci-host
Library and CLI to prepare Linux VPS hosts as GitLab CI runners (Docker, privileged DinD, runner registration).
Extracted from the CI-host portions of esysdox-ops so LibESys superbuild and other tooling can depend on a focused package.
Install
pip install esys-ci-host
Quick start
On a fresh Ubuntu or Debian VPS (Docker executor for LibESys CI):
sudo esys-ci-host host bootstrap --yes --admin-user deploy --ssh-key-file ~/.ssh/id_ed25519.pub
# from your laptop: ssh deploy@<vps-ip> (confirm login works)
sudo esys-ci-host host harden --yes
sudo esys-ci-host runner prepare --yes
esys-ci-host runner register --url https://gitlab.example.com --profile ci
esys-ci-host doctor
host bootstrap creates the admin user, installs OpenSSH, installs your SSH public key (or generates one under /etc/esys-ci-host/), verifies key setup, and enables UFW with SSH allowed. Root SSH stays enabled until you run host harden after confirming deploy login from your machine. Pass --ssh-key-file ~/.ssh/id_ed25519.pub or set ESYS_CI_HOST_ADMIN_SSH_PUBLIC_KEY / ESYS_CI_HOST_ADMIN_SSH_PUBLIC_KEY_FILE. Use --disable-root-ssh only if you accept lockout risk without external login verification.
Set ESYS_CI_HOST_RUNNER_TOKEN instead of passing --token when registering.
Host bootstrap
| Option | Purpose |
|---|---|
--admin-user NAME |
Non-root login account with sudo (default: esysadmin) |
--ssh-key KEY |
OpenSSH public key line for admin login |
--ssh-key-file PATH |
File containing the public key |
--ssh-port PORT |
SSH port used for localhost login verification (default: 22) |
--disable-root-ssh |
Disable root SSH during bootstrap (default: keep root until host harden) |
--yes |
Required to apply host changes |
--dry-run |
Print steps without mutating the host |
If no key is supplied, an ed25519 key pair is generated at /etc/esys-ci-host/<admin-user>-id_ed25519 — copy the private key securely before closing your root session.
After bootstrap: SSH in as the admin user from your machine, then run sudo esys-ci-host host harden --yes to disable root login.
Runner registration and executors
The GitLab executor is chosen at registration time (runner register), not during runner install or runner prepare.
| Option | Purpose |
|---|---|
--executor shell |
Run jobs directly on the host (default) |
--executor docker |
Run jobs in containers (requires runner prepare) |
--profile ci |
LibESys CI preset: docker executor, privileged DinD, tags docker-privileged, and a sensible default image |
--docker-image IMAGE |
Override the runner’s default image (fallback only; see note below) |
--docker-privileged |
Privileged docker executor (enabled automatically by --profile ci) |
--tags TAGS |
Comma-separated runner tags (e.g. linux,docker) |
Default image vs job image: GitLab Runner’s --docker-image (at register time) is only the fallback written into config.toml. Each CI job uses its own image: from .gitlab-ci.yml when present — you do not need to pass --docker-image for every image your pipeline uses. With --profile ci, a default (python:3.11-bookworm) is applied automatically; override it only if you want a different fallback for jobs that omit image:.
Shell executor (simple jobs on the host):
sudo esys-ci-host runner install --yes
esys-ci-host runner register --url https://gitlab.example.com --executor shell --tags shell
Docker executor (explicit; run prepare first). GitLab Runner requires a default image for non-interactive docker registration, so pass --docker-image here unless you use --profile ci:
sudo esys-ci-host runner prepare --yes
esys-ci-host runner register \
--url https://gitlab.example.com \
--executor docker \
--docker-image python:3.11-bookworm \
--docker-privileged \
--tags docker-privileged
LibESys CI profile (recommended; includes docker executor defaults — no need to pass --docker-image unless overriding the fallback):
sudo esys-ci-host runner prepare --yes
esys-ci-host runner register --url https://gitlab.example.com --profile ci
Use --dry-run on runner register to print the gitlab-runner register command without executing it.
Development
Platform-specific host operations (packages, users, firewall, SSH) live under
src/esys_ci_host/platform/. DebianAptBackend is implemented today; add new
HostPlatformBackend subclasses (for example RhelDnfBackend) and register
them in platform/registry.py to support additional distributions later.
Runner install/prepare still use apt directly and will migrate to the platform
layer in a follow-up.
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pre-commit install
pre-commit install --hook-type commit-msg
pytest
Release tags vX.Y.Z must match src/esys_ci_host/__version__.py. Use make bump-release locally; CI publishes to GitLab PyPI, TestPyPI, and PyPI (manual).
Integration tests (Docker + systemd, Ubuntu 24.04 by default):
# Full runner workflow
bash tests/integration/run_docker.sh
# Host bootstrap + harden workflow
INTEGRATION_SCRIPT=/usr/local/bin/run-integration-host-bootstrap bash tests/integration/run_docker.sh
# Windows
.\test.ps1 -HostBootstrap
License
Apache-2.0 — see LICENSE.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file esys_ci_host-0.2.0.tar.gz.
File metadata
- Download URL: esys_ci_host-0.2.0.tar.gz
- Upload date:
- Size: 43.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f00f3268f4a140dc74f454643fcae05f338558ec04d109d8accd579914dad4c
|
|
| MD5 |
1ef21aeb020869b9ebae370e0e5fcc0c
|
|
| BLAKE2b-256 |
f0c55164a483a32bd7f17d0bc2cd803b2b0aa63341ea4fa40d777099247b56b2
|
File details
Details for the file esys_ci_host-0.2.0-py3-none-any.whl.
File metadata
- Download URL: esys_ci_host-0.2.0-py3-none-any.whl
- Upload date:
- Size: 36.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5523f2ef265c8df540e484de5a19f093679e893fb3c3f5f6c0b8c615335c8459
|
|
| MD5 |
a94a0c5b66e76587066bbdbd88213ba9
|
|
| BLAKE2b-256 |
76acbcaf872ce58adf5dcd6aa888748b4d7782b85513f61ea964c9ff3f493a1d
|