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.
- odctl-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +46 -0
- odctl-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +44 -0
- odctl-0.1.0/.github/renovate.json +70 -0
- odctl-0.1.0/.github/workflows/build-deps.yml +113 -0
- odctl-0.1.0/.github/workflows/build-platform-images.yml +117 -0
- odctl-0.1.0/.github/workflows/ci.yml +39 -0
- odctl-0.1.0/.github/workflows/e2e-test.yml +83 -0
- odctl-0.1.0/.github/workflows/pipeline.yml +34 -0
- odctl-0.1.0/.github/workflows/publish.yml +34 -0
- odctl-0.1.0/.gitignore +225 -0
- odctl-0.1.0/.pre-commit-config.yaml +26 -0
- odctl-0.1.0/.vscode/settings.json +18 -0
- odctl-0.1.0/LICENSE +201 -0
- odctl-0.1.0/PKG-INFO +211 -0
- odctl-0.1.0/README.md +175 -0
- odctl-0.1.0/image/diagram.png +0 -0
- odctl-0.1.0/image/diagram1.drawio +92 -0
- odctl-0.1.0/image/diagram2.drawio +85 -0
- odctl-0.1.0/pyproject.toml +68 -0
- odctl-0.1.0/src/odctl/__init__.py +0 -0
- odctl-0.1.0/src/odctl/config.py +65 -0
- odctl-0.1.0/src/odctl/docker.py +295 -0
- odctl-0.1.0/src/odctl/main.py +520 -0
- odctl-0.1.0/src/odctl/planner.py +133 -0
- odctl-0.1.0/src/odctl/registry.py +66 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/config.xml +52 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/init.sql +2 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/keeper_config.xml +26 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/macros-11.xml +1 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/macros-12.xml +1 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/macros-21.xml +1 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/macros-22.xml +1 -0
- odctl-0.1.0/src/odctl/resources/clickhouse/users.xml +56 -0
- odctl-0.1.0/src/odctl/resources/compose-analytics.yml +243 -0
- odctl-0.1.0/src/odctl/resources/compose-deps.yml +24 -0
- odctl-0.1.0/src/odctl/resources/compose-flink.yml +102 -0
- odctl-0.1.0/src/odctl/resources/compose-infra.yml +144 -0
- odctl-0.1.0/src/odctl/resources/compose-kafka.yml +206 -0
- odctl-0.1.0/src/odctl/resources/compose-metadata.yml +160 -0
- odctl-0.1.0/src/odctl/resources/compose-mlops.yml +74 -0
- odctl-0.1.0/src/odctl/resources/compose-obsv.yml +115 -0
- odctl-0.1.0/src/odctl/resources/compose-orch.yml +126 -0
- odctl-0.1.0/src/odctl/resources/compose-spark.yml +95 -0
- odctl-0.1.0/src/odctl/resources/compose-store.yml +103 -0
- odctl-0.1.0/src/odctl/resources/deps/Dockerfile +72 -0
- odctl-0.1.0/src/odctl/resources/deps/build.gradle +51 -0
- odctl-0.1.0/src/odctl/resources/deps/build_connectors.sh +71 -0
- odctl-0.1.0/src/odctl/resources/deps/fetch_flink_dependencies.sh +47 -0
- odctl-0.1.0/src/odctl/resources/deps/fetch_spark_dependencies.sh +40 -0
- odctl-0.1.0/src/odctl/resources/deps/fetch_standalone_plugins.sh +63 -0
- odctl-0.1.0/src/odctl/resources/docker/airflow/Dockerfile +23 -0
- odctl-0.1.0/src/odctl/resources/docker/ray-mlops/Dockerfile +62 -0
- odctl-0.1.0/src/odctl/resources/docker/spark/Dockerfile +16 -0
- odctl-0.1.0/src/odctl/resources/flink/flink1-conf.yml +58 -0
- odctl-0.1.0/src/odctl/resources/grafana/prometheus.yml +8 -0
- odctl-0.1.0/src/odctl/resources/marquez/marquez.yml +20 -0
- odctl-0.1.0/src/odctl/resources/mlops/serving/lightgbm_inference.py.example +42 -0
- odctl-0.1.0/src/odctl/resources/mlops/serving/vector_search.py.example +44 -0
- odctl-0.1.0/src/odctl/resources/postgres/01-init-databases.sh +47 -0
- odctl-0.1.0/src/odctl/resources/prometheus/alertmanager.yml +6 -0
- odctl-0.1.0/src/odctl/resources/prometheus/prometheus.yml +32 -0
- odctl-0.1.0/src/odctl/resources/registry.yml +289 -0
- odctl-0.1.0/src/odctl/resources/seaweed/s3.json +15 -0
- odctl-0.1.0/src/odctl/resources/spark/log4j2.properties +13 -0
- odctl-0.1.0/src/odctl/resources/spark/spark-defaults.conf +25 -0
- odctl-0.1.0/src/odctl/resources/trino/catalog/clickhouse.properties +4 -0
- odctl-0.1.0/src/odctl/resources/trino/catalog/iceberg.properties +9 -0
- odctl-0.1.0/src/odctl/resources/trino/catalog/postgres.properties +4 -0
- odctl-0.1.0/src/odctl/resources/trino/catalog/valkey.properties +6 -0
- odctl-0.1.0/src/odctl/ui.py +373 -0
- odctl-0.1.0/src/odctl/workspace.py +74 -0
- odctl-0.1.0/tests/conftest.py +41 -0
- odctl-0.1.0/tests/test_cli.py +52 -0
- odctl-0.1.0/tests/test_cli_extended.py +70 -0
- odctl-0.1.0/tests/test_config.py +35 -0
- odctl-0.1.0/tests/test_docker.py +112 -0
- odctl-0.1.0/tests/test_planner.py +63 -0
- odctl-0.1.0/tests/test_registry.py +34 -0
- odctl-0.1.0/tests/test_workspace.py +38 -0
- 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
|