odctl 0.1.0__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.
Files changed (80) hide show
  1. odctl-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +46 -0
  2. odctl-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +44 -0
  3. odctl-0.1.0/.github/renovate.json +70 -0
  4. odctl-0.1.0/.github/workflows/build-deps.yml +113 -0
  5. odctl-0.1.0/.github/workflows/build-platform-images.yml +117 -0
  6. odctl-0.1.0/.github/workflows/ci.yml +39 -0
  7. odctl-0.1.0/.github/workflows/e2e-test.yml +83 -0
  8. odctl-0.1.0/.github/workflows/pipeline.yml +34 -0
  9. odctl-0.1.0/.github/workflows/publish.yml +34 -0
  10. odctl-0.1.0/.gitignore +225 -0
  11. odctl-0.1.0/.pre-commit-config.yaml +26 -0
  12. odctl-0.1.0/.vscode/settings.json +18 -0
  13. odctl-0.1.0/LICENSE +201 -0
  14. odctl-0.1.0/PKG-INFO +211 -0
  15. odctl-0.1.0/README.md +175 -0
  16. odctl-0.1.0/image/diagram.png +0 -0
  17. odctl-0.1.0/image/diagram1.drawio +92 -0
  18. odctl-0.1.0/image/diagram2.drawio +85 -0
  19. odctl-0.1.0/pyproject.toml +68 -0
  20. odctl-0.1.0/src/odctl/__init__.py +0 -0
  21. odctl-0.1.0/src/odctl/config.py +65 -0
  22. odctl-0.1.0/src/odctl/docker.py +295 -0
  23. odctl-0.1.0/src/odctl/main.py +520 -0
  24. odctl-0.1.0/src/odctl/planner.py +133 -0
  25. odctl-0.1.0/src/odctl/registry.py +66 -0
  26. odctl-0.1.0/src/odctl/resources/clickhouse/config.xml +52 -0
  27. odctl-0.1.0/src/odctl/resources/clickhouse/init.sql +2 -0
  28. odctl-0.1.0/src/odctl/resources/clickhouse/keeper_config.xml +26 -0
  29. odctl-0.1.0/src/odctl/resources/clickhouse/macros-11.xml +1 -0
  30. odctl-0.1.0/src/odctl/resources/clickhouse/macros-12.xml +1 -0
  31. odctl-0.1.0/src/odctl/resources/clickhouse/macros-21.xml +1 -0
  32. odctl-0.1.0/src/odctl/resources/clickhouse/macros-22.xml +1 -0
  33. odctl-0.1.0/src/odctl/resources/clickhouse/users.xml +56 -0
  34. odctl-0.1.0/src/odctl/resources/compose-analytics.yml +243 -0
  35. odctl-0.1.0/src/odctl/resources/compose-deps.yml +24 -0
  36. odctl-0.1.0/src/odctl/resources/compose-flink.yml +102 -0
  37. odctl-0.1.0/src/odctl/resources/compose-infra.yml +144 -0
  38. odctl-0.1.0/src/odctl/resources/compose-kafka.yml +206 -0
  39. odctl-0.1.0/src/odctl/resources/compose-metadata.yml +160 -0
  40. odctl-0.1.0/src/odctl/resources/compose-mlops.yml +74 -0
  41. odctl-0.1.0/src/odctl/resources/compose-obsv.yml +115 -0
  42. odctl-0.1.0/src/odctl/resources/compose-orch.yml +126 -0
  43. odctl-0.1.0/src/odctl/resources/compose-spark.yml +95 -0
  44. odctl-0.1.0/src/odctl/resources/compose-store.yml +103 -0
  45. odctl-0.1.0/src/odctl/resources/deps/Dockerfile +72 -0
  46. odctl-0.1.0/src/odctl/resources/deps/build.gradle +51 -0
  47. odctl-0.1.0/src/odctl/resources/deps/build_connectors.sh +71 -0
  48. odctl-0.1.0/src/odctl/resources/deps/fetch_flink_dependencies.sh +47 -0
  49. odctl-0.1.0/src/odctl/resources/deps/fetch_spark_dependencies.sh +40 -0
  50. odctl-0.1.0/src/odctl/resources/deps/fetch_standalone_plugins.sh +63 -0
  51. odctl-0.1.0/src/odctl/resources/docker/airflow/Dockerfile +23 -0
  52. odctl-0.1.0/src/odctl/resources/docker/ray-mlops/Dockerfile +62 -0
  53. odctl-0.1.0/src/odctl/resources/docker/spark/Dockerfile +16 -0
  54. odctl-0.1.0/src/odctl/resources/flink/flink1-conf.yml +58 -0
  55. odctl-0.1.0/src/odctl/resources/grafana/prometheus.yml +8 -0
  56. odctl-0.1.0/src/odctl/resources/marquez/marquez.yml +20 -0
  57. odctl-0.1.0/src/odctl/resources/mlops/serving/lightgbm_inference.py.example +42 -0
  58. odctl-0.1.0/src/odctl/resources/mlops/serving/vector_search.py.example +44 -0
  59. odctl-0.1.0/src/odctl/resources/postgres/01-init-databases.sh +47 -0
  60. odctl-0.1.0/src/odctl/resources/prometheus/alertmanager.yml +6 -0
  61. odctl-0.1.0/src/odctl/resources/prometheus/prometheus.yml +32 -0
  62. odctl-0.1.0/src/odctl/resources/registry.yml +289 -0
  63. odctl-0.1.0/src/odctl/resources/seaweed/s3.json +15 -0
  64. odctl-0.1.0/src/odctl/resources/spark/log4j2.properties +13 -0
  65. odctl-0.1.0/src/odctl/resources/spark/spark-defaults.conf +25 -0
  66. odctl-0.1.0/src/odctl/resources/trino/catalog/clickhouse.properties +4 -0
  67. odctl-0.1.0/src/odctl/resources/trino/catalog/iceberg.properties +9 -0
  68. odctl-0.1.0/src/odctl/resources/trino/catalog/postgres.properties +4 -0
  69. odctl-0.1.0/src/odctl/resources/trino/catalog/valkey.properties +6 -0
  70. odctl-0.1.0/src/odctl/ui.py +373 -0
  71. odctl-0.1.0/src/odctl/workspace.py +74 -0
  72. odctl-0.1.0/tests/conftest.py +41 -0
  73. odctl-0.1.0/tests/test_cli.py +52 -0
  74. odctl-0.1.0/tests/test_cli_extended.py +70 -0
  75. odctl-0.1.0/tests/test_config.py +35 -0
  76. odctl-0.1.0/tests/test_docker.py +112 -0
  77. odctl-0.1.0/tests/test_planner.py +63 -0
  78. odctl-0.1.0/tests/test_registry.py +34 -0
  79. odctl-0.1.0/tests/test_workspace.py +38 -0
  80. odctl-0.1.0/uv.lock +836 -0
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Create a report to help us improve the Open Data Stack
4
+ title: "[BUG] "
5
+ labels: bug
6
+ assignees: ""
7
+ ---
8
+
9
+ **Describe the bug**
10
+
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+
15
+ Steps to reproduce the behavior:
16
+
17
+ 1. What profiles were you trying to launch? (e.g., `dml up airflow spark ckh1`)
18
+ 2. Run this CLI command: '...'
19
+ 3. See error
20
+
21
+ **Expected behavior**
22
+
23
+ A clear and concise description of what you expected to happen.
24
+
25
+ **Traceback / Error Logs**
26
+
27
+ If applicable, paste the full CLI error or the specific container logs here (you can fetch container logs using `dml logs <profile> -s <service>`):
28
+
29
+ ```text
30
+ # Paste logs here
31
+
32
+
33
+ ```
34
+
35
+ **Environment (please complete the following information):**
36
+
37
+ * OS: [e.g. Ubuntu 24.04, macOS Sonoma, Windows 11 / WSL2]
38
+ * Python Version: [e.g. 3.12]
39
+ * `dml-cli` Version: [e.g. 0.0.3]
40
+ * Docker Version: [e.g. Docker Desktop 4.28.0, Docker Engine 25.0]
41
+
42
+ ## **Additional context**
43
+
44
+ * Did you customize any files in your local `./.dml/` workspace? (e.g., changing ports in `compose-orch.yml` or editing `registry.yml`)
45
+ * How much RAM/CPU is allocated to your Docker daemon? (Many Open Data profiles are resource-heavy)
46
+ * Add any other context about the problem here.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest an idea for the Open Data Stack
4
+ title: "[FEATURE] "
5
+ labels: enhancement
6
+ assignees: ""
7
+ ---
8
+
9
+ **Is your feature request related to a problem? Please describe.**
10
+
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+
15
+ A clear and concise description of what you want to happen. (e.g., "I want a new profile added to `compose-orch.yml` for Dagster", or "Add a dedicated connector script for MongoDB CDC.")
16
+
17
+ **Describe alternatives you've considered**
18
+
19
+ A clear and concise description of any alternative solutions or workarounds you've tried using the current stack.
20
+
21
+ **Example Use Case (Optional but helpful)**
22
+
23
+ Show a tiny snippet of how you would want the CLI or registry to look if this feature existed:
24
+
25
+ ```bash
26
+ # Example of the CLI command you wish existed
27
+ dml up dagster --pull
28
+
29
+ ```
30
+
31
+ *or*
32
+
33
+ ```yaml
34
+ # Example addition to registry.yml
35
+ dagster:
36
+ file: "compose-orch.yml"
37
+ profiles: ["dagster"]
38
+
39
+ ```
40
+
41
+ ## **Additional context**
42
+
43
+ * Does this feature require any specific base infrastructure (like Postgres or SeaweedFS) to operate?
44
+ * Add any other context, architectural diagrams, or links to the requested tool's documentation here.
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": ["config:base", ":dependencyDashboard", "docker:enableMajor"],
4
+ "schedule": ["every weekend"],
5
+ "docker-compose": {
6
+ "fileMatch": ["(^|/)compose-[^/]+\\.ya?ml$"]
7
+ },
8
+ "dockerfile": {
9
+ "fileMatch": [
10
+ "^src/dml/resources/docker/.*/Dockerfile$",
11
+ "^src/dml/resources/deps/Dockerfile$"
12
+ ]
13
+ },
14
+ "packageRules": [
15
+ {
16
+ "description": "Auto-merge non-breaking minor and patch updates if CI passes",
17
+ "matchUpdateTypes": ["minor", "patch"],
18
+ "automerge": true,
19
+ "automergeType": "pr"
20
+ },
21
+ {
22
+ "description": "Group all Python dependencies from pyproject.toml into a single PR",
23
+ "matchDatasources": ["pypi"],
24
+ "groupName": "Python Packages"
25
+ },
26
+ {
27
+ "description": "Group all Apache Airflow Providers into a single PR",
28
+ "matchPackagePatterns": ["^apache-airflow-providers-"],
29
+ "groupName": "Airflow Providers"
30
+ },
31
+ {
32
+ "description": "Group Spark and PySpark updates together to prevent Py4J mismatches",
33
+ "matchPackageNames": ["apache/spark", "pyspark"],
34
+ "groupName": "Spark Ecosystem"
35
+ },
36
+ {
37
+ "description": "Group Observability stack updates together",
38
+ "matchPackageNames": [
39
+ "prom/prometheus",
40
+ "prom/alertmanager",
41
+ "grafana/grafana"
42
+ ],
43
+ "groupName": "Observability Stack"
44
+ },
45
+ {
46
+ "description": "Group ClickHouse Server and Keeper to maintain cluster consensus",
47
+ "matchPackageNames": [
48
+ "clickhouse/clickhouse-server",
49
+ "clickhouse/clickhouse-keeper"
50
+ ],
51
+ "groupName": "ClickHouse Ecosystem"
52
+ },
53
+ {
54
+ "description": "Group OpenMetadata Server and Ingestion to maintain API compatibility",
55
+ "matchPackageNames": [
56
+ "docker.getcollate.io/openmetadata/server",
57
+ "docker.getcollate.io/openmetadata/ingestion"
58
+ ],
59
+ "groupName": "OpenMetadata Ecosystem"
60
+ },
61
+ {
62
+ "description": "Group Marquez API and Web UI together",
63
+ "matchPackageNames": [
64
+ "marquezproject/marquez",
65
+ "marquezproject/marquez-web"
66
+ ],
67
+ "groupName": "Lineage Ecosystem"
68
+ }
69
+ ]
70
+ }
@@ -0,0 +1,113 @@
1
+ name: Build Open Data Dependencies Image
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ env:
7
+ REGISTRY: ghcr.io
8
+ IMAGE_NAME: ${{ github.repository }}/deps
9
+
10
+ jobs:
11
+ build:
12
+ name: Build (${{ matrix.platform.arch }})
13
+ runs-on: ${{ matrix.platform.os }}
14
+ permissions:
15
+ contents: read
16
+ packages: write
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ platform:
21
+ - os: ubuntu-latest
22
+ arch: linux/amd64
23
+ name: amd64
24
+ - os: ubuntu-24.04-arm
25
+ arch: linux/arm64
26
+ name: arm64
27
+ steps:
28
+ - name: Checkout repository
29
+ uses: actions/checkout@v4
30
+
31
+ - name: Set up Docker Buildx
32
+ uses: docker/setup-buildx-action@v3
33
+
34
+ - name: Log in to the Container registry
35
+ uses: docker/login-action@v3
36
+ with:
37
+ registry: ${{ env.REGISTRY }}
38
+ username: ${{ github.actor }}
39
+ password: ${{ secrets.GITHUB_TOKEN }}
40
+
41
+ - name: Extract Docker metadata
42
+ id: meta
43
+ uses: docker/metadata-action@v5
44
+ with:
45
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
46
+
47
+ - name: Build and push by digest
48
+ id: build
49
+ uses: docker/build-push-action@v5
50
+ with:
51
+ context: src/odctl/resources/deps
52
+ platforms: ${{ matrix.platform.arch }}
53
+ labels: ${{ steps.meta.outputs.labels }}
54
+ outputs: type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=${{ startsWith(github.ref, 'refs/tags/v') }}
55
+ cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-${{ matrix.platform.name }}
56
+ cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-${{ matrix.platform.name }},mode=max
57
+
58
+ - name: Export digest
59
+ if: startsWith(github.ref, 'refs/tags/v')
60
+ run: |
61
+ mkdir -p /tmp/digests
62
+ digest="${{ steps.build.outputs.digest }}"
63
+ touch "/tmp/digests/${digest#sha256:}"
64
+
65
+ - name: Upload digest
66
+ if: startsWith(github.ref, 'refs/tags/v')
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: digests-deps-${{ matrix.platform.name }}
70
+ path: /tmp/digests/*
71
+ if-no-files-found: error
72
+ retention-days: 1
73
+
74
+ merge:
75
+ name: Merge & Tag
76
+ needs: build
77
+ if: startsWith(github.ref, 'refs/tags/v')
78
+ runs-on: ubuntu-latest
79
+ permissions:
80
+ contents: read
81
+ packages: write
82
+ steps:
83
+ - name: Download digests
84
+ uses: actions/download-artifact@v4
85
+ with:
86
+ pattern: digests-deps-*
87
+ path: /tmp/digests
88
+ merge-multiple: true
89
+
90
+ - name: Set up Docker Buildx
91
+ uses: docker/setup-buildx-action@v3
92
+
93
+ - name: Log in to the Container registry
94
+ uses: docker/login-action@v3
95
+ with:
96
+ registry: ${{ env.REGISTRY }}
97
+ username: ${{ github.actor }}
98
+ password: ${{ secrets.GITHUB_TOKEN }}
99
+
100
+ - name: Extract Docker metadata
101
+ id: meta
102
+ uses: docker/metadata-action@v5
103
+ with:
104
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
105
+ tags: |
106
+ type=semver,pattern={{version}}
107
+ type=raw,value=latest
108
+
109
+ - name: Create manifest list and push
110
+ working-directory: /tmp/digests
111
+ run: |
112
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
113
+ $(printf '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
@@ -0,0 +1,117 @@
1
+ name: Build Platform Images
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ env:
7
+ REGISTRY: ghcr.io
8
+
9
+ jobs:
10
+ build:
11
+ name: Build (${{ matrix.component }}, ${{ matrix.platform.arch }})
12
+ runs-on: ${{ matrix.platform.os }}
13
+ permissions:
14
+ contents: read
15
+ packages: write
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ component: [airflow, spark, ray-mlops]
20
+ platform:
21
+ - os: ubuntu-latest
22
+ arch: linux/amd64
23
+ name: amd64
24
+ - os: ubuntu-24.04-arm
25
+ arch: linux/arm64
26
+ name: arm64
27
+ steps:
28
+ - name: Checkout repository
29
+ uses: actions/checkout@v4
30
+
31
+ - name: Set up Docker Buildx
32
+ uses: docker/setup-buildx-action@v3
33
+
34
+ - name: Log in to the Container registry
35
+ uses: docker/login-action@v3
36
+ with:
37
+ registry: ${{ env.REGISTRY }}
38
+ username: ${{ github.actor }}
39
+ password: ${{ secrets.GITHUB_TOKEN }}
40
+
41
+ - name: Extract Docker metadata
42
+ id: meta
43
+ uses: docker/metadata-action@v5
44
+ with:
45
+ images: ${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }}
46
+
47
+ - name: Build and push by digest
48
+ id: build
49
+ uses: docker/build-push-action@v5
50
+ with:
51
+ context: src/odctl/resources/docker/${{ matrix.component }}
52
+ platforms: ${{ matrix.platform.arch }}
53
+ labels: ${{ steps.meta.outputs.labels }}
54
+ outputs: type=image,name=${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }},push-by-digest=true,name-canonical=true,push=${{ startsWith(github.ref, 'refs/tags/v') }}
55
+ cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }}:buildcache-${{ matrix.platform.name }}
56
+ cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }}:buildcache-${{ matrix.platform.name }},mode=max
57
+
58
+ - name: Export digest
59
+ if: startsWith(github.ref, 'refs/tags/v')
60
+ run: |
61
+ mkdir -p /tmp/digests
62
+ digest="${{ steps.build.outputs.digest }}"
63
+ touch "/tmp/digests/${digest#sha256:}"
64
+
65
+ - name: Upload digest
66
+ if: startsWith(github.ref, 'refs/tags/v')
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: digests-${{ matrix.component }}-${{ matrix.platform.name }}
70
+ path: /tmp/digests/*
71
+ if-no-files-found: error
72
+ retention-days: 1
73
+
74
+ merge:
75
+ name: Merge & Tag (${{ matrix.component }})
76
+ needs: build
77
+ if: startsWith(github.ref, 'refs/tags/v')
78
+ runs-on: ubuntu-latest
79
+ permissions:
80
+ contents: read
81
+ packages: write
82
+ strategy:
83
+ fail-fast: false
84
+ matrix:
85
+ component: [airflow, spark, ray-mlops]
86
+ steps:
87
+ - name: Download digests
88
+ uses: actions/download-artifact@v4
89
+ with:
90
+ pattern: digests-${{ matrix.component }}-*
91
+ path: /tmp/digests
92
+ merge-multiple: true
93
+
94
+ - name: Set up Docker Buildx
95
+ uses: docker/setup-buildx-action@v3
96
+
97
+ - name: Log in to the Container registry
98
+ uses: docker/login-action@v3
99
+ with:
100
+ registry: ${{ env.REGISTRY }}
101
+ username: ${{ github.actor }}
102
+ password: ${{ secrets.GITHUB_TOKEN }}
103
+
104
+ - name: Extract Docker metadata
105
+ id: meta
106
+ uses: docker/metadata-action@v5
107
+ with:
108
+ images: ${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }}
109
+ tags: |
110
+ type=semver,pattern={{version}}
111
+ type=raw,value=latest
112
+
113
+ - name: Create manifest list and push
114
+ working-directory: /tmp/digests
115
+ run: |
116
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
117
+ $(printf '${{ env.REGISTRY }}/${{ github.repository }}/${{ matrix.component }}@sha256:%s ' *)
@@ -0,0 +1,39 @@
1
+ name: CI
2
+
3
+ on:
4
+ workflow_call:
5
+ workflow_dispatch:
6
+
7
+
8
+ jobs:
9
+ test:
10
+ name: Python ${{ matrix.python-version }}
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
16
+ steps:
17
+ - name: Checkout source code
18
+ uses: actions/checkout@v7
19
+
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v7
22
+ with:
23
+ enable-cache: true
24
+
25
+ - name: Set up Python ${{ matrix.python-version }}
26
+ run: uv python install ${{ matrix.python-version }}
27
+
28
+ - name: Run pre-commit
29
+ uses: pre-commit/action@v3.0.1
30
+
31
+ - name: Run Tests
32
+ # Target your test folder and output coverage for src/odctl
33
+ run: uv run --with pytest-cov pytest tests/ --cov=src/odctl --cov-report=xml
34
+
35
+ # - name: Upload coverage reports to Codecov
36
+ # uses: codecov/codecov-action@v4
37
+ # with:
38
+ # token: ${{ secrets.CODECOV_TOKEN }}
39
+ # file: ./coverage.xml
@@ -0,0 +1,83 @@
1
+ name: End-to-End Integration Tests
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+
7
+
8
+ jobs:
9
+ e2e:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: read
14
+ strategy:
15
+ matrix:
16
+ profile_group:
17
+ - "metadata"
18
+ - "airflow"
19
+ - "kafka-lite kafka-full"
20
+ - "flink1-lite flink1-full fluss"
21
+ - "spark-lite spark-full"
22
+ - "ch-lite ch-full"
23
+ - "trino metabase"
24
+ - "mlflow ray-serve"
25
+ - "lineage telemetry"
26
+ - "postgres storage catalog valkey"
27
+ steps:
28
+ - name: Checkout repository
29
+ uses: actions/checkout@v4
30
+
31
+ - name: Install uv
32
+ uses: astral-sh/setup-uv@v4
33
+
34
+ - name: Set up Python
35
+ run: uv python install 3.10
36
+
37
+ - name: Install odctl
38
+ run: uv tool install .
39
+
40
+ - name: Initialize odctl workspace
41
+ run: yes | odctl init --force
42
+
43
+ - name: Login to GitHub Container Registry
44
+ uses: docker/login-action@v3
45
+ with:
46
+ registry: ghcr.io
47
+ username: ${{ github.actor }}
48
+ password: ${{ secrets.GITHUB_TOKEN }}
49
+
50
+ - name: Test Profile Group
51
+ run: |
52
+ # Split the space-separated group into an array
53
+ for profile in ${{ matrix.profile_group }}; do
54
+ echo "::group::Testing Profile: $profile"
55
+ echo "๐Ÿš€ Launching $profile..."
56
+ odctl up $profile
57
+
58
+ echo "โณ Validating containers..."
59
+ SUCCESS=0
60
+ for i in {1..15}; do
61
+ RUNNING=$(docker ps -q | wc -l)
62
+ if [ "$RUNNING" -ge 1 ]; then
63
+ echo "โœ… Containers are running!"
64
+ docker ps
65
+ odctl ps --all
66
+ SUCCESS=1
67
+ break
68
+ fi
69
+ echo "Waiting... ($i/15)"
70
+ sleep 2
71
+ done
72
+
73
+ if [ "$SUCCESS" -eq 0 ]; then
74
+ echo "โŒ Timeout reached: No containers are running for $profile!"
75
+ docker ps -a
76
+ odctl ps --all
77
+ exit 1
78
+ fi
79
+
80
+ echo "๐Ÿงน Tearing down $profile..."
81
+ yes | odctl down --all --volumes
82
+ echo "::endgroup::"
83
+ done
@@ -0,0 +1,34 @@
1
+ name: Main Pipeline
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ tags: ["v*"]
7
+ pull_request:
8
+ branches: ["main"]
9
+ workflow_dispatch:
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ permissions:
16
+ contents: read
17
+ packages: write
18
+
19
+ jobs:
20
+ ci:
21
+ uses: ./.github/workflows/ci.yml
22
+
23
+ build-platform:
24
+ needs: ci
25
+ uses: ./.github/workflows/build-platform-images.yml
26
+
27
+ build-deps:
28
+ needs: ci
29
+ uses: ./.github/workflows/build-deps.yml
30
+
31
+ e2e:
32
+ needs: [build-platform, build-deps]
33
+ if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
34
+ uses: ./.github/workflows/e2e-test.yml
@@ -0,0 +1,34 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published] # ONLY triggers when a drafted release is published
6
+
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+ jobs:
12
+ pypi-publish:
13
+ name: Build and publish Python package
14
+ runs-on: ubuntu-latest
15
+ # These permissions are strictly required for PyPI OIDC Trusted Publishing
16
+ permissions:
17
+ contents: read
18
+ id-token: write
19
+
20
+ steps:
21
+ - name: Checkout source code
22
+ uses: actions/checkout@v7
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v7
26
+
27
+ - name: Set up Python
28
+ run: uv python install 3.10
29
+
30
+ - name: Build Wheel and sdist
31
+ run: uv build
32
+
33
+ - name: Publish package distributions to PyPI
34
+ uses: pypa/gh-action-pypi-publish@release/v1