{"id":27221634,"url":"https://github.com/galan/gitlab-panorama","last_synced_at":"2025-08-20T18:57:16.870Z","repository":{"id":143767358,"uuid":"175185907","full_name":"galan/gitlab-panorama","owner":"galan","description":"Visualize the latest pipeline-states for your repositories and branches","archived":false,"fork":false,"pushed_at":"2023-03-07T09:49:05.000Z","size":1201,"stargazers_count":31,"open_issues_count":4,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-20T02:37:34.099Z","etag":null,"topics":["ccmenu","dashboard","gitlab","gitlab-pipeline","shell","wallboard"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/galan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2019-03-12T10:18:11.000Z","updated_at":"2025-04-10T08:35:18.000Z","dependencies_parsed_at":"2023-06-08T03:45:38.972Z","dependency_job_id":null,"html_url":"https://github.com/galan/gitlab-panorama","commit_stats":null,"previous_names":["galan/gitlab-panorama","joblift/gitlab-panorama"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/galan/gitlab-panorama","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galan%2Fgitlab-panorama","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galan%2Fgitlab-panorama/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galan%2Fgitlab-panorama/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galan%2Fgitlab-panorama/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/galan","download_url":"https://codeload.github.com/galan/gitlab-panorama/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galan%2Fgitlab-panorama/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271369143,"owners_count":24747792,"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","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ccmenu","dashboard","gitlab","gitlab-pipeline","shell","wallboard"],"created_at":"2025-04-10T08:01:18.115Z","updated_at":"2025-08-20T18:57:16.834Z","avatar_url":"https://github.com/galan.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"![GitLab panorama](media/gitlab-panorama-02-256x142.png)\n\nThis project aims to visualize the latest pipeline for all branches in every repository in various output-formats.\nOutput-formats currently available are: ccmenu, html, json, bash and prometheus (See adapter below for screenshots). The\nqueried repositories and branches can be configured using Allowlist/Blocklist and regular expressions.\n\nThis project is intended to be used as hub for your team, therefore you only have to configure a single token once.\nAfter setup GitLab panorama retrieves all future updates by using a webhook. The service queries the pipeline-states\nonly once at the beginning. This is the biggest difference to other gitlab-pipeline-monitors out there and makes\nespecially sense if you have a large amount of project (where you easily end up having thousands of requests to the\ngitlab api .. per client, requesting over and over again, running into throttling). In contrast, GitLab-panoramas\nresponse-times for the pipeline-states are lightning fast, because the current state is always up-to-date and comes from\nmemory.\n\n# Starting panorama\n\nThe project is available as docker image and can be easily started:\n```\ndocker run --rm -it -p 8080:8080 -e \"GITLAB_TOKEN=\u003cyour api token\u003e\" joblift/gitlab-panorama:latest\n```\n\nA healthcheck for liveness or readiness probes is via [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/2.5.6/reference/html/actuator.html).\n\n# Configuration\n\nGitLab panorama will be configured by using environment-variables, Java system properties or yaml file.\nThe easiest (and recommended way) is to use environment-variables when panorama is started as Docker container.\n\nIt is required to set up a Webhook in your Gitlab instance in order to get pipeline updates.\n\n## Gitlab Webhook\n\nYou have to define a webhook with the triggers `Push events` and `Pipeline Events`. It's also recommended to use\nSSL (`Enable SSL verification`), and utilize the `Secret Token`.\nThere are two options where to setup the webhook:\n\n* For each required project (Gitlab free/core) within `settings / integrations`. See a [screenshot](media/screenshot-gitlab-webhook.png).\n* For a whole subgroup - aka [Group webhooks](https://docs.gitlab.com/ee/user/project/integrations/webhooks.html) (Gitlab bronze/starter).\n\n## GitLab panorama - environment variables\n\n| Variable                      | Required | Default value             | Description                                                                                                                                   |\n|-------------------------------|----------|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|\n| `GITLAB_TOKEN`                | YES      |                           | A gitlab [access token](https://gitlab.com/profile/personal_access_tokens). A token with scope API is required.                               |\n| `GITLAB_ENDPOINT`             |          | https://gitlab.com/api/v4 | GitLab API endpoint.                                                                                                                          |\n| `GITLAB_TIMEOUT`              |          | `20s`                     | Timeout for gitlab api requests.                                                                                                              |\n| `WEBHOOK_SECRET_TOKEN`        |          |                           | Increases security: https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#secret-token                                           |\n| `INIT_COLLECT_FROM_GITLAB`    |          | true                      | Will query the pipelines once on service start.                                                                                               |\n| `INIT_LOAD_FROM_STORAGE`      |          | false                     | Will load the pipelines from a local storage-file. This has some implications, read below.                                                    |\n| `FILTER_PROJECTS_ALLOWLIST_n` |          | `.*`                      | A regular expression that is required to match the project name (pathNamespaced). Multiple expressions are possible, _n_ starts with 0.       |\n| `FILTER_PROJECTS_BLOCKLIST_n` |          |                           | A regular expression that is required _NOT_ to match the project name (pathNamespaced). Multiple expressions are possible, _n_ starts with 0. |\n| `FILTER_REFS_ALLOWLIST_n`     |          | `.*`                      | A regular expression that is required to match the ref name (pathNamespaced). Multiple expressions are possible, _n_ starts with 0.           |\n| `FILTER_REFS_BLOCKLIST_n`     |          |                           | A regular expression that is required _NOT_ to match the ref name (pathNamespaced). Multiple expressions are possible, _n_ starts with 0.     |\n| `STORAGE_PATH`                |          | `~/.gitlab-panorama`      | Path to a directory, where the pipelines are stored. If empty, no pipelines will be stored.                                                   |\n\n\n## Storage\nGitLab panorama can store the state of the pipelines in a local file. This is useful if the service restarts, since at startup no pipelines are available and have to be queried from the GitLab API first. Depending on the amount of repositories, branches and pipelines this can take some minutes.\nWhen using docker, you have to mount a volume to the specified path, otherwise data is lost between restarts.\n\nAlso it is very useful during development, avoiding massive queries to the GitLab API and faster startup phase.\n\nHowever there are some **drawbacks**. If branches or projects with pipelines have been removed in the meantime, the pipelines loaded at startup and will never get removed. Webhooks are only triggered once, so there is no chance to catch those events if the service is not running. So this option shouldn't be used in a production environment.\n\n# Adapter\n\n## ccmenu\nEndpoint: `/api/adapter/ccmenu`\n\nProvides a resource for ccmenu clients in the specific xml-format to display the pipelines.\n\n## html\nEndpoint: `/api/adapter/html`\n\nShows a configurable list of pipeline as dynamic single-page-application website.\n\nSupported parameter:\n\n| Parameter      | Default          | Values                                                       | Description                                                  |\n| -------------- | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |\n| `filterStatus` | (empty)          | Comma-separated list of status, or empty (all). Available states: `success`, `failed`, `canceled`, `skipped` | Shows only pipelines not within the specified list.          |\n| `onlyRefs`     | (empty)          | Comma-separated list of refs, or empty (all).                | Shows only pipelines from the refs within the specified list. |\n| `sort`         | `alphabetically` | One of `alphabetically`, `importance`                        | Sort the list by one of the available options.               |\n| `theme`        | `default`        | One of `default`, `deuteranopia`, `protanope`, `tritanerope`, `aprilfools` | Defines a color theme. Themes for color-blindness are provided, please [give feedback](https://github.com/joblift/gitlab-panorama/issues) when the colors can be optimized. |\n\nScreenshot (with obfuscated project names):\n\n![html screenshot default deuteranopia protanope tritanerope](media/screenshot-html-default.png)\n\nVarious themes:\n\n![html screenshot default deuteranopia protanope tritanerope](media/screenshot-themes.png)\n\n## shell\nEndpoint: `/api/adapter/shell`\n\nDisplays the state of the pipelines as shell-compatible screen. Best used with `watch` to update the screen:\n\n```\nwatch --color -t 'curl -s \"\u003chost\u003e/api/adapter/shell\"'\n```\n\nSupported parameter:\n\n| Parameter           | Default  |  Values | Description |\n| ------------------- | -------- | ------- | ----------- |\n| `dots`              | `true`   | boolean | Display symbols. |\n| `refs`              | `true`   | boolean | Display the ref behind the repository name. |\n| `lists`             | `true`   | boolean | Display the pipeline projects as list. |\n| `filterStatus`      | (empty)  | Comma-separated list of status, or empty (all). Available states: `success`, `failed`, `canceled`, `skipped` | Shows only pipelines not within the specified list. |\n| `delimiterLists`    | `\\n`     | String  | Seperator behind each state-list. |\n| `delimiterProjects` | `, `     | String  | Seperator behind each displayed project. |\n\nScreenshots (with obfuscated project names):\n\n![shell screenshot 01](media/screenshot-shell-01.png) ![shell screenshot 01](media/screenshot-shell-02.png)\n\n## json\nEndpoint: `/api/adapter/json`\n\nActually only used by the html endpoint.\n\n## prometheus\nEndpoint: `/api/adapter/prometheus`\n\nCan be used as exporter from a prometheus scraper. Return values are: success=0, skipped=1, canceled=2, failed=10. \n\nExamples:\n\n```\ngitlab_pipeline_state{repository=\"hubble\",ref=\"master\",state=\"success\"} 0\ngitlab_pipeline_state{repository=\"hubble\",ref=\"task/lens\",state=\"failed\"} 10\n```\n\n# Other projects\nProjects that could be used in conjunction to GitLab panorama to visualize, notify or analyze the outputs from the service:\n\n* [BuildNotify](https://anaynayak.github.io/buildnotify) - CCMenu/CCTray equivalent for Ubuntu\n* [Nevergreen](https://nevergreen.io) - Alternative ccmenu build monitor\n* [ccmenu](http://ccmenu.org/) - ccmenu for the Mac OS menu bar\n* [Prometheus](https://prometheus.io/) - metric alerts and monitoring solution\n\n\n### Disclamer\nGitLab is a registered trademark of GitLab, Inc. The [GitLab logo](https://about.gitlab.com/handbook/marketing/corporate-marketing/#gitlab-trademark--logo-guidelines) is subject to the terms of the Creative Commons Attribution Non-Commercial ShareAlike 4.0 International License.\n\nOriginally developed at [Joblift GmbH](https://joblift.de/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgalan%2Fgitlab-panorama","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgalan%2Fgitlab-panorama","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgalan%2Fgitlab-panorama/lists"}