{"id":19307374,"url":"https://github.com/artefactory/vertex-pipelines-deployer","last_synced_at":"2025-07-08T03:40:39.375Z","repository":{"id":232971011,"uuid":"692002690","full_name":"artefactory/vertex-pipelines-deployer","owner":"artefactory","description":"Check, compile, upload, run and schedule Vertex Pipelines in a standardized manner.","archived":false,"fork":false,"pushed_at":"2024-05-24T11:59:38.000Z","size":1063,"stargazers_count":9,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2024-05-28T22:02:11.737Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://artefactory.github.io/vertex-pipelines-deployer/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artefactory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-15T10:50:16.000Z","updated_at":"2024-05-30T15:31:15.897Z","dependencies_parsed_at":"2024-05-30T15:31:15.252Z","dependency_job_id":"c0d0f53c-27bb-4693-a4ec-535dd84301d6","html_url":"https://github.com/artefactory/vertex-pipelines-deployer","commit_stats":null,"previous_names":["artefactory/vertex-pipelines-deployer"],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artefactory%2Fvertex-pipelines-deployer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artefactory%2Fvertex-pipelines-deployer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artefactory%2Fvertex-pipelines-deployer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artefactory%2Fvertex-pipelines-deployer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artefactory","download_url":"https://codeload.github.com/artefactory/vertex-pipelines-deployer/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223896951,"owners_count":17221475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T00:10:44.281Z","updated_at":"2024-11-10T00:10:44.924Z","avatar_url":"https://github.com/artefactory.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n    \u003ch1 align=\"center\"\u003eVertex Pipelines Deployer\u003c/h1\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ca href=\"https://www.artefact.com/\"\u003e\n        \u003cimg src=\"docs/assets/logo.svg\" style=\"max-width:50%;height:auto;background-color:#111146;\" alt=\"Artefact Skaff Logo\"/\u003e\n        \u003c/a\u003e\n    \u003c/p\u003e\n    \u003ch3 align=\"center\"\u003eDeploy Vertex Pipelines within minutes\u003c/h3\u003e\n        \u003cp align=\"center\"\u003e\n        This tool is a wrapper around \u003ca href=\"https://www.kubeflow.org/docs/components/pipelines/v2/hello-world/\"\u003ekfp\u003c/a\u003e and \u003ca href=\"https://cloud.google.com/python/docs/reference/aiplatform/latest\"\u003egoogle-cloud-aiplatform\u003c/a\u003e that allows you to check, compile, upload, run, and schedule Vertex Pipelines in a standardized manner.\n        \u003c/p\u003e\n\u003c/div\u003e\n\u003cbr /\u003e\n\n\u003c!-- PROJECT SHIELDS --\u003e\n\u003cdiv align=\"center\"\u003e\n\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/vertex-deployer?logo=python)\n![PyPI - Status](https://img.shields.io/pypi/v/vertex-deployer)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/vertex-deployer?color=blue)\n![PyPI - License](https://img.shields.io/pypi/l/vertex-deployer)\n\n[![CI](https://github.com/artefactory/vertex-pipelines-deployer/actions/workflows/ci.yaml/badge.svg?branch=main\u0026event=push)](https://github.com/artefactory/vertex-pipelines-deployer/actions/workflows/ci.yaml)\n[![Release](https://github.com/artefactory/vertex-pipelines-deployer/actions/workflows/release.yaml/badge.svg?branch=main\u0026event=push)](https://github.com/artefactory/vertex-pipelines-deployer/actions/workflows/release.yaml)\n\n[![Pre-commit](https://img.shields.io/badge/pre--commit-enabled-informational?logo=pre-commit\u0026logoColor=white)](https://github.com/ornikar/vertex-eduscore/blob/develop/.pre-commit-config.yaml)\n[![Linting: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat)](https://pycqa.github.io/isort/)\n\n\u003c/div\u003e\n\n\n\u003cdetails\u003e\n  \u003csummary\u003e📚 Table of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\u003ca href=\"#-why-this-tool\"\u003eWhy this tool?\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#-prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#-installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n        \u003col\u003e\n            \u003cli\u003e\u003ca href=\"#from-git-repo\"\u003eFrom git repo\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#from-artifact-registry-not-available-in-pypi-yet\"\u003eFrom Artifact Registry (not available in PyPI yet)\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#add-to-requirements\"\u003eAdd to requirements\u003c/a\u003e\u003c/li\u003e\n        \u003c/ol\u003e\n    \u003cli\u003e\u003ca href=\"#-usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n        \u003col\u003e\n            \u003cli\u003e\u003ca href=\"#-setup\"\u003eSetup\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#-folder-structure\"\u003eFolder Structure\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#-cli-deploying-a-pipeline-with-deploy\"\u003eCLI: Deploying a Pipeline with `deploy`\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#-cli-checking-pipelines-are-valid-with-check\"\u003eCLI: Checking Pipelines are valid with `check`\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#-cli-other-commands\"\u003eCLI: Other commands\u003c/a\u003e\u003c/li\u003e\n                \u003col\u003e\n                    \u003cli\u003e\u003ca href=\"#config\"\u003e`config`\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"#create\"\u003e`create`\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"#init\"\u003e`init`\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"#list\"\u003e`list`\u003c/a\u003e\u003c/li\u003e\n                \u003c/ol\u003e\n        \u003c/ol\u003e\n    \u003cli\u003e\u003ca href=\"#cli-options\"\u003eCLI: Options\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n[Full CLI documentation](docs/CLI_REFERENCE.md)\n\n\n## ❓ Why this tool?\n\u003c!-- --8\u003c-- [start:why] --\u003e\n\nThree use cases:\n\n1. **CI:** Check pipeline validity.\n2. **Dev mode:** Quickly iterate over your pipelines by compiling and running them in multiple environments (test, dev, staging, etc.) without duplicating code or searching for the right kfp/aiplatform snippet.\n3. **CD:** Deploy your pipelines to Vertex Pipelines in a standardized manner in your CD with Cloud Build or GitHub Actions.\n\n\nTwo main commands:\n\n- `check`: Check your pipelines (imports, compile, check configs validity against pipeline definition).\n- `deploy`: Compile, upload to Artifact Registry, run, and schedule your pipelines.\n\n\u003c!-- --8\u003c-- [end:why] --\u003e\n\n## 📋 Prerequisites\n\u003c!-- --8\u003c-- [start:prerequisites] --\u003e\n\n- Unix-like environment (Linux, macOS, WSL, etc.)\n- Python 3.8 to 3.10\n- Google Cloud SDK\n- A GCP project with Vertex Pipelines enabled\n\u003c!-- --8\u003c-- [end:prerequisites] --\u003e\n\n## 📦 Installation\n\u003c!-- --8\u003c-- [start:installation] --\u003e\n### From PyPI\n\n```bash\npip install vertex-deployer\n```\n\n### From git repo\n\nStable version:\n```bash\npip install git+https://github.com/artefactory/vertex-pipelines-deployer.git@main\n```\n\nDevelop version:\n```bash\npip install git+https://github.com/artefactory/vertex-pipelines-deployer.git@develop\n```\n\nIf you want to test this package on examples from this repo:\n```bash\ngit clone git@github.com:artefactory/vertex-pipelines-deployer.git\npoetry install\npoetry shell  # if you want to activate the virtual environment\ncd example\n```\n\u003c!-- --8\u003c-- [end:installation] --\u003e\n\n## 🚀 Usage\n\u003c!-- --8\u003c-- [start:setup] --\u003e\n### 🛠️ Setup\n\n1. Setup your GCP environment:\n```bash\nexport PROJECT_ID=\u003cgcp_project_id\u003e\ngcloud config set project $PROJECT_ID\ngcloud auth login\ngcloud auth application-default login\n```\n\n2. You need the following APIs to be enabled:\n- Cloud Build API\n- Artifact Registry API\n- Cloud Storage API\n- Vertex AI API\n```bash\ngcloud services enable \\\n    cloudbuild.googleapis.com \\\n    artifactregistry.googleapis.com \\\n    storage.googleapis.com \\\n    aiplatform.googleapis.com\n```\n\n3. Create an artifact registry repository for your base images (Docker format):\n```bash\nexport GAR_DOCKER_REPO_ID=\u003cyour_gar_repo_id_for_images\u003e\nexport GAR_LOCATION=\u003cyour_gar_location\u003e\ngcloud artifacts repositories create ${GAR_DOCKER_REPO_ID} \\\n    --location=${GAR_LOCATION} \\\n    --repository-format=docker\n```\n\n4. Build and upload your base images to the repository. To do so, please follow Google Cloud Build documentation.\n\n5. Create an artifact registry repository for your pipelines (KFP format):\n```bash\nexport GAR_PIPELINES_REPO_ID=\u003cyour_gar_repo_id_for_pipelines\u003e\ngcloud artifacts repositories create ${GAR_PIPELINES_REPO_ID} \\\n    --location=${GAR_LOCATION} \\\n    --repository-format=kfp\n```\n\n6. Create a GCS bucket for Vertex Pipelines staging:\n```bash\nexport GCP_REGION=\u003cyour_gcp_region\u003e\nexport VERTEX_STAGING_BUCKET_NAME=\u003cyour_bucket_name\u003e\ngcloud storage buckets create gs://${VERTEX_STAGING_BUCKET_NAME} --location=${GCP_REGION}\n```\n\n7. Create a service account for Vertex Pipelines:\n```bash\nexport VERTEX_SERVICE_ACCOUNT_NAME=foobar\nexport VERTEX_SERVICE_ACCOUNT=\"${VERTEX_SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com\"\n\ngcloud iam service-accounts create ${VERTEX_SERVICE_ACCOUNT_NAME}\n\ngcloud projects add-iam-policy-binding ${PROJECT_ID} \\\n    --member=\"serviceAccount:${VERTEX_SERVICE_ACCOUNT}\" \\\n    --role=\"roles/aiplatform.user\"\n\ngcloud storage buckets add-iam-policy-binding gs://${VERTEX_STAGING_BUCKET_NAME} \\\n    --member=\"serviceAccount:${VERTEX_SERVICE_ACCOUNT}\" \\\n    --role=\"roles/storage.objectUser\"\n\ngcloud artifacts repositories add-iam-policy-binding ${GAR_PIPELINES_REPO_ID} \\\n   --location=${GAR_LOCATION} \\\n   --member=\"serviceAccount:${VERTEX_SERVICE_ACCOUNT}\" \\\n   --role=\"roles/artifactregistry.admin\"\n```\n\u003c!-- --8\u003c-- [end:setup] --\u003e\nYou can use the deployer CLI (see example below) or import [`VertexPipelineDeployer`](deployer/pipeline_deployer.py) in your code (try it yourself).\n\n### 📁 Folder Structure\n\n\u003c!-- --8\u003c-- [start:folder_structure] --\u003e\nYou must respect the following folder structure. If you already follow the\n[Vertex Pipelines Starter Kit folder structure](https://github.com/artefactory/vertex-pipeline-starter-kit), it should be pretty smooth to use this tool:\n\n```\nvertex\n├─ configs/\n│  └─ {pipeline_name}\n│     └─ {config_name}.json\n└─ pipelines/\n   └─ {pipeline_name}.py\n```\n\n!!! tip \"About folder structure\"\n    You must have at least these files. If you need to share some config elements between pipelines,\n    you can have a `shared` folder in `configs` and import them in your pipeline configs.\n\n    If you're following a different folder structure, you can change the default paths in the `pyproject.toml` file.\n    See [Configuration](#configuration) section for more information.\n\n#### Pipelines\n\nYour file `{pipeline_name}.py` must contain a function called `{pipeline_name}` decorated using `kfp.dsl.pipeline`.\nIn previous versions, the functions / object used to be called `pipeline` but it was changed to `{pipeline_name}` to avoid confusion with the `kfp.dsl.pipeline` decorator.\n\n```python\n# vertex/pipelines/dummy_pipeline.py\nimport kfp.dsl\n\n# New name to avoid confusion with the kfp.dsl.pipeline decorator\n@kfp.dsl.pipeline()\ndef dummy_pipeline():\n    ...\n\n# Old name\n@kfp.dsl.pipeline()\ndef pipeline():\n    ...\n```\n\n#### Configs\n\nConfig file can be either `.py`, `.json`, `.toml` or `yaml` format.\nThey must be located in the `config/{pipeline_name}` folder.\n\n**Why multiple formats?**\n\n`.py` files are useful to define complex configs (e.g. a list of dicts) while `.json` / `.toml` / `yaml` files are useful to define simple configs (e.g. a string).\nIt also adds flexibility to the user and allows you to use the deployer with almost no migration cost.\n\n**How to format them?**\n\n- `.py` files must be valid python files with two important elements:\n\n    * `parameter_values` to pass arguments to your pipeline\n    * `input_artifacts` if you want to retrieve and create input artifacts to your pipeline.\n    See [Vertex Documentation](https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform.PipelineJob) for more information.\n\n- `.json` files must be valid json files containing only one dict of key: value representing parameter values.\n- `.toml` files must be the same. Please note that TOML sections will be flattened, except for inline tables.\n    Section names will be joined using `\"_\"` separator and this is not configurable at the moment.\n    Example:\n\n    === \"TOML file\"\n        ```toml\n        [modeling]\n        model_name = \"my-model\"\n        params = { lambda = 0.1 }\n        ```\n\n    === \"Resulting parameter values\"\n        ```python\n        {\n            \"modeling_model_name\": \"my-model\",\n            \"modeling_params\": { \"lambda\": 0.1 }\n        }\n        ```\n\n- `.yaml` files must be valid yaml files containing only one dict of key: value representing parameter values.\n\n??? question \"Why are sections flattened when using TOML config files?\"\n    Vertex Pipelines parameter validation and parameter logging to Vertex Experiments are based on the parameter name.\n    If you do not flatten your sections, you'll only be able to validate section names and that they should be of type `dict`.\n\n    Not very useful.\n\n??? question \"Why aren't `input_artifacts` supported in TOML / JSON config files?\"\n    Because it's low on the priority list. Feel free to open a PR if you want to add it.\n\n\n**How to name them?**\n\n`{config_name}.py` or `{config_name}.json` or `{config_name}.toml`. config_name is free but must be unique for a given pipeline.\n\n\n#### Settings\n\nYou will also need the following ENV variables, either exported or in a `.env` file (see example in `example.env`):\n\n```bash\nPROJECT_ID=YOUR_PROJECT_ID  # GCP Project ID\nGCP_REGION=europe-west1  # GCP Region\n\nGAR_LOCATION=europe-west1  # Google Artifact Registry Location\nGAR_PIPELINES_REPO_ID=YOUR_GAR_KFP_REPO_ID  # Google Artifact Registry Repo ID (KFP format)\n\nVERTEX_STAGING_BUCKET_NAME=YOUR_VERTEX_STAGING_BUCKET_NAME  # GCS Bucket for Vertex Pipelines staging\nVERTEX_SERVICE_ACCOUNT=YOUR_VERTEX_SERVICE_ACCOUNT  # Vertex Pipelines Service Account\n```\n\n!!! note \"About env files\"\n    We're using env files and dotenv to load the environment variables.\n    No default value for `--env-file` argument is provided to ensure that you don't accidentally deploy to the wrong project.\n    An [`example.env`](./example/example.env) file is provided in this repo.\n    This also allows you to work with multiple environments thanks to env files (`test.env`, `dev.env`, `prod.env`, etc)\n\u003c!-- --8\u003c-- [end:folder_structure] --\u003e\n\n\u003c!-- --8\u003c-- [start:usage] --\u003e\n### 🚀 CLI: Deploying a Pipeline with `deploy`\n\nLet's say you defined a pipeline in `dummy_pipeline.py` and a config file named `config_test.json`. You can deploy your pipeline using the following command:\n```bash\nvertex-deployer deploy dummy_pipeline \\\n    --compile \\\n    --upload \\\n    --run \\\n    --env-file example.env \\\n    --tags my-tag \\\n    --config-filepath vertex/configs/dummy_pipeline/config_test.json \\\n    --experiment-name my-experiment \\\n    --enable-caching \\\n    --skip-validation\n```\n\n### ✅ CLI: Checking Pipelines are valid with `check`\n\nTo check that your pipelines are valid, you can use the `check` command. It uses a pydantic model to:\n- check that your pipeline imports and definition are valid\n- check that your pipeline can be compiled\n- check that all configs related to the pipeline are respecting the pipeline definition (using a Pydantic model based on pipeline signature)\n\nTo validate one or multiple pipeline(s):\n```bash\nvertex-deployer check dummy_pipeline \u003cother pipeline name\u003e\n```\n\nTo validate all pipelines in the `vertex/pipelines` folder:\n```bash\nvertex-deployer check --all\n```\n\n\n### 🛠️ CLI: Other commands\n\n#### `config`\n\nYou can check your `vertex-deployer` configuration options using the `config` command.\nFields set in `pyproject.toml` will overwrite default values and will be displayed differently:\n```bash\nvertex-deployer config --all\n```\n\n#### `create`\n\nYou can create all files needed for a pipeline using the `create` command:\n```bash\nvertex-deployer create my_new_pipeline --config-type py\n```\n\nThis will create a `my_new_pipeline.py` file in the `vertex/pipelines` folder and a `vertex/config/my_new_pipeline/` folder with multiple config files in it.\n\n#### `init`\n\nTo initialize the deployer with default settings and folder structure, use the `init` command:\n```bash\nvertex-deployer init\n```\n\n```bash\n$ vertex-deployer init\nWelcome to Vertex Deployer!\nThis command will help you getting fired up.\nDo you want to configure the deployer? [y/n]: n\nDo you want to build default folder structure [y/n]: n\nDo you want to create a pipeline? [y/n]: n\nAll done ✨\n```\n\n#### `list`\n\nYou can list all pipelines in the `vertex/pipelines` folder using the `list` command:\n```bash\nvertex-deployer list --with-configs\n```\n\n### 🍭 CLI: Options\n\n```bash\nvertex-deployer --help\n```\n\nTo see package version:\n```bash\nvertex-deployer --version\n```\n\nTo adapt log level, use the `--log-level` option. Default is `INFO`.\n```bash\nvertex-deployer --log-level DEBUG deploy ...\n```\n\n\u003c!-- --8\u003c-- [end:usage] --\u003e\n\n## Configuration\n\nYou can configure the deployer using the `pyproject.toml` file to better fit your needs.\nThis will overwrite default values. It can be useful if you always use the same options, e.g. always the same `--scheduler-timezone`\n\n```toml\n[tool.vertex_deployer]\nvertex_folder_path = \"my/path/to/vertex\"\nlog_level = \"INFO\"\n\n[tool.vertex_deployer.deploy]\nscheduler_timezone = \"Europe/Paris\"\n```\n\nYou can display all the configurable parameterss with default values by running:\n```bash\n$ vertex-deployer config --all\n'*' means the value was set in config file\n\n* vertex_folder_path=my/path/to/vertex\n* log_level=INFO\ndeploy\n  env_file=None\n  compile=True\n  upload=False\n  run=False\n  schedule=False\n  cron=None\n  delete_last_schedule=False\n  * scheduler_timezone=Europe/Paris\n  tags=['latest']\n  config_filepath=None\n  config_name=None\n  enable_caching=False\n  experiment_name=None\ncheck\n  all=False\n  config_filepath=None\n  raise_error=False\nlist\n  with_configs=True\ncreate\n  config_type=json\n```\n\n## Repository Structure\n\n```\n├─ .github\n│  ├─ ISSUE_TEMPLATE/\n│  ├─ workflows\n│  │  ├─ ci.yaml\n│  │  ├─ pr_agent.yaml\n│  │  └─ release.yaml\n│  ├─ CODEOWNERS\n│  └─ PULL_REQUEST_TEMPLATE.md\n├─ deployer                                     # Source code\n│  ├─ __init__.py\n│  ├─ cli.py\n│  ├─ constants.py\n│  ├─ pipeline_checks.py\n│  ├─ pipeline_deployer.py\n│  ├─ settings.py\n│  └─ utils\n│     ├─ config.py\n│     ├─ console.py\n│     ├─ exceptions.py\n│     ├─ logging.py\n│     ├─ models.py\n│     └─ utils.py\n├─ docs/                                        # Documentation folder (mkdocs)\n├─ templates/                                   # Semantic Release templates\n├─ tests/\n├─ example                                      # Example folder with dummy pipeline and config\n|   ├─ example.env\n│   └─ vertex\n│      ├─ components\n│      │  └─ dummy.py\n│      ├─ configs\n│      │  ├─ broken_pipeline\n│      │  │  └─ config_test.json\n│      │  └─ dummy_pipeline\n│      │     ├─ config_test.json\n│      │     ├─ config.py\n│      │     └─ config.toml\n│      ├─ deployment\n│      ├─ lib\n│      └─ pipelines\n│         ├─ broken_pipeline.py\n│         └─ dummy_pipeline.py\n├─ .gitignore\n├─ .pre-commit-config.yaml\n├─ catalog-info.yaml                            # Roadie integration configuration\n├─ CHANGELOG.md\n├─ CONTRIBUTING.md\n├─ LICENSE\n├─ Makefile\n├─ mkdocs.yml                                   # Mkdocs configuration\n├─ pyproject.toml\n└─ README.md\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartefactory%2Fvertex-pipelines-deployer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartefactory%2Fvertex-pipelines-deployer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartefactory%2Fvertex-pipelines-deployer/lists"}