blackd schreef op dinsdag 9 december 2025 @ 10:07:
[...]
Ik wil de venv opzet toch nog wel een kans geven, ik had dat voorheen ook wel maar ik denk dat ik een paar stappen gemist heb om alle dependencies te fixeren en alle installaties te automatiseren. Bij de devcontainer loop ik ook wel tegen wat issues aan (vanwege het OS [Fedora] is feature/docker-outside-docker niet mogelijk en geknoei met permissies door verschillende gebruikers in de container vs op het host OS).
Misschien wil ik wel een hybride setup met lokaal een venv en op CI een docker container (met venv?).
Wat ik begrijp heb je dus Ansible-Core en Ansible-Lint in je
requirements.txt staan en specificeer je de Python versie in
.python-version.
Yes

.
requirements.txt
code:
1
2
3
4
5
| ansible-core==2.20.0
ansible-dev-tools==25.12.0
ansible-lint==25.12.0
pre-commit==4.5.0
yamllint==1.37.1 |
.python-version
En dit wordt wederom netjes bijgehouden met Renovate:
renovate.json
JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| {
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"packageRules": [
{
"description": "Limit requirements to once a week",
"matchFileNames": [
"requirements.txt",
"requirements.yml"
],
"schedule": ["* * * * 3"]
},
{
"description": "Update Python version",
"matchFileNames": [".python-version"],
"minimumReleaseAge": "30 days",
"internalChecksFilter": "strict",
"matchDatasources": ["python-version"]
}
]
} |
Waarbij ik dus afwachtend ben met het updaten van Python.
Hoe zit dat dan met de Python versie? Van wat ik lees zul je de globale python versie (op je dev machine) dan in sync moeten houden met je CI build. Hoe pak je dat aan?
Dat regel ik dus met
pyenv. Die staat in mijn home directory en houdt net zoals bijvoorbeeld nvm voor Node een aparte Python environment bij. Installatie en configuratie is dood eenvouudig:
# Requirements installeren voor Debian
sudo apt update
sudo apt install build-essential gdb lcov \
pkg-config libbz2-dev libffi-dev libgdbm-dev \
libgdbm-compat-dev liblzma-dev libncurses5-dev \
libreadline6-dev libsqlite3-dev libssl-dev lzma lzma-dev \
tk-dev uuid-dev zlib1g-dev libmpdec-dev libzstd-dev
# pyenv automatic installer
curl -fsSL https://pyenv.run | bash
Waarna ik in mijn
.zshrc pyenv configureer voor mijn shell:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #!/bin/zsh
# shellcheck shell=zsh
#
# 3) .zshrc - Zsh file loaded for interactive shell sessions
#
ZDOTDIR="${ZDOTDIR:-$HOME}"
# Set the list of directories that zsh searches for commands.
path=(
$HOME/{,s}bin(N)
$HOME/.local/{,s}bin(N)
$HOME/.pyenv/bin(N)
$HOME/.dotnet/tools(N)
/usr/local/{,s}bin(N)
$path
)
# Pyenv
export PYENV_ROOT="$HOME/.pyenv"
eval "$(pyenv init --path)" |
Mijn zsh configuratie heb ik in mijn dotfiles repo staan en de installatie van pyenv staat, zoals ik eerder al zei, in mijn infra repo. Ik heb daar een setup scriptje staan die alle benodigde dependencies automatisch kan installeren:
Op de CI omgeving zorgt de GitHub
setup-python action voor de setup van de juiste Python versie op basis van het
.python-version bestand:
quote: GitHub Setup Python Action
Basic usage
[...]
The python-version input is optional. If not supplied, the action will try to resolve the version from the default .python-version file. [...]
Python wordt hier in de hosted tool cache geïnstalleerd (en dus gecached), evenals de dependencies. Theoretisch is dat een security risico, maar dat neem ik voor lief.
Daarnaast heb ik ook nog andere dependencies die ik geinstalleerd moet hebben:
- GitHub CLI (via package manager)
- ACT (via GH CLI extension)
- Task (taskfile.dev) (via package manager)
- NPM
- DCLint (als NPM package)
- Renovate (als NPM package)
Ik beargumenteer niet dat alle packages verplicht in een venv moeten hè

. Je mag best afhankelijk zijn van het OS of een externe package manager. Ik vind alleen de aanpak van een Docker container hier onnodig en onhandig. Evenals de afhankelijkheid van een devcontainer, aangezien dat weer redelijk afhankelijk is van VSCode. Ik vind een vendor lock-in van een editor namelijk nogal beroerd

.
In mijn zsh omgeving heb ik sowieso nvm - en dus npm - geconfigureerd staan. De installatie van deze afhankelijkheden zou ik dus simpelweg meenemen in mijn setup script.
Voorheen heb ik een
development playbook gemaakt waarin dit soort zaken geautomatiseerd geinstalleerd werden. Nu zit dat in mijn Execution Environment Docker image.
Staging is voor mij een gevirtualiseerde evenknie van mijn productieomgeving.
Daar heb ik in VirtualBox een TrueNAS installatie draaien met dezelfde configuratie qua pools waarmee ik eenvoudig de Jail, Docker installatie en Docker Containers kan testen bij upgrades van TrueNAS.
Het liefst zou ik de group_vars op 1 plek hebben maar dat is me nog niet gelukt.
Ja dat is leuk

. Voor thuis heb ik alles
fail-fast met één omgeving. Waarbij ik moet toegeven dat er over het algemeen bijzonder weinig kapot vliegt of langdurig kapot gaat. Door Renovate heb ik het vertrouwen om het op deze manier te doen. Rollbacks zijn namelijk triviaal geworden.
Ik gebruik overigens de geerlingguy.docker role via Galaxy.
Die kende ik niet. Mja, Jeff Geerling wel, maar niet zijn role. Wel grappig om te zien dat mijn role nagenoeg gelijk is aan zijn role

.