{"id":23919189,"url":"https://github.com/seebi/cimd","last_synced_at":"2026-02-15T20:32:11.054Z","repository":{"id":271014191,"uuid":"912011125","full_name":"seebi/cimd","owner":"seebi","description":"Collect and share metadata of CI/CD processes.","archived":false,"fork":false,"pushed_at":"2025-04-05T15:16:04.000Z","size":1319,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-05T07:28:33.505Z","etag":null,"topics":["cicd","command-line-tool","gitlab-ci","json-schema","metadata","python"],"latest_commit_sha":null,"homepage":"","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/seebi.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-04T13:08:49.000Z","updated_at":"2025-10-09T11:59:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"9c074e8e-2b83-4991-92ab-3a18fd9bcaab","html_url":"https://github.com/seebi/cimd","commit_stats":null,"previous_names":["seebi/cimd"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/seebi/cimd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seebi%2Fcimd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seebi%2Fcimd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seebi%2Fcimd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seebi%2Fcimd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seebi","download_url":"https://codeload.github.com/seebi/cimd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seebi%2Fcimd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29488554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T19:29:10.908Z","status":"ssl_error","status_checked_at":"2026-02-15T19:29:10.419Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cicd","command-line-tool","gitlab-ci","json-schema","metadata","python"],"created_at":"2025-01-05T14:29:56.752Z","updated_at":"2026-02-15T20:32:11.040Z","avatar_url":"https://github.com/seebi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD012 MD013 MD024 MD033 --\u003e\n\u003c!-- https://github.com/DavidAnson/markdownlint?tab=readme-ov-file#configuration --\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/seebi/cimd/refs/heads/main/docs/cimd.svg\" alt=\"Logo\" width=\"128\"\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003ecimd\u003c/strong\u003e is about collecting and sharing structured metadata of CI/CD processes.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cstrong\u003ecimd\u003c/strong\u003e is an acronym for \u003cstrong\u003eC\u003c/strong\u003eontinuous \u003cstrong\u003eI\u003c/strong\u003entegration \u003cstrong\u003eM\u003c/strong\u003eeta \u003cstrong\u003eD\u003c/strong\u003eata.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#motivation\"\u003e🤓 Motivation\u003c/a\u003e\n  ···\n  \u003ca href=\"#features\"\u003e🚀 Features\u003c/a\u003e\n  ···\n  \u003ca href=\"#installation\"\u003e⚙️ Installation\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#development\"\u003e🐍 Development\u003c/a\u003e\n  ···\n  \u003ca href=\"#specification\"\u003e📄 Specification\u003c/a\u003e\n  ···\n  \u003ca href=\"#similar-projects\"\u003eℹ️  Similar Project\u003c/a\u003e\n\n\u003c/p\u003e\n\n## Badges\n\n![User Script][userscript] [![Greasy Fork Entry][greasyfork-shield]][cimd-greasyfork] [![Sources][js-source-shield]][userscript-github]\u003cbr /\u003e\n![Python Package][python-package] [![pypi-version][pypi-version-shield]][pypi-link] [![pypi-version][pypi-downloads-shield]][pypi-link] [![python-versions][python-versions-shield]][pypi-link]\u003cbr /\u003e\n![Docker Image:][docker-image] [![docker][docker-pulls-shield]][docker-link] [![docker][docker-size-shield]][docker-link] [![Base Image][base-image-shield]][base-image-link]\u003cbr /\u003e\n![Used Tools:][used-tools] [![poetry][poetry-shield]][poetry-link] [![copier][copier-shield]][copier] [![task][task-shield]][task-link]\u003cbr /\u003e\n![Code and License][code-and-license] [![license-shield]][license-link] [![ruff][ruff-shield]][ruff-link] [![mypy][mypy-shield]][mypy-link]\u003cbr /\u003e\n![Github Stats][github-stats] [![Github Issues][issues-shield]][issues-link] [![Github Action][action-shield]][action-link] [![Github Commits][commit-activity-shield]][commit-activity-link]\u003cbr /\u003e\n\n## Motivation\n\nTo enable a fast overview of recent pipelines and their metadata in a GitLab-managed repository, this project provides the backend and frontend capabilities to extend the GitLab pipeline list with a custom metadata column.\n\nGitLab already has some metadata mechanisms (e.g. [coverage patterns](https://docs.gitlab.com/ee/ci/testing/code_coverage.html#test-coverage-examples)), but they are limited to a specific scope.\n\nThe basic idea of this project is to prepare and provide extensible metadata artefacts on a well-known position, which can be easily fetched and parsed by a custom user script to extend the pipeline list with metadata item representations.\n\n\n## Features\n\n**cimd** contains of a command line tool (CLI) and a frontend user script.\n\n### Frontend\n\nThe frontend is available as a single JavaScript file in the [js folder][userscript-github].\nIt is currently tested with Tampermonkey on Google Chrome only 🙈.\nOnce activated, it will extend the pipeline view of your [![cmid metadata enabled][cmid-metadata-enabled]][cmid-metadata-enabled] GitLab project with a metadata column, showing the items (screenshot example below).\n\n![UI Example](https://raw.githubusercontent.com/seebi/cimd/refs/heads/main/docs/ui-example-v0.8.2.png \"UI Example\")\n\n### Command Line Tool\n\nThe CLI is used to prepare and manipulate metadata items in a `__metadata__.json` document.\n\nIt has the following features:\n\n- commands for basic CRUD operations:\n  - `add` - add a metadata item\n  - `delete` - delete metadata items\n  - `get` - get data of a metadata item\n  - `list` - list metadata items\n- `extract` command group, which collects commands to extract metadata items from different sources:\n  - `coverage-xml` - extract metadata from a Coverage XML output files\n  - `junit-xml` - extract metadata from JUnit XML output files\n  - `pipeline-logs` - extract metadata from gitlab pipeline job logs\n  - `trivy-scan` - extract metadata from Trivy scan JSON output files\n- `extend` command group, which collects commands to extend metadata items in a special way:\n  - `gitlab-link` - extend metadata items with a raw gitlab artifact link\n  - `shields-badge` - extend metadata items with a [shields.io](https://shields.io) badge\n\n## Installation\n\n### Frontend\n\nTo install the **frontend userscript** with a user script manager such as Tampermonkey, you have the following options:\n\n- Recommended: Go to the [greasyfork.org][cimd-greasyfork] entry of cimd and click the install button.\n- Create a new script entry and copy/paste the content of the script from the [js folder][userscript-github].\n\nAfter installation, feel free to go to the example pipeline list at [gitlab.com/seebi/gitlab-pipeline-metadata][example-pipeline-list].\n\n### Command Line Tool\n\nTo install and use the **cimd command line interface**, you have all the options the python ecosystem provides:\n\n- Recommended ... via [pipx](https://pipx.pypa.io/stable/)\n\n  ``` shell\n  pipx install cimd\n  ```\n\n- The cool way ... via [uv](https://docs.astral.sh/uv/guides/tools/)\n\n  ``` shell\n  uvx cimd\n  ```\n\n- There is also a [docker image][docker-link] ...\n\n  ``` shell\n  docker run -i -t --rm -v $(pwd):/data seebi/cimd\n  ```\n\n## Development\n\n- Run [task](https://taskfile.dev/) to see all major development tasks.\n- Use [pre-commit](https://pre-commit.com/) to avoid errors before commit.\n- This repository was created with [this copier template](https://github.com/eccenca/cmem-plugin-template).\n\n\n## Specification\n\nThis section describes the details about the JSON data artifact (`__metadata__.json`) which holds your pipeline metadata.\n\n### Location\n\nIn your pipeline description, create a job which provides a JSON artifact adhering to the schema at the path `__metadata__.json`.\n\nAn example `.gitlab-ci.yml`, which creates some basic metadata items, is available at [gitlab.com/seebi/gitlab-pipeline-metadata][example-pipeline].\n\n### Content\n\nThe content of the `__metadata__.json` is a simple structure to describe separate metadata items.\n\n\u003cdetails\u003e\nThe minimal version of a metadata item has simply a `value` key.\n\n``` json\n{\n    \"items\": {\n        \"coverage\": {\n            \"value\": \"87%\"\n        }\n    }\n}\n```\n\nIn addition to that, the following optional keys can be used for a metadata item: `label`, `description`, `image`, `link` and `comment`.\n\n``` json\n{\n    \"items\": {\n        \"coverage\": {\n            \"value\": \"87\",\n            \"comment\": \"'value' is the only mandatory key of a metadata item.\"\n        },\n        \"jobs\": {\n            \"value\": \"15\",\n            \"label\": \"Jobs\",\n            \"description\": \"Number of overall jobs executed in the pipeline.\",\n            \"comment\": \"'label' and 'description' can be used to enhance the UI.\"\n        },\n        \"security_issues\": {\n            \"value\": \"4\",\n            \"image\": \"https://img.shields.io/badge/security%20issues-4-red\",\n            \"link\": \"https://example.org/security_issues\",\n            \"comment\": \"We all love badges - and clickable badges are even better.\"\n        }\n    }\n}\n```\n\nHereinafter you will find some comments on the optional field:\n\n- `label` - A human readable label for a metadata item. If present, it should be used by the frontend instead of the item identifier.\n- `description` - A description of the metadata item. If present, can be used as on-hover text in the frontend for an item.\n- `image` - An optional link to an image representation of the item (e.g. a shields.io image). If present, it should be used instead of the ID/Label/Value representation of the item. Images should be rendered with max-height/width.\n- `link` - If present, the metadata item representation is click-able.\n- `comment` - will be ignored by the frontend, for debugging only.\n\n\u003c/details\u003e\n\n### Schema\n\nThe proposed JSON structure is formalized as a [JSON Schema](https://json-schema.org/) which is available at [schema/schema.json][schema-github] or can be visualized in the [json-schema-viewer@vercel.app][schema-app].\n\n\n## Similar Projects\n\n[💬 Drop me a note](https://github.com/seebi/cimd/issues/new) if you miss a project here ...\n\n- [github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark) - is a GitHub Action for continuous benchmarking to keep performance\n\n\n[poetry-link]: https://python-poetry.org/\n[poetry-shield]: https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json\n[ruff-link]: https://docs.astral.sh/ruff/\n[ruff-shield]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\u0026label=Code%20Style\n[mypy-link]: https://mypy-lang.org/\n[mypy-shield]: https://www.mypy-lang.org/static/mypy_badge.svg\n[copier]: https://copier.readthedocs.io/\n[copier-shield]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-purple.json\n[docker-link]: https://hub.docker.com/r/seebi/cimd\n[docker-pulls-shield]: https://img.shields.io/docker/pulls/seebi/cimd?logo=docker\u0026logoColor=white\n[docker-size-shield]: https://img.shields.io/docker/image-size/seebi/cimd/latest?logo=docker\u0026logoColor=white\n[action-link]: https://github.com/seebi/cimd/actions\n[action-shield]: https://github.com/seebi/cimd/actions/workflows/check.yml/badge.svg\n[commit-activity-shield]: https://img.shields.io/github/commit-activity/y/seebi/cimd?logo=github\u0026logoColor=white\n[commit-activity-link]: https://github.com/seebi/cimd/pulse/monthly\n[license-link]: https://github.com/seebi/cimd?tab=Apache-2.0-1-ov-file\n[license-shield]: https://img.shields.io/pypi/l/cimd?logo=apache\u0026logoColor=white\n[pypi-link]: https://pypi.org/project/cimd\n[pypi-version-shield]: https://img.shields.io/pypi/v/cimd?logo=pypi\u0026logoColor=white\n[pypi-downloads-shield]: https://img.shields.io/pypi/dm/cimd?logo=pypi\u0026logoColor=white\n[python-versions-shield]: https://img.shields.io/pypi/pyversions/cimd?logo=python\u0026logoColor=white\n[issues-shield]: https://img.shields.io/github/issues/seebi/cimd?logo=github\u0026logoColor=white\n[issues-link]: https://github.com/seebi/cimd/issues\n[base-image-shield]: https://img.shields.io/badge/FROM-ubi9--minimal-orange?logo=redhat\n[base-image-link]: https://hub.docker.com/r/redhat/ubi9-minimal/tags\n[task-shield]: https://img.shields.io/badge/Taskfile-Enabled-brightgreen?logo=task\u0026logoColor=white\n[task-link]: https://taskfile.dev/\n[greasyfork-shield]: https://img.shields.io/badge/Greasy_Fork-Available-black?labelColor=darkred\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3ggEBCQHM3fXsAAAAVdJREFUOMudkz2qwkAUhc/goBaGJBgUtBCZyj0ILkpwAW7Bws4yO3AHLiCtEFD8KVREkoiFxZzX5A2KGfN4F04zMN+ce+5c4LMUgDmANYBnrnV+plBSi+FwyHq9TgA2LQpvCiEiABwMBtzv95RSfoNEHy8DYBzHrNVqVEr9BWKcqNFoxF6vx3a7zc1mYyC73a4MogBg7vs+z+czO50OW60Wt9stK5UKp9Mpj8cjq9WqDTBHnjAdxzGQZrPJw+HA31oulzbAWgLoA0CWZVBKIY5jzGYzdLtdE9DlcrFNrY98zobqOA6TJKHW2jg4nU5sNBpFDp6mhVe5rsvVasUwDHm9Xqm15u12o+/7Hy0gD8KatOd5vN/v1FozTVN6nkchxFuI6hsAAIMg4OPxMJCXdtTbR7JJCMEgCJhlGUlyPB4XfumozInrupxMJpRSRtZlKoNYl+m/6/wDuWAjtPfsQuwAAAAASUVORK5CYII=\n[js-source-shield]: https://img.shields.io/badge/GitHub-Source-blue?logo=Javascript\n\n[code-and-license]: https://img.shields.io/badge/Code_and_License_%3E-gray?color=white\n[github-stats]: https://img.shields.io/badge/Github_Stats_%3E%3E%3E%3E-gray?color=white\n[userscript]: https://img.shields.io/badge/Frontend_Script_%3E%3E-gray?color=white\n[python-package]: https://img.shields.io/badge/Python_Package_%3E%3E-gray?color=white\n[docker-image]: https://img.shields.io/badge/Docker_Image_%3E%3E%3E-gray?color=white\n[used-tools]: https://img.shields.io/badge/Used_Tools_%3E%3E%3E%3E%3E-gray?color=white\n\n[userscript-github]: https://github.com/seebi/cimd/blob/main/js/\n\n[schema-app]: https://json-schema-viewer.vercel.app/view?url=https://raw.githubusercontent.com/seebi/cimd/refs/heads/main/schema/schema.json\u0026description_is_markdown=on\u0026expand_buttons=on\u0026show_breadcrumbs=on\u0026show_toc=on\u0026with_footer=on\u0026template_name=js#items_pattern1\n[schema-github]: https://github.com/seebi/cimd/blob/main/schema/schema.json\n[example-pipeline]: https://gitlab.com/seebi/gitlab-pipeline-metadata/-/blob/main/.gitlab-ci.yml?ref_type=eb2b4498\n[cimd-greasyfork]: https://greasyfork.org/en/scripts/530296-gitlab-pipeline-metadata-via-cimd\n\n[cmid-metadata-enabled]: https://img.shields.io/badge/%7Bcimd%7D-metadata_enabled-gray?labelColor=orange\n[example-pipeline-list]: https://gitlab.com/seebi/gitlab-pipeline-metadata/-/pipelines\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseebi%2Fcimd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseebi%2Fcimd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseebi%2Fcimd/lists"}