{"id":20828596,"url":"https://github.com/linuxserver/docker-ci","last_synced_at":"2026-06-07T09:01:37.652Z","repository":{"id":37991300,"uuid":"140231015","full_name":"linuxserver/docker-ci","owner":"linuxserver","description":"Container for running basic sanity checks on containers post build and before upload","archived":false,"fork":false,"pushed_at":"2026-05-24T06:57:03.000Z","size":750,"stargazers_count":7,"open_issues_count":0,"forks_count":8,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-05-24T08:26:14.759Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linuxserver.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"linuxserver","open_collective":"linuxserver"}},"created_at":"2018-07-09T04:25:40.000Z","updated_at":"2026-05-24T06:50:50.000Z","dependencies_parsed_at":"2023-01-21T18:45:55.224Z","dependency_job_id":"dafe37a8-7eed-4bbd-9ada-39cad0f4bef7","html_url":"https://github.com/linuxserver/docker-ci","commit_stats":{"total_commits":309,"total_committers":13,"mean_commits":23.76923076923077,"dds":0.5954692556634305,"last_synced_commit":"f251332c4d2fb90936f61b4a3b935b1c7bab4662"},"previous_names":[],"tags_count":250,"template":false,"template_full_name":null,"purl":"pkg:github/linuxserver/docker-ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxserver%2Fdocker-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxserver%2Fdocker-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxserver%2Fdocker-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxserver%2Fdocker-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linuxserver","download_url":"https://codeload.github.com/linuxserver/docker-ci/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxserver%2Fdocker-ci/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34014821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"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":["hacktoberfest"],"created_at":"2024-11-17T23:17:11.409Z","updated_at":"2026-06-07T09:01:37.624Z","avatar_url":"https://github.com/linuxserver.png","language":"Python","funding_links":["https://github.com/sponsors/linuxserver","https://opencollective.com/linuxserver"],"categories":[],"sub_categories":[],"readme":"\u003c!-- DO NOT EDIT THIS FILE MANUALLY --\u003e\n\u003c!-- Please read https://github.com/linuxserver/docker-ci/blob/master/.github/CONTRIBUTING.md --\u003e\n[linuxserverurl]: https://linuxserver.io\n[forumurl]: https://discourse.linuxserver.io\n[huburl]: https://hub.docker.com/r/linuxserver/ci/\n[pipelineurl]: https://github.com/linuxserver/pipeline-triggers\n\n[![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png?v=4\u0026s=4000)][linuxserverurl]\n\n\n## Contact information:-\n\n| Type | Address/Details |\n| :---: | --- |\n| Discord | [Discord](https://discord.gg/linuxserver) |\n| Forum | [Linuserver.io forum][forumurl] |\n\n# [linuxserver/ci][huburl]\n\n## What is this?\n\nThis container is an automated testing tool for Docker images. It's designed to perform a series of checks to ensure a container is healthy and functional before it's released. Here's what it does:\n\n1.  **Spins up the container:** It runs the target Docker image with a specified tag.\n2.  **Checks for successful startup:** It tails the container's logs, waiting for the `[services.d] done.` message, which confirms the init system has finished and the services are running.\n3.  **Generates an SBOM:** It uses `syft` to create a Software Bill of Materials, providing a complete list of all packages inside the image.\n4.  **Tests the Web UI (optional):** If the container runs a web service, it attempts to connect to the UI and take a screenshot to verify it's accessible and renders correctly.\n5.  **Generates a report:** It gathers all the results—container logs, build info, SBOM, screenshots, and test statuses—into a comprehensive HTML report.\n6.  **Uploads the report (CI only):** In a CI environment, it uploads the final report to an S3 bucket for review.\n\n## Developer Mode (Local Testing)\n\nFor local development and debugging, you can use `CI_LOCAL_MODE`. This mode runs all the tests but skips the S3 upload, saving the report directly to a local folder. It's the easiest way to test a container without needing cloud credentials.\n\n### Example Run Command\n\nRun this command from your terminal. It will test the `linuxserver/plex:latest` image and place the report in an `output` directory in your current folder.\n\n```\ndocker run --rm -i \\\n --shm-size=1gb \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -v \"$(pwd)/output:/ci/output\" \\\n -e CI_LOCAL_MODE=true \\\n -e IMAGE=\"linuxserver/plex\" \\\n -e TAGS=\"latest\" \\\n -e BASE=\"ubuntu\" \\\n -e WEB_SCREENSHOT=true \\\n -e PORT=32400 \\\n -e SSL=false \\\n -e WEB_PATH=\"/web/index.html\" \\\n -e WEB_AUTH=\"\" \\\n -e WEB_SCREENSHOT_TIMEOUT=60 \\\n -e WEB_SCREENSHOT_DELAY=20 \\\n -t lsiodev/ci:latest \\\n python3 test_build.py\n```\n\n### Viewing the Report\n\nOnce the script finishes, you can view the detailed HTML report with this command:\n\n```\nchromium output/linuxserver/plex/latest/index.html\n```\n\u003e **Note:** You can use any modern web browser (Firefox, Chrome, etc.).\n\n### Key Local Variables\n\n| Variable | Description | Example |\n| :--- | :--- | :--- |\n| `CI_LOCAL_MODE` | **Required.** Enables local mode, disables S3 uploads. | `true` |\n| `IMAGE` | **Required.** The full name of the image to test. | `linuxserver/plex` |\n| `TAGS` | **Required.** The tag(s) to test. Use `\\|` to separate multiple tags. | `latest` |\n| `BASE` | **Required.** The base distribution of the image. | `ubuntu` or `alpine` |\n| `WEB_SCREENSHOT` | Set to `true` to enable screenshot testing for web UIs. | `true` |\n| `PORT` | The internal port the web UI listens on. | `32400` |\n| `SSL` | Set to `true` if the web UI uses `https://`. | `false` |\n| `WEB_PATH` | The specific path to the web UI landing page. | `/web/index.html` |\n| `WEB_AUTH` | Credentials for basic auth, format `user:password`. Leave empty for none. | `\"\"` |\n| `WEB_SCREENSHOT_DELAY` | Seconds to wait after the page loads before taking the screenshot. | `20` |\n\n\n## Advanced Usage (CI Environment)\n\n**This container is not meant for public consumption as it is hard coded to LinuxServer endpoints for storage of resulting reports.**\n\nThe following shows the full list of environment variables used when the container is run by our CI system, [linuxserver/pipeline-triggers][pipelineurl].\n\n```\nsudo docker run --rm -i \\\n-v /var/run/docker.sock:/var/run/docker.sock \\\n-v /host/path:/ci/output:rw `#Optional, will contain all the files the container creates.` \\\n-e IMAGE=\"linuxserver/\u003cdockerimage\u003e\" \\\n-e TAGS=\"\u003csingle tag or array separated by |\u003e\" \\\n-e META_TAG=\u003cmanifest main dockerhub tag\u003e \\\n-e BASE=\u003calpine or debian based distro\u003e \\\n-e SECRET_KEY=\u003cS3 secret\u003e \\\n-e ACCESS_KEY=\u003cS3 key\u003e \\\n-e DOCKER_ENV=\"\u003coptional, Array of env vars separated by | IE test=test|test2=test2 or single var. Defaults to ''\u003e\" \\\n-e WEB_AUTH=\"\u003coptional, format user:passord. Defaults to 'user:password'\u003e\" \\\n-e WEB_PATH=\"\u003coptional, format /yourpath\u003e. Defaults to ''.\" \\\n-e S3_REGION=\u003coptional, custom S3 Region. Defaults to 'us-east-1'\u003e \\\n-e S3_BUCKET=\u003coptional, custom S3 Bucket. Defaults to 'ci-tests.linuxserver.io'\u003e \\\n-e WEB_SCREENSHOT_TIMEOUT=\u003coptional, time in seconds before timing out trying to take a screenshot. Defaults to '120'\u003e\n-e WEB_SCREENSHOT_DELAY=\u003coptional, time in seconds to delay before taking a screenshot after loading the web page. Defaults to '10'\u003e \\\n-e SBOM_TIMEOUT=\u003coptional, time in seconds before timing out trying to generate a SBOM. Defaults to '900'\u003e\n-e WEB_SCREENSHOT=\u003coptional, set to false if not a web app. Defaults to 'false'\u003e \\\n-e PORT=\u003coptional, port web application listens on internal docker port. Defaults to '80'\u003e \\\n-e SSL=\u003coptional , use ssl for the screenshot true/false. Defaults to 'false'\u003e \\\n-e CI_S6_VERBOSITY=\u003coptional, Updates the S6_VERBOSITY env. Defaults to '2'\u003e \\\n-e CI_LOG_LEVEL=\u003coptional, Sets the ci logging level. Defaults to 'INFO'\u003e \\\n-e DOCKER_LOGS_TIMEOUT=\u003coptional, How long to wait in seconds while tailing the container logs before timing out. Defaults to '120'\u003e \\\n-e DRY_RUN=\u003coptional, Set to 'true' when you don't want to upload files to S3 when testing\u003e \\\n-e NODE_NAME=\u003coptional, Name of the builder that runs the CI test.\u003e \\\n-e RELEASE_TAG=\u003coptional, The release tag of the docker image. Used for upload location. Defaults to 'latest'\u003e \\\n-e SYFT_IMAGE_TAG=\u003coptional, The image tag of the syft docker image. Used for generating SBOM. Defaults to '1.26.1'\u003e \\\n-t lsiodev/ci:latest \\\npython3 test_build.py\n```\n\nThe following line is only in this repo for loop testing:\n\n- { date: \"01.01.50:\", desc: \"I am the release message for this internal repo.\" }\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxserver%2Fdocker-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinuxserver%2Fdocker-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxserver%2Fdocker-ci/lists"}