feat: add command to update Docker Hub readme and rename bin scripts

This commit is contained in:
Janik von Rotz committed 2026-09-08 13:52:40 +02:00
1 parent 7c57ad58cb
commit dd36b39cee
6 files changed
+122 -14

No files matched your search

File renamed without changes.
File renamed without changes.
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env python3
"""Update Docker Hub repository README content from local markdown files."""
import base64
import json
import os
import sys
import requests
DOCKER_HUB_API = "https://hub.docker.com/v2"
REPOSITORIES = [
("images/odoo/README.md", "mintsystem", "odoo"),
("images/odoo-cli/README.md", "mintsystem", "odoo-cli"),
("images/odoo-mailgate/README.md", "mintsystem", "odoo-mailgate"),
("images/odoo-upgrade/README.md", "mintsystem", "odoo-upgrade"),
]
def get_docker_credentials():
"""Extract Docker Hub credentials from docker config.json."""
docker_config_dir = os.environ.get("DOCKER_CONFIG", os.path.expanduser("~/.docker"))
docker_config_path = os.path.join(docker_config_dir, "config.json")
if not os.path.exists(docker_config_path):
print(f"Docker config not found: {docker_config_path}")
return None, None
with open(docker_config_path) as f:
config = json.load(f)
auths = config.get("auths", {})
for key in ("https://index.docker.io/v1/", "https://index.docker.io/v1/access-token"):
if key in auths and "auth" in auths[key]:
decoded = base64.b64decode(auths[key]["auth"]).decode("utf-8")
if ":" in decoded:
username, password = decoded.split(":", 1)
return username, password
return None, None
def login_docker_hub(username, password):
"""Authenticate with Docker Hub and return JWT token."""
response = requests.post(
f"{DOCKER_HUB_API}/users/login/",
json={"username": username, "password": password},
timeout=30,
)
response.raise_for_status()
return response.json()["token"]
def update_repository(token, namespace, repo, description):
"""Update the full_description field of a Docker Hub repository."""
response = requests.patch(
f"{DOCKER_HUB_API}/repositories/{namespace}/{repo}/",
headers={"Authorization": f"JWT {token}", "Content-Type": "application/json"},
json={"full_description": description},
timeout=30,
)
response.raise_for_status()
return response
def main():
username, password = get_docker_credentials()
if not username:
print("Could not find Docker Hub credentials.")
print("Run 'task login-docker <user> <token>' first.")
sys.exit(1)
print(f"Authenticating with Docker Hub as '{username}'...")
token = login_docker_hub(username, password)
print("Authentication successful.")
for readme_path, namespace, repo in REPOSITORIES:
if not os.path.exists(readme_path):
print(f"Skipping {namespace}/{repo}: {readme_path} not found.")
continue
with open(readme_path) as f:
content = f.read()
print(f"Updating {namespace}/{repo}...")
update_repository(token, namespace, repo, content)
print(f"Updated {namespace}/{repo} successfully.")
print("Done.")
if __name__ == "__main__":
main()
@@ -26,12 +26,12 @@ First I want you to update the `bin/update-modules-doc` script. It should also p
The file looks like this:
```csv
forge, organisation, repo, module, versions
github.com, Mint-System, odoo-apps-account-financial-reporting, account_financial_report_contra_accounts, 14.0,15.0;16.0
forge,organisation,repo,module,versions
github.com,Mint-System,odoo-apps-account-financial-reporting,account_financial_report_contra_accounts,14.0;15.0;16.0
...
```
Note that command `task update-modules-doc` that is executing this script will take a long time. For every Odoo version all submodules are checked out synced:
Note that command `task update-modules-doc` that is executing this script will take a long time. For every Odoo version all submodules are checked out and synced:
```python
@@ -47,7 +47,7 @@ submodules = read_gitmodules(".gitmodules")
Do not execute the script. I will do it myself.
Then I would like to have a command `check-module-versions` that takes a list as input:
Then I would like to have a command `check-module-version <version> <stdin>` that takes a list as input:
```
account_financial_report
@@ -78,10 +78,12 @@ web_responsive
And then looks up every module in `modules.csv` and returns a table with available versions:
```
| name | versions |
|-----------------------|------------|
| account_reconcile_oca | 14.0, 16.0 |
```bash
cat list.txt | task check-module-version 18.0
| name | version |
|--------------------------|---------|
| account_financial_report | 18.0 |
| account_reconcile_oca | 17.0 |
...
```
@@ -1,7 +1,7 @@
---
title: "Create command to update Docker Hub readme"
state: draft
model:
state: completed
model: infomaniak/moonshotai/Kimi-K2.6
input_tokens:
---
@@ -32,6 +32,12 @@ It uses the credentials created with `login-docker` to make the post.
## Worklog
@Clanker Add a summary here once the task has been completed.
- Created `bin/update-docker-hub-readme` Python script that reads Docker Hub credentials from `~/.docker/config.json` (or `$DOCKER_CONFIG/config.json`), authenticates with the Docker Hub API, and updates the `full_description` for each repository.
- Added `update-docker-hub-readme` function to the `task` file.
- Added the command to the `task` help table under the Docker section.
- Verified the script syntax and tested the command successfully against Docker Hub.
- Removed `python` prefix from the `update-docker-hub-readme` function call in the `task` file; the script now runs directly via its shebang.
- Renamed `bin/github-set-default-branch` to `bin/set-github-repo-default-branch`.
- Renamed `bin/run-jupyter-notebook` to `bin/exec-odoo-jupyter` and updated the function name and help table entry in the `task` file.
@Clanker Set frontmatter state to completed and update info about model and token usage.
+8 -3
View File
@@ -50,6 +50,7 @@ help-table() {
rows+=("build-odoo-cli|[output]|Build Odoo CLI Docker image.")
rows+=("login-docker|[user][token]|Setup Docker Hub login credentials.")
rows+=("login-podman|[user][token]|Login into registry with podman.")
rows+=("update-docker-hub-readme||Update Docker Hub repository READMEs from image folders.")
rows+=("container-ps||List container processes.")
rows+=("remove|[name]|Remove containers and volumes.")
rows+=("test-image-script|[folder]|Test scripts of target Docker image folder.")
@@ -186,7 +187,7 @@ help-table() {
rows+=("===JUPYTER===| | ")
rows+=("init-odoo-jupyter|[path]|Init jypyter lab directory.")
rows+=("start-odoo-jupyter|[path][db]|Start juypter lab in directory.")
rows+=("run-jupyter-notebook|[path][db]|Run juypter notebook with papermill.")
rows+=("exec-odoo-jupyter|[path][db]|Run juypter notebook with papermill.")
for row in "${rows[@]}"; do
IFS='|' read -r cmd opt desc <<< "$row"
@@ -911,6 +912,10 @@ login-podman() {
podman login --username "$CONTAINER_REGISTRY_USERNAME" --password "$CONTAINER_REGISTRY_PASSWORD" docker.io
}
update-docker-hub-readme() {
bin/update-docker-hub-readme
}
test-odoo-version-regex() {
# If ODOO_VERSION=19.0 then
@@ -1359,7 +1364,7 @@ start-odoo-jupyter() {
./bin/start-odoo-jupyter "$1" "$database" "$token"
}
run-jupyter-notebook() {
exec-odoo-jupyter() {
if [[ -z "$1" ]]; then
echo '$1/path is empty.'
exit
@@ -1369,7 +1374,7 @@ run-jupyter-notebook() {
database="$DB_NAME"
fi
./bin/run-jupyter-notebook "$1" "$database"
./bin/exec-odoo-jupyter "$1" "$database"
}
exec() {