ros2docker 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ros2docker-0.1.1/CONTRIBUTING.md +207 -0
- ros2docker-0.1.1/LICENSE +28 -0
- ros2docker-0.1.1/MANIFEST.in +10 -0
- ros2docker-0.1.1/PKG-INFO +152 -0
- ros2docker-0.1.1/README.md +119 -0
- ros2docker-0.1.1/docs/agent-goals/documentation-audit.md +33 -0
- ros2docker-0.1.1/docs/agent-goals/implementation-cleanup.md +32 -0
- ros2docker-0.1.1/docs/agent-goals/maintainer-review.md +19 -0
- ros2docker-0.1.1/docs/agent-goals/quality-workflow.md +19 -0
- ros2docker-0.1.1/docs/agent-goals/test-ci-audit.md +28 -0
- ros2docker-0.1.1/docs/ci.md +54 -0
- ros2docker-0.1.1/docs/configuration.md +62 -0
- ros2docker-0.1.1/docs/quality-audit.md +16 -0
- ros2docker-0.1.1/docs/release.md +48 -0
- ros2docker-0.1.1/pyproject.toml +115 -0
- ros2docker-0.1.1/setup.cfg +4 -0
- ros2docker-0.1.1/src/ros2docker/__init__.py +19 -0
- ros2docker-0.1.1/src/ros2docker/__main__.py +8 -0
- ros2docker-0.1.1/src/ros2docker/api.py +152 -0
- ros2docker-0.1.1/src/ros2docker/cli.py +115 -0
- ros2docker-0.1.1/src/ros2docker/commands.py +191 -0
- ros2docker-0.1.1/src/ros2docker/config.py +316 -0
- ros2docker-0.1.1/src/ros2docker/resources/build/Dockerfile +192 -0
- ros2docker-0.1.1/src/ros2docker/resources/build/entrypoint.sh +72 -0
- ros2docker-0.1.1/src/ros2docker/resources/examples/ros2docker.json +51 -0
- ros2docker-0.1.1/src/ros2docker/resources/schema/ros2docker.schema.json +118 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/PKG-INFO +152 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/SOURCES.txt +30 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/dependency_links.txt +1 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/entry_points.txt +2 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/requires.txt +10 -0
- ros2docker-0.1.1/src/ros2docker.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
This is the canonical development workflow for contributors.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
Prerequisites:
|
|
8
|
+
|
|
9
|
+
- Python 3.10 or 3.12 when mirroring CI.
|
|
10
|
+
- Docker for runtime and E2E checks.
|
|
11
|
+
- `just` for local workflow commands.
|
|
12
|
+
- `pipx` for user-style installs.
|
|
13
|
+
- GitHub CLI `gh` for PR and auto-merge workflows.
|
|
14
|
+
|
|
15
|
+
Set up the repository from the root:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
just setup
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This creates `.venv`, installs `.[dev]`, and installs pre-commit hooks.
|
|
22
|
+
|
|
23
|
+
## Local Checks
|
|
24
|
+
|
|
25
|
+
Run individual checks from the repository root:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
just lint
|
|
29
|
+
just typecheck
|
|
30
|
+
just test-unit
|
|
31
|
+
just test-contract
|
|
32
|
+
just docs
|
|
33
|
+
just package
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
For small review PRs, run lightweight checks before opening the draft PR:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
just lint
|
|
40
|
+
just typecheck
|
|
41
|
+
just test-unit
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Before opening or updating a ready PR, run:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
just check
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`just check` runs linting, type checking, unit tests, contract tests, docs checks,
|
|
51
|
+
and package validation. It does not run Docker E2E checks.
|
|
52
|
+
|
|
53
|
+
Use Docker E2E checks when Docker/runtime behavior changed:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
just test-e2e-fast
|
|
57
|
+
just test-e2e-slow
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`just test-e2e-fast` runs the fast Docker smoke fixtures. `just test-e2e-slow`
|
|
61
|
+
runs the full Docker E2E suite, including slow image and ROS launch checks.
|
|
62
|
+
|
|
63
|
+
## Branch And Merge Policy
|
|
64
|
+
|
|
65
|
+
`main` is protected. Do not push directly to `main`.
|
|
66
|
+
|
|
67
|
+
All changes must go through a pull request. Local `main` should be treated as a
|
|
68
|
+
clean mirror of `origin/main`.
|
|
69
|
+
|
|
70
|
+
Start each change from an up-to-date `origin/main`:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
git fetch --prune
|
|
74
|
+
git switch -c <type>/<short-topic> origin/main
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Keep the change small and coherent. Update tests for changed behavior. Update
|
|
78
|
+
README, docs, examples, or schema files when CLI, config, API, Docker behavior,
|
|
79
|
+
or public behavior changes.
|
|
80
|
+
|
|
81
|
+
After the PR has merged, clean up from a synchronized `main`:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git switch main
|
|
85
|
+
git fetch --prune
|
|
86
|
+
git pull --ff-only
|
|
87
|
+
git branch -d <branch>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
If local `main` diverges from `origin/main`, do not continue working on `main`.
|
|
91
|
+
Move any useful local work to a topic branch first, then restore `main` to match
|
|
92
|
+
`origin/main`.
|
|
93
|
+
|
|
94
|
+
## Pull Request Modes
|
|
95
|
+
|
|
96
|
+
This repository uses two pull request modes.
|
|
97
|
+
|
|
98
|
+
### Review PRs
|
|
99
|
+
|
|
100
|
+
Review PRs are the default. They are intended for small changes, documentation
|
|
101
|
+
updates, and changes that should be inspected before merge.
|
|
102
|
+
|
|
103
|
+
Review PRs should usually be opened as draft pull requests. Draft PRs provide
|
|
104
|
+
lightweight CI feedback but are not expected to be mergeable yet.
|
|
105
|
+
|
|
106
|
+
Use this flow:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
gh pr create --draft --base main --title "<title>" --body "<summary>"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
After review approval, mark the PR ready:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
gh pr ready <number>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Autonomous PRs
|
|
119
|
+
|
|
120
|
+
Autonomous PRs are used when the user explicitly asks for autonomous iteration,
|
|
121
|
+
auto-merge, or completion without further review.
|
|
122
|
+
|
|
123
|
+
Autonomous PRs are opened as ready-for-review pull requests, may have auto-merge
|
|
124
|
+
enabled, and must pass the full required merge gate before entering `main`.
|
|
125
|
+
|
|
126
|
+
Use this flow:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
gh pr create --base main --title "<title>" --body "<summary>"
|
|
130
|
+
gh pr merge <number> --auto --squash --delete-branch
|
|
131
|
+
gh pr checks <number> --watch --required
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
If CI fails or auto-merge is blocked, inspect the failure, fix the same PR
|
|
135
|
+
branch, push the update, and repeat until the PR merges or is clearly blocked.
|
|
136
|
+
|
|
137
|
+
## CI Policy
|
|
138
|
+
|
|
139
|
+
The required merge gate for `main` is:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
ci-success
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Draft PRs run `pr-lightweight` for quick feedback. The lightweight workflow runs:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
just lint
|
|
149
|
+
just typecheck
|
|
150
|
+
just test-unit
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Ready PRs and merge queue entries run `pr-merge-gate`. The `ci-success` job in
|
|
154
|
+
that workflow requires:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
just check
|
|
158
|
+
just test-e2e-fast
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
A PR cannot merge into `main` unless `ci-success` passes. Prefer requiring only
|
|
162
|
+
this stable aggregate check in branch protection so individual job names can
|
|
163
|
+
change without rewriting repository policy.
|
|
164
|
+
|
|
165
|
+
Full Docker E2E runs in the scheduled `nightly-e2e` workflow and may also be
|
|
166
|
+
triggered manually. Nightly full E2E is not a replacement for the required PR
|
|
167
|
+
merge gate.
|
|
168
|
+
|
|
169
|
+
Avoid path filters or branch filters for required workflows. If a required
|
|
170
|
+
workflow is skipped by filtering, GitHub can leave the check pending and block
|
|
171
|
+
merging.
|
|
172
|
+
|
|
173
|
+
See [docs/ci.md](docs/ci.md) for the contributor-facing CI workflow summary.
|
|
174
|
+
|
|
175
|
+
## Release Workflow
|
|
176
|
+
|
|
177
|
+
Releases are built from version tags. After the release PR has merged, create
|
|
178
|
+
and push a tag in the form `vX.Y.Z` from the release commit:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
git switch main
|
|
182
|
+
git fetch --prune
|
|
183
|
+
git pull --ff-only
|
|
184
|
+
git tag vX.Y.Z
|
|
185
|
+
git push origin vX.Y.Z
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The `release` workflow validates the tag with non-Docker checks, package
|
|
189
|
+
artifact validation, and fast Docker E2E before publishing. Successful tag
|
|
190
|
+
releases publish the wheel and sdist to PyPI through Trusted Publishing, then
|
|
191
|
+
create a GitHub Release with the wheel, sdist, and `SHA256SUMS`.
|
|
192
|
+
|
|
193
|
+
Maintainers must configure pending Trusted Publishers on PyPI and TestPyPI for
|
|
194
|
+
repository `develNor/ros2docker`, workflow `.github/workflows/release.yml`, and
|
|
195
|
+
environments `pypi` and `testpypi`. No PyPI API token should be stored in GitHub
|
|
196
|
+
secrets for the normal release path.
|
|
197
|
+
|
|
198
|
+
Use the manual `release` workflow dispatch for TestPyPI rehearsals. Manual runs
|
|
199
|
+
publish only to TestPyPI and do not create GitHub Releases.
|
|
200
|
+
|
|
201
|
+
See [docs/release.md](docs/release.md) for the focused release workflow summary.
|
|
202
|
+
|
|
203
|
+
## Pull Request Description
|
|
204
|
+
|
|
205
|
+
Include local command results in the PR summary. Call out whether the PR is a
|
|
206
|
+
review PR or an autonomous PR, which checks were run, and whether Docker/runtime
|
|
207
|
+
behavior changed.
|
ros2docker-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025, develNor
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ros2docker
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Versioned CLI and Python API for building and running ROS 2 Docker workspaces.
|
|
5
|
+
Author: develNor
|
|
6
|
+
License-Expression: BSD-3-Clause
|
|
7
|
+
Project-URL: Homepage, https://github.com/develNor/ros2docker
|
|
8
|
+
Project-URL: Repository, https://github.com/develNor/ros2docker
|
|
9
|
+
Project-URL: Issues, https://github.com/develNor/ros2docker/issues
|
|
10
|
+
Keywords: docker,ros2,cli
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
19
|
+
Classifier: Topic :: System :: Installation/Setup
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
25
|
+
Requires-Dist: check-wheel-contents>=0.6; extra == "dev"
|
|
26
|
+
Requires-Dist: mypy>=1.14; extra == "dev"
|
|
27
|
+
Requires-Dist: pre-commit>=4.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest>=8.3; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=6.0; extra == "dev"
|
|
30
|
+
Requires-Dist: ruff==0.8.6; extra == "dev"
|
|
31
|
+
Requires-Dist: twine>=6.0; extra == "dev"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# ros2docker
|
|
35
|
+
|
|
36
|
+
[](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml)
|
|
37
|
+
[](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml)
|
|
38
|
+
|
|
39
|
+
`ros2docker` is a versioned Python CLI and API for building and running ROS 2 Docker workspaces from JSON-with-comments config files.
|
|
40
|
+
|
|
41
|
+
## Install
|
|
42
|
+
|
|
43
|
+
Stable release:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pipx install ros2docker
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Latest development version:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pipx install --force git+https://github.com/develNor/ros2docker.git@main
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Non-pipx fallback:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
python3 -m pip install --user ros2docker
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Development Install
|
|
62
|
+
|
|
63
|
+
When developing `ros2docker`, install this checkout in editable mode so the
|
|
64
|
+
host `ros2docker` command imports the local source:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pipx install --force --editable /path/to/ros2docker
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Normal Python source changes are picked up immediately by new `ros2docker`
|
|
71
|
+
commands. Reinstall after changing package metadata, dependencies, or console
|
|
72
|
+
entry points in `pyproject.toml`.
|
|
73
|
+
|
|
74
|
+
Verify the editable command with:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
ros2docker run --no-build --dry-run -m .
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The dry run should print a `docker run` command that mounts the current
|
|
81
|
+
directory as `/ws` and starts `bash`, without requiring `-f/--config`.
|
|
82
|
+
|
|
83
|
+
## CLI
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
ros2docker run -m /host/project
|
|
87
|
+
ros2docker run --no-build -m /host/project
|
|
88
|
+
ros2docker build -f ros2docker.json
|
|
89
|
+
ros2docker run -f ros2docker.json
|
|
90
|
+
ros2docker run -f ros2docker.json --no-build -- -v /host/data:/data
|
|
91
|
+
ros2docker stop -f ros2docker.json
|
|
92
|
+
ros2docker exec -f ros2docker.json -- bash -lc 'ros2 --help'
|
|
93
|
+
ros2docker --version
|
|
94
|
+
python -m ros2docker --version
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Every Docker action accepts `--dry-run`, which prints the Docker argv and exits without running Docker.
|
|
98
|
+
The `-f`/`--config` option is optional; without it, `ros2docker` uses the default config, which starts an interactive Bash shell.
|
|
99
|
+
|
|
100
|
+
## Config
|
|
101
|
+
|
|
102
|
+
Config files are JSON with `//` and `/* ... */` comments. Supported keys include:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"container_name": "example_ros2container",
|
|
107
|
+
"image_name": "ros2docker",
|
|
108
|
+
"run_type": "bash",
|
|
109
|
+
"mount_ws": true,
|
|
110
|
+
"enable_gui_forwarding": false,
|
|
111
|
+
"forward_ssh_agent": false,
|
|
112
|
+
"run_args": [],
|
|
113
|
+
"extra_run_args": [],
|
|
114
|
+
"build_args": {},
|
|
115
|
+
"bake_ros_packages": [],
|
|
116
|
+
"catmux_file": "/ws/catmux.yaml",
|
|
117
|
+
"catmux_params": {},
|
|
118
|
+
"command": "ros2 topic list"
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The machine-readable schema lives at `src/ros2docker/resources/schema/ros2docker.schema.json`.
|
|
123
|
+
See [docs/configuration.md](docs/configuration.md) for the full configuration contract. Unknown top-level config keys are rejected.
|
|
124
|
+
|
|
125
|
+
Supported `run_type` values are:
|
|
126
|
+
|
|
127
|
+
- `bash`: start an interactive shell.
|
|
128
|
+
- `command`: run the configured `command`.
|
|
129
|
+
- `catmux`: start a catmux session from `catmux_file`.
|
|
130
|
+
- `up`: start a detached keepalive container.
|
|
131
|
+
|
|
132
|
+
Host paths in `-v/--volume` and bind `--mount` args expand `~` and environment variables. Relative `./` and `../` host paths are resolved from the config file directory.
|
|
133
|
+
|
|
134
|
+
`bake_ros_packages` paths are also resolved from the config file directory and copied into a temporary Docker build context. The installed Python package directory is never mutated during builds.
|
|
135
|
+
|
|
136
|
+
`enable_gui_forwarding` forwards the X11 socket at `/tmp/.X11-unix`.
|
|
137
|
+
`forward_ssh_agent` forwards the host `SSH_AUTH_SOCK` path when the variable is set and points to an existing socket or file.
|
|
138
|
+
|
|
139
|
+
## Development
|
|
140
|
+
|
|
141
|
+
For contributor setup, local checks, PR modes, merge policy, and release
|
|
142
|
+
workflow, see [CONTRIBUTING.md](CONTRIBUTING.md). CI behavior is summarized in
|
|
143
|
+
[docs/ci.md](docs/ci.md), and release publishing is summarized in
|
|
144
|
+
[docs/release.md](docs/release.md).
|
|
145
|
+
|
|
146
|
+
## Python API
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from ros2docker.api import build, run, build_run, stop, exec_shell
|
|
150
|
+
from ros2docker.config import load_config, get_config_dir
|
|
151
|
+
from ros2docker.commands import make_build_command, make_run_command
|
|
152
|
+
```
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# ros2docker
|
|
2
|
+
|
|
3
|
+
[](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml)
|
|
4
|
+
[](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml)
|
|
5
|
+
|
|
6
|
+
`ros2docker` is a versioned Python CLI and API for building and running ROS 2 Docker workspaces from JSON-with-comments config files.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
Stable release:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pipx install ros2docker
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Latest development version:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pipx install --force git+https://github.com/develNor/ros2docker.git@main
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Non-pipx fallback:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
python3 -m pip install --user ros2docker
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Development Install
|
|
29
|
+
|
|
30
|
+
When developing `ros2docker`, install this checkout in editable mode so the
|
|
31
|
+
host `ros2docker` command imports the local source:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pipx install --force --editable /path/to/ros2docker
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Normal Python source changes are picked up immediately by new `ros2docker`
|
|
38
|
+
commands. Reinstall after changing package metadata, dependencies, or console
|
|
39
|
+
entry points in `pyproject.toml`.
|
|
40
|
+
|
|
41
|
+
Verify the editable command with:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
ros2docker run --no-build --dry-run -m .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The dry run should print a `docker run` command that mounts the current
|
|
48
|
+
directory as `/ws` and starts `bash`, without requiring `-f/--config`.
|
|
49
|
+
|
|
50
|
+
## CLI
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
ros2docker run -m /host/project
|
|
54
|
+
ros2docker run --no-build -m /host/project
|
|
55
|
+
ros2docker build -f ros2docker.json
|
|
56
|
+
ros2docker run -f ros2docker.json
|
|
57
|
+
ros2docker run -f ros2docker.json --no-build -- -v /host/data:/data
|
|
58
|
+
ros2docker stop -f ros2docker.json
|
|
59
|
+
ros2docker exec -f ros2docker.json -- bash -lc 'ros2 --help'
|
|
60
|
+
ros2docker --version
|
|
61
|
+
python -m ros2docker --version
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Every Docker action accepts `--dry-run`, which prints the Docker argv and exits without running Docker.
|
|
65
|
+
The `-f`/`--config` option is optional; without it, `ros2docker` uses the default config, which starts an interactive Bash shell.
|
|
66
|
+
|
|
67
|
+
## Config
|
|
68
|
+
|
|
69
|
+
Config files are JSON with `//` and `/* ... */` comments. Supported keys include:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"container_name": "example_ros2container",
|
|
74
|
+
"image_name": "ros2docker",
|
|
75
|
+
"run_type": "bash",
|
|
76
|
+
"mount_ws": true,
|
|
77
|
+
"enable_gui_forwarding": false,
|
|
78
|
+
"forward_ssh_agent": false,
|
|
79
|
+
"run_args": [],
|
|
80
|
+
"extra_run_args": [],
|
|
81
|
+
"build_args": {},
|
|
82
|
+
"bake_ros_packages": [],
|
|
83
|
+
"catmux_file": "/ws/catmux.yaml",
|
|
84
|
+
"catmux_params": {},
|
|
85
|
+
"command": "ros2 topic list"
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The machine-readable schema lives at `src/ros2docker/resources/schema/ros2docker.schema.json`.
|
|
90
|
+
See [docs/configuration.md](docs/configuration.md) for the full configuration contract. Unknown top-level config keys are rejected.
|
|
91
|
+
|
|
92
|
+
Supported `run_type` values are:
|
|
93
|
+
|
|
94
|
+
- `bash`: start an interactive shell.
|
|
95
|
+
- `command`: run the configured `command`.
|
|
96
|
+
- `catmux`: start a catmux session from `catmux_file`.
|
|
97
|
+
- `up`: start a detached keepalive container.
|
|
98
|
+
|
|
99
|
+
Host paths in `-v/--volume` and bind `--mount` args expand `~` and environment variables. Relative `./` and `../` host paths are resolved from the config file directory.
|
|
100
|
+
|
|
101
|
+
`bake_ros_packages` paths are also resolved from the config file directory and copied into a temporary Docker build context. The installed Python package directory is never mutated during builds.
|
|
102
|
+
|
|
103
|
+
`enable_gui_forwarding` forwards the X11 socket at `/tmp/.X11-unix`.
|
|
104
|
+
`forward_ssh_agent` forwards the host `SSH_AUTH_SOCK` path when the variable is set and points to an existing socket or file.
|
|
105
|
+
|
|
106
|
+
## Development
|
|
107
|
+
|
|
108
|
+
For contributor setup, local checks, PR modes, merge policy, and release
|
|
109
|
+
workflow, see [CONTRIBUTING.md](CONTRIBUTING.md). CI behavior is summarized in
|
|
110
|
+
[docs/ci.md](docs/ci.md), and release publishing is summarized in
|
|
111
|
+
[docs/release.md](docs/release.md).
|
|
112
|
+
|
|
113
|
+
## Python API
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from ros2docker.api import build, run, build_run, stop, exec_shell
|
|
117
|
+
from ros2docker.config import load_config, get_config_dir
|
|
118
|
+
from ros2docker.commands import make_build_command, make_run_command
|
|
119
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Goal: Make public-facing documentation consistent, non-redundant, and aligned with the repository.
|
|
2
|
+
|
|
3
|
+
Scope:
|
|
4
|
+
|
|
5
|
+
* README
|
|
6
|
+
* CONTRIBUTING
|
|
7
|
+
* DEVELOPMENT / development principles
|
|
8
|
+
* AGENTS.md
|
|
9
|
+
* docs/
|
|
10
|
+
* package metadata if it contains public-facing descriptions
|
|
11
|
+
|
|
12
|
+
Document ownership:
|
|
13
|
+
|
|
14
|
+
* README: user-facing purpose, installation, quick start, common usage
|
|
15
|
+
* CONTRIBUTING: human contribution workflow, PR expectations, local checks
|
|
16
|
+
* DEVELOPMENT: technical setup, architecture, testing, release process
|
|
17
|
+
* AGENTS.md: agent-specific operating rules only; link to human docs instead of duplicating them
|
|
18
|
+
|
|
19
|
+
Tasks:
|
|
20
|
+
|
|
21
|
+
* Find duplicated, stale, contradictory, or misplaced information.
|
|
22
|
+
* Prefer one canonical location plus links instead of repeated prose.
|
|
23
|
+
* Ensure documented workflows match actual repo configuration.
|
|
24
|
+
* Ensure agent instructions do not diverge from human development instructions.
|
|
25
|
+
* Keep AGENTS.md short and focused on agent behavior.
|
|
26
|
+
* Do not change source code unless needed to correct a documented command.
|
|
27
|
+
|
|
28
|
+
Report:
|
|
29
|
+
|
|
30
|
+
* final responsibility of each public-facing document
|
|
31
|
+
* moved or removed duplicated content
|
|
32
|
+
* remaining intentional duplication
|
|
33
|
+
* any documented behavior that still lacks implementation or tests
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Goal: Improve implementation quality while preserving the current public contract.
|
|
2
|
+
|
|
3
|
+
Scope:
|
|
4
|
+
- source code
|
|
5
|
+
- tests only where needed to preserve or clarify behavior
|
|
6
|
+
- no documentation changes except small corrections caused by code cleanup
|
|
7
|
+
|
|
8
|
+
Rules:
|
|
9
|
+
- Do not change documented CLI/API behavior unless tests and docs prove the old behavior was stale or broken.
|
|
10
|
+
- Do not remove tests.
|
|
11
|
+
- Do not weaken assertions.
|
|
12
|
+
- Do not add compatibility layers unless strictly required.
|
|
13
|
+
- Prefer clean removal of obsolete/dead code.
|
|
14
|
+
- Prefer the simplest implementation that satisfies the tests.
|
|
15
|
+
- Avoid broad rewrites.
|
|
16
|
+
|
|
17
|
+
Check for:
|
|
18
|
+
- dead code
|
|
19
|
+
- unused imports/functions/classes/constants
|
|
20
|
+
- redundant branches
|
|
21
|
+
- duplicated logic
|
|
22
|
+
- over-abstracted helpers
|
|
23
|
+
- unclear names
|
|
24
|
+
- unnecessary compatibility paths
|
|
25
|
+
- unnecessarily complicated control flow
|
|
26
|
+
- tests that no longer test meaningful behavior
|
|
27
|
+
|
|
28
|
+
After changes:
|
|
29
|
+
- run formatter/linter
|
|
30
|
+
- run unit tests
|
|
31
|
+
- run fast e2e tests if configured
|
|
32
|
+
- summarize simplifications and test coverage
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Review this PR as a strict maintainer.
|
|
2
|
+
|
|
3
|
+
Focus:
|
|
4
|
+
- scope creep
|
|
5
|
+
- missing or weak tests
|
|
6
|
+
- documentation drift
|
|
7
|
+
- accidental public API or CLI changes
|
|
8
|
+
- dead code left behind
|
|
9
|
+
- unnecessary abstraction
|
|
10
|
+
- CI/pre-commit mismatch
|
|
11
|
+
- release or packaging risks
|
|
12
|
+
|
|
13
|
+
Return:
|
|
14
|
+
- blocking issues
|
|
15
|
+
- non-blocking suggestions
|
|
16
|
+
- files/lines for each issue
|
|
17
|
+
- final recommendation: merge or request changes
|
|
18
|
+
|
|
19
|
+
Do not modify files unless explicitly asked.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
You are executing a multi-goal repository quality workflow.
|
|
2
|
+
|
|
3
|
+
Repository rules:
|
|
4
|
+
- Follow AGENTS.md.
|
|
5
|
+
- Use the goal templates in docs/agent-goals/.
|
|
6
|
+
- Create one focused autonomous PR per goal.
|
|
7
|
+
- Do not combine unrelated goals into one PR.
|
|
8
|
+
- Start every goal from latest main.
|
|
9
|
+
- Do not start a dependent goal until prerequisite PRs are merged.
|
|
10
|
+
- If CI fails, fix the current PR instead of starting a new goal.
|
|
11
|
+
- If a PR cannot be merged automatically, stop and report the blocker.
|
|
12
|
+
- Do not weaken tests, remove checks, or hide failures with broad skips/xfails.
|
|
13
|
+
- Keep each PR small and reviewable.
|
|
14
|
+
|
|
15
|
+
Execution plan:
|
|
16
|
+
1. Run docs/agent-goals/test-ci-audit.md and create a PR.
|
|
17
|
+
2. Run docs/agent-goals/documentation-audit.md and create a PR.
|
|
18
|
+
3. After both are merged into main, run docs/agent-goals/implementation-cleanup.md and create a PR.
|
|
19
|
+
4. After the cleanup PR is created, run docs/agent-goals/maintainer-review.md as a review-only task.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Goal: Audit and improve test coverage and test execution wiring.
|
|
2
|
+
|
|
3
|
+
Scope:
|
|
4
|
+
|
|
5
|
+
* tests/
|
|
6
|
+
* pyproject.toml or equivalent test config
|
|
7
|
+
* .pre-commit-config.yaml
|
|
8
|
+
* .github/workflows/*
|
|
9
|
+
* README/CONTRIBUTING/DEVELOPMENT sections that describe testing
|
|
10
|
+
* minimal source changes only if required to make behavior testable
|
|
11
|
+
|
|
12
|
+
Tasks:
|
|
13
|
+
|
|
14
|
+
* Map every public README-documented command, feature, and CLI behavior to existing tests where feasible.
|
|
15
|
+
* Add missing tests for feasible documented behavior.
|
|
16
|
+
* Identify behavior that cannot sensibly be tested automatically and document a manual verification check.
|
|
17
|
+
* Verify that tests are collected and actually executed.
|
|
18
|
+
* Check that tests are not accidentally skipped, deselected, ignored, or excluded by config.
|
|
19
|
+
* Ensure skipped/xfail tests have explicit reasons.
|
|
20
|
+
* Verify that local test instructions, pre-commit, CI, and release validation are consistent.
|
|
21
|
+
* Do not refactor implementation except where needed to make tests possible.
|
|
22
|
+
|
|
23
|
+
Run the relevant checks and report:
|
|
24
|
+
|
|
25
|
+
* changed files
|
|
26
|
+
* added or fixed tests
|
|
27
|
+
* remaining untested behavior and why
|
|
28
|
+
* commands run and results
|