mrkeyoor.com_
Sun 27 Sept 19:23 UTC
Automationevaluationupdated 26 Aug 2026

semaphore review

Semaphore UI puts a web interface, schedules, credentials, inventories, and access control around Ansible, Terraform, OpenTofu, Terragrunt, PowerShell, and shell tasks. It is for teams that have outgrown running deployment commands from one person's terminal but do not want a larger automation platform.

+24stars / 7d
Verdict

Our Semaphore UI run built in 13 seconds, but 3 of 20 test packages failed, so pin the release and rehearse repository, database, and credential paths before moving real deployments into it. It is a good fit for a small team that wants shared Ansible and Terraform jobs without adopting AWX. Avoid development images in production, and keep the underlying playbooks runnable from the command line for recovery.

We ran it

Lab card: what happened when we ran semaphoreScreenshot of semaphore (semaphoreui.com)
Install✓ · 39s145 packages
Build✓ · 13s
Tests✗ · 55s17 passed · 3 failed of 20 (go test)
Repo955 files~94,397 lines of source · 17 MB · 5 CI workflows · tests dir

Answers from our run

Does semaphore build from source?

Dependencies installed in 39 seconds (145 packages), and the build succeeded in 13 seconds. We cloned commit 071b312 into a clean Debian container with 3 CPUs and no project-specific setup.

Do semaphore's tests pass?

Not all of them: 17 of 20 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use semaphore?

Teams that need every checkout method to behave identically: issue 4165 reports Azure DevOps HTTPS authentication working in Docker but failing in the package installation.

What are the alternatives to semaphore?

AWX, Rundeck, Windmill. Our Semaphore UI run built in 13 seconds, but 3 of 20 test packages failed, so pin the release and rehearse repository, database, and credential paths before moving real deployments into it.

Setup4/5Simple SQLite container path; 3 of 20 test packages failed
Docs4/5Multiple install paths plus user and API references
Community4/514,058 stars and current work, but a 1,077-item queue
Maturity4/5Established releases and migrations, with active regressions

Discussed on

  1. hnHtmx vs. React: A Complete Comparison – Semaphore59 points
  2. hnSemaphore 2.0 is out with customizable CI/CD pipelines, autoscaling, and more11 points
  3. hnA First Look at Semaphore's New API Specification Semantic11 points
  4. hnSemaphore Boosters: Parallel CI for Big Web Apps8 points
  5. hnBuilding and Deploying Microservices with AWS Lambda and Semaphore8 points

Who it’s for

Small infrastructure teams that want shared Ansible and Terraform job templates.
Operators who need scheduled runs, failure notifications, and a task history.
Self-hosters who prefer a single web service with SQLite for a small installation.
Teams that need inventories, variable groups, and role-based access around scripts.

Who it’s NOT for

Teams that need every checkout method to behave identically: issue 4165 reports Azure DevOps HTTPS authentication working in Docker but failing in the package installation.
Operators deploying straight from the development image: issue 4129 documents an SSH command regression that breaks repository cloning with the default host-key setting.
Users who expect arbitrary JSON in variable groups to be validated safely: issue 4163 reports non-object roots crashing the table view or being silently discarded.
Organizations wanting a small support queue: GitHub listed 1,077 combined issues and pull requests when fetched.

Setup reality

Our sandbox installed 145 Go packages in 39 seconds and built commit 071b312 in 13 seconds. Tests failed after 55 seconds: 17 passed and 3 failed out of 20. The log tail lists several successful service packages and ends with FAIL, but it does not name the 3 failing packages or show their assertions.

The shortest runtime path is a container on port 3000 using SQLite and environment variables for the first admin account. Production jobs still need the underlying tools, repository credentials, inventories, target-host access, and secrets. MySQL and Postgres are relevant for larger installations.

Binary, package, Snap, cloud-marketplace, and Docker installs are documented. A reverse proxy, TLS, persistent storage, backups, database migrations, and a deliberate secret-encryption configuration remain operator responsibilities.

Shared job templates replace deployment from one terminal

Semaphore UI organizes operations into projects, task templates, task runs, schedules, inventories, and variable groups. An Ansible playbook or Terraform directory can become a repeatable job that another authorized user launches from a browser. The service records execution, can notify on failure, and keeps credentials away from the command pasted into chat. That is enough structure for many small infrastructure teams.

Its scope goes beyond Ansible. The README names Terraform, OpenTofu, Terragrunt, PowerShell, Bash, and other command-line tools. That makes Semaphore a thin control layer over tools the team already understands. It does not write correct playbooks or plans for you. Operators still need to test the underlying automation, interpret failures, and know how to run it without the web interface when the controller is unavailable.

A 13-second build still ended with 3 failed test packages

We cloned commit 071b312 into an unprivileged Debian container with 3 CPUs and 8 GB of RAM. The 17 MB checkout contained 955 files and about 94,397 source lines. Installing 145 Go packages took 39 seconds, and the build succeeded in 13 seconds. Those are modest contributor costs for a web controller with several execution backends.

Our scan found 5 CI workflow files and a tests directory, but no Dockerfile in the measured checkout. The project nevertheless publishes a container and documents it as the most popular installation method. That means users of the image should inspect the release pipeline and image tags rather than assuming a root Dockerfile describes the artifact. Pinning a numbered image is safer than copying the README's latest tag into production.

What happened when we ran it

Our sandbox tests failed after 55 seconds. Go reported 17 passing packages and 3 failures out of 20. The tail shows successful results for project, runners, schedules, server, tasks, and util packages, then ends with FAIL. It does not show which 3 packages failed or include their assertion messages.

That limited tail rules out a responsible cause claim. We can say commit 071b312 installed and compiled on the stated Go image, while its full test command did not pass in our fresh environment. Before contributing or upgrading, capture the complete test output in your own CI. For an operations controller, regression tests around task execution, credentials, schedules, and migrations deserve more weight than a fast compiler result.

SQLite gets a demo running; production adds state and secrets

The README's container command exposes port 3000, selects SQLite, and sets the initial administrator through environment variables. It is a quick evaluation path, provided the example password is changed. A durable installation also needs persistent database storage, backups, TLS termination, a hostname, and a recovery procedure for the encryption material protecting stored access keys.

Jobs add another layer of dependencies. Semaphore needs network access and credentials to clone repositories, reach inventory hosts, and obtain any roles, collections, providers, or modules used by the task. The execution environment must contain Ansible, Terraform, PowerShell, or whichever binary a template calls. MySQL and Postgres options suit installations that have outgrown one SQLite file, but release v2.19.8 exists solely to fix an SQLite migration, so upgrades should be tested against a database copy.

Repository authentication differs across install methods

Issue 4165 describes Azure DevOps HTTPS cloning that succeeds in the v2.19.8 Docker deployment but fails with authentication errors in the package installation, despite the reporter using the same database and configuration. The environment includes a corporate proxy and a no_proxy rule, so it is a specific report rather than proof of a universal package defect. It still gives enterprise users a useful acceptance test.

Issue 4129 covers the development image, where a duplicated ssh token in GIT_SSH_COMMAND makes OpenSSH try to resolve a host literally named ssh. The reporter says accept-new avoids the affected branch. Released tags and development images carry different risk, and the latter should never enter a deployment path just because it contains a desired fix. Test both HTTPS and SSH repositories with the exact installation format you will operate.

Variable groups require object-shaped input

Variable groups hold environment values and secrets for tasks. Issue 4163 reports that JSON mode accepts null, an array, or a scalar even though the later code expects an object. Switching a null value to table view can throw an exception; saving directly can return success while discarding the value. This is a narrow input-validation bug with an unpleasant operational outcome.

Until the behavior is fixed in the chosen version, keep variable groups in source-controlled setup code or validate their JSON before sending it through the interface or API. After any edit, read the value back and run a harmless template that proves the expected variable arrived. A successful save response is not enough when the reported failure mode is silent data loss.

August 2026 activity is high, and so is the queue

GitHub showed 14,058 stars, 1,077 combined issues and pull requests, and a last push on August 26, 2026. Release v2.19.8 landed on August 17 with one SQLite migration fix. A large combined queue is not a count of confirmed bugs, especially in a repository with automated dependency pull requests. It does mean adopters should search existing reports before assuming an installation problem is unique.

Semaphore UI is MIT-licensed and offers Docker, binary, Debian, RPM, Snap, and marketplace routes. Its user guide, API reference, and Postman collection cover more ground than the short README. For a small team, the controller is easier to understand than AWX and more infrastructure-focused than a general workflow platform. Keep playbooks portable, pin every component, and make controller loss a rehearsed inconvenience rather than a deployment outage.

Alternatives

ProjectWhat it isPick it when
AWXThe upstream web platform behind Red Hat Ansible Automation Platform.pick this instead when Ansible is the center of the operation and its larger controller model is justified.
RundeckA general operations runbook and job automation server.pick this instead when operational runbooks and delegated job execution matter more than Ansible-specific concepts.
Windmill gh↗A self-hosted workflow system for scripts, applications, and scheduled jobs.pick this instead when developers need code-driven workflows and internal tools beyond infrastructure deployment.

What people are saying

  1. [github-trending] semaphoreui/semaphore

Sources

  1. Semaphore UI README
  2. Semaphore UI repository facts
  3. Semaphore UI v2.19.8 release
  4. Issue 4165: package repository authentication
  5. Issue 4129: development image SSH regression
  6. Issue 4163: variable group JSON roots

More automation reviews

runner-images · agent-fleet-manager · kargo · Rose · alchemy · laya · the whole board →