
Semaphore UI 2.19 er den største udgivelse i 2.x-serien. Den introducerer Arbejdsgange (Workflows) med en grafisk editor, giver runners mulighed for at køre opgaver i Docker-containere og Kubernetes-pods, gør det muligt for Semaphore at udstede kortlivede JWT-identitetstokens til kørende opgaver, tilføjer rotation af krypteringsnøgler, løser runner-pålideligheden permanent og indeholder en lang række sikkerhedsforbedringer.
Denne serie dækker versionerne v2.19.0 til v2.19.14. Rettelsesudgivelser er anført til sidst.
Højdepunkter
- Arbejdsgange (Beta) — sammenkæd opgaveskabeloner i en pipeline med godkendelsesporte, opbygget i en grafisk editor og overvåget live på samme lærred.
- Docker- og Kubernetes-afviklere — runners kan køre hver opgave i en isoleret container eller pod (Pro / Enterprise).
- JWT-identitetstokens til opgaver — nøglefri godkendelse fra playbooks til Vault, AWS, GCP, Azure og andre tjenester, der accepterer OIDC-tokens.
- Rotation af krypteringsnøgler — en mærket nøglering (keyring) med dynamisk genindlæsning og en
vaults check-kommando. - Survey-variabler som miljøvariabler, plus
int-,text- og opdateredeenum-typer. - Ægte serverside-paginering af opgavehistorik — projekter med millioner af opgaver forbliver hurtige.
- Runner-pålidelighed — online/offline-status, hashed engangsregistrerings-tokens og automatisk genopretning af opgaver, der sidder fast på en nedbrudt runner.
- Selektiv fejlfindingslogning med
SEMAPHORE_DEBUG_FILTER. - Sikkerhedsstramning: kontrol af nuværende adgangskode, CSRF-oprindelsesvalidering, sikre cookies og strengere inputvalidering på tværs af hele API’et.
- BoltDB fjernet — udelukkende SQLite, MySQL og PostgreSQL understøttes.
Arbejdsgange (Beta)
En arbejdsgang er en graf over opgaveskabeloner, som afvikles som en samlet helhed. Hver knude er enten en opgave (kører en skabelon), en godkendelse (pauser kørslen, indtil en bruger godkender eller afviser), eller en note (fritekst-annotation, som aldrig eksekveres). Forbindelser bærer en betingelse: ved succes, ved fejl eller altid.
Arbejdsgange vises som et nyt punkt Workflows i projektets sidepanel, markeret med et Beta-badge. De er tilgængelige i Pro-udgaven; under beta-fasen er de aktiveret uanset abonnementstype.
Grafisk editor

Editoren er et fuldskærmslærred bygget på Drawflow:
- træk knuder ind fra paletten, forbind dem ved at trække fra en knudes forbindelsespunkt;
- klik på en linje for at ændre dens betingelse; forbindelser er farvekodede, og en forklaring findes i hjørnet;
- klik på en knude for at redigere dens egenskaber i sidepanelet: skabelon, konvergens-tilstand (alle forældre / vilkårlig forælder), godkendelses-timeout og besked, notetekst;
- cyklusser og løkker afvises automatisk under oprettelsen, og et Problemer-panel afspejler serverside-valideringen, så en ugyldig graf ikke kan gemmes;
- knudepositioner bevares; arbejdsgange oprettet via API uden koordinater tildeles et automatisk topologisk layout;
- zoom via værktøjslinjen eller
Ctrl+ musehjul, træk lærredet for at panorere, skjul paletten for at få mere plads; - Startversion fastsætter kørselsversioneringen (
1.4.0,1.4.1, …); versionen overføres til hver opgave, som arbejdsgangen starter.

Live kørselsvisning
Kørselsvisningen genbruger samme lærred. Hver knude viser sin opgavestatus, den aktive knude er fremhævet, og afventende godkendelser viser Godkend / Afvis-knapper direkte på lærredet. En Stop-knap tvangsafslutter alle opgaver i kørslen, afviser ventende godkendelser og markerer kørslen som stopped.

Kørselsstatusser er running, approval, success, failed og stopped. Arbejdsgangens fremdrift styres af serveren: når en opgave afsluttes, planlægges de næste knuder automatisk.

Opgaveparametre pr. knude
Hver opgaveknude kan tilsidesætte de parametre, den sender til sin skabelon (variabler, inventory, gren, argumenter, version, besked), på samme måde som ved en manuel kørsel.
API
GET/POST /api/project/{id}/workflows
GET/PUT/DELETE /api/project/{id}/workflows/{workflow_id}
POST /api/project/{id}/workflows/{workflow_id}/run
GET /api/project/{id}/workflows/{workflow_id}/runs
GET /api/project/{id}/workflows/{workflow_id}/runs/{run_id}
POST /api/project/{id}/workflows/{workflow_id}/runs/{run_id}/stop
GET /api/project/{id}/workflows/{workflow_id}/runs/{run_id}/artifacts
GET /api/project/{id}/workflows/{workflow_id}/runs/{run_id}/approvals
POST /api/project/{id}/workflows/{workflow_id}/runs/{run_id}/approvals/{node_id}
Kendte begrænsninger i beta: intet minimap, fortryd/gentag eller flermarkering; arbejdsgangs-artefakter (set_stats-værdier) flyder endnu ikke mellem opgaver afviklet på eksterne runners.
Docker og Kubernetes afviklere (Pro / Enterprise)
Runners kan afvikle hver opgave i et isoleret miljø frem for direkte på runner-værten. Afvikleren vælges én gang pr. runner-proces via runner.executor.type (local, docker, k8s).
Docker (runner.executor.docker, Pro):
| Indstilling | Miljøvariabel | Standard |
|---|---|---|
host |
SEMAPHORE_RUNNER_DOCKER_HOST |
lokal socket |
tls_verify, cert_path |
SEMAPHORE_RUNNER_DOCKER_TLS_VERIFY, …_CERT_PATH |
|
image |
SEMAPHORE_RUNNER_DOCKER_IMAGE |
semaphoreui/job:latest |
helper_image |
SEMAPHORE_RUNNER_DOCKER_HELPER_IMAGE |
semaphoreui/helper:latest |
network |
SEMAPHORE_RUNNER_DOCKER_NETWORK |
bridge |
pull_policy |
SEMAPHORE_RUNNER_DOCKER_PULL_POLICY |
if-not-present |
cpu_limit, memory_limit |
SEMAPHORE_RUNNER_DOCKER_CPU_LIMIT, …_MEMORY_LIMIT |
|
privileged |
SEMAPHORE_RUNNER_DOCKER_PRIVILEGED |
false |
poll_interval_seconds, cleanup_grace_seconds |
…_POLL_INTERVAL_SECONDS, …_CLEANUP_GRACE_SECONDS |
2, 30 |
Kubernetes (runner.executor.k8s, Enterprise):
| Indstilling | Miljøvariabel | Standard |
|---|---|---|
kubeconfig |
SEMAPHORE_RUNNER_K8S_KUBECONFIG |
in-cluster |
namespace |
SEMAPHORE_RUNNER_K8S_NAMESPACE |
semaphore |
image |
SEMAPHORE_RUNNER_K8S_IMAGE |
semaphoreui/job:latest |
helper_image |
SEMAPHORE_RUNNER_K8S_HELPER_IMAGE |
semaphoreui/helper:latest |
service_account |
SEMAPHORE_RUNNER_K8S_SERVICE_ACCOUNT |
default |
pull_secrets |
SEMAPHORE_RUNNER_K8S_PULL_SECRETS |
|
poll_interval_seconds, cleanup_grace_seconds |
…_POLL_INTERVAL_SECONDS, …_CLEANUP_GRACE_SECONDS |
3, 30 |
To nye billeder udgives af CI: semaphoreui/job (Ansible, Terraform, OpenTofu, Terragrunt, paramiko) og semaphoreui/helper. En skabelon kan tilsidesætte billedet for sine egne opgaver via feltet Executor image i skabelonformularen.
JWT-identitetstokens til opgaver
Semaphore kan fungere som en OIDC-lignende identitetsudbyder for kørende opgaver, så en playbook kan godkendes mod Vault, cloud STS-endepunkter eller interne tjenester uden langlivede adgangsoplysninger.

- Aktiver pr. skabelon med Issue JWT to task runner; angiv en eller flere audiences og en TTL (begrænset af
jwt.max_ttl). - Opgaven modtager tokenet i miljøvariablen
SEMAPHORE_JWT. - Tokens er signeret med ES256 (ECDSA P-256) og indeholder udelukkende ID’er:
task_id,project_id,template_id,user_idplus standardkraveneiss,sub,aud,exp,nbf,iat,jti. - Offentlige nøgler publiceres på
GET /.well-known/jwks.json.
Serverkonfiguration:
"jwt": {
"enabled": true,
"issuer": "https://semaphore.example.com",
"default_ttl": "1h",
"max_ttl": "24h"
}
Miljøvariabler: SEMAPHORE_JWT_ENABLED, SEMAPHORE_JWT_ISSUER, SEMAPHORE_JWT_DEFAULT_TTL, SEMAPHORE_JWT_MAX_TTL.
Survey-variabler
Levering af en variabel som miljøvariabel
En survey-variabel har nu en indstilling Overfør variabel som: den app-specifikke CLI-metode (--extra-vars for Ansible, -var for Terraform/OpenTofu, et CLI-argument for shell-scripts) eller en procesmiljøvariabel. Variabelnavnet anvendes uændret, så en Terraform-bruger blot navngiver den TF_VAR_region. Miljøvariabler vises ikke i proceslister, hvilket gør dette til det sikrere valg for hemmeligheder.

Nye typer
int— numerisk input med validering;text— flerlinjet tekst;enum— opdateret editor med nøgle/værdi-par og en standardværdi.

Opgavedialogen gengiver hver type tilsvarende:

Gemmes i den eksisterende survey_vars JSON — ingen migrering nødvendig.
Skabeloner og opgaver
-
Dynamisk playbook-vælger. Feltet Sti til playbook-fil viser en liste over de playbooks, der findes i repositoryet (
GET /api/project/{id}/repositories/{repository_id}/playbooks). Listen følger den valgte gren og falder tilbage til fritekst, hvis repositoryet ikke kan læses. -
Spring Ansible Galaxy-installation over — valgmulighed pr. skabelon til at springe installation af roller og samlinger fra
requirements.ymlover. -
Typede variabler i variabelgrupper, inklusive tal:

-
Paginering af opgavehistorik. Historiksiden hentede tidligere de seneste 200 opgaver og bladrede igennem dem på klientsiden. Backend returnerer nu én side ad gangen ved hjælp af en keyset-markør (
?count=20&before=<task_id>,X-Has-Next-header) udenCOUNT(*)og udenOFFSET. Bunden indeholder indstillinger for rækker pr. side samt forrige/næste-knapper.
-
Opgavelister genindlæses højst én gang hvert 5. sekund; overflødige forespørgsler er fjernet.
-
Tidsplaner valideres med serverens cron-parser.
-
Tilsidesættelse af gren i en opgave accepteres kun, hvis skabelonen tillader det.
-
Git-handlinger serialiseres pr. repository-mappe. Skabeloner med Tillad parallelle opgaver deler én arbejdskopi, og samtidige
git pull/git checkoutkunne beskadige den. Opdatering og checkout udgør nu én enkelt kritisk sektion.
Runners

-
Online / offline status på Runners-siden, udledt af heartbeat-levetid.
-
Engangs-registreringstokens. En runner kan oprettes i brugerfladen først og registreres senere med et
smrs_…-token, der vises én gang, gemmes udelukkende som et SHA-256 hash og udløber efter en time. Dialogen viser færdige kommandoer til miljøvariabler, konfigurationsfil og Docker.
SEMAPHORE_WEB_ROOT=https://semaphore.example.com \ SEMAPHORE_RUNNER_REGISTRATION_TOKEN=smrs_… \ semaphore runner register --config ./config.runner.json semaphore runner start --config ./config.runner.json -
Gendannelse af fastlåste opgaver. Runners sender deres processtarttidspunkt (
X-Runner-Started-At). En runner, der holder op med at polle, markeres som offline efterrunners.offline_timeout_sec(120 sek.): den modtager ingen nye opgaver, og densstarting-opgaver tildeles på ny. Efterrunners.task_fail_timeout_sec(420 sek.) markeres densrunning-opgaver som fejlede med en tydelig besked. Afstemning kører hvertrunners.reconcile_interval_sec(30 sek.). -
Opgaver, der flyttes væk fra en runner, afbrydes på den gamle runner.
-
Den gamle forældede runner-fallback er fjernet: når alle runners er offline, forbliver opgaver i køen i stedet for at blive sendt til en runner, der ikke har svaret i op til 30 minutter.
-
Runner-specifikke RSA-krypteringsnøgler fjernet. Trafik mellem runner og server er baseret på TLS; dette fjerner nøgleudvekslingstrinnet under registrering og opsætning.
-
Fejlfinding for TCP-forbindelseslækage i runner-klienten; ugyldige registreringstokens returnerer
400.
Hemmeligheder og kryptering
- Rotation af krypteringsnøgler. Den nye
encryption-blok beskriver en mærket nøglering: integreredekeys(værdi eller fil) eller enkeys_folder, hvor hver fil er en nøgle navngivet efter sit filnavn, plusactive-pegere til den hemmelige nøgle og indstillingsnøglen. Chiffertekst indeholder nu et nøgle-ID, så nøgler kan roteres uden en total genkryptering.encryption.keys_filemedkeys_poll_interval(standard15s) genindlæser nøgleringen dynamisk. Ny CLI:semaphore vaults check;semaphore vaults rekeyer omskrevet til nøgleringen. option_encryption— en separat nøgle til indstillinger gemt i databasen.- OpenBao lagringstype (dirigeret via Vault-udbyderen) med sit eget ikon.
- AWS Secrets Manager uden statiske adgangsoplysninger — et Use IAM role-afkrydsningsfelt.
- TLS-skip-verify mulighed for Vault/OpenBao lagre.
- Synkroniserede og skrivebeskyttede hemmelighedsfelter slettes ikke længere ved opdatering.
Observerbarhed
- Namespace-opdelt fejlfindingslogning.
--debug-filter/SEMAPHORE_DEBUG_FILTERvælger, hvilke delsystemer der udsender debug-output i stil med Node.jsdebug:runner,runner,task_pool,task_*,*,*,-db. Tilgængelige namespaces:runner,task_pool,task_runner,task_logger,git,terraform,session,ldap,schedule,db,ha. Filtret gælder kun, når logniveauet erDEBUG. Syslog-hooks respekterer samme filter. - Mange nye kontekstuelle debug-udskrifter på tværs af runners, opgaver og godkendelse; det valgte workspace udskrives ved opstart.
Sikkerhed

- Ændring af adgangskode kræver nu den nuværende adgangskode (CWE-620).
- Origin / Referer-validering på tilstandsændrende forespørgsler (CSRF-sikring).
- Sessionscookies markeres med
Secure, når de serveres over HTTPS. - Runner-registreringstokens gemmes som hash og udløber; runner-specifikke krypteringsnøgler er fjernet.
- Oprettelse af tilpassede roller kontrollerer opretterens rettigheder (rettighedseskaleringsrettelse).
- Git URL-validering;
--end-of-optionssendes til git, så en manipuleret ref ikke kan fortolkes som et flag; commit-hashes formatvalideres; grene valideres før gennemsyn af repository. - Adgangsnøgle-payloads og skabelonens
app-felt valideres. - JWT-claims indeholder udelukkende ID’er — ingen navne eller e-mails lækkes til eksterne systemer.
- Runner-tokens skrives ikke længere ind i projekt-sikkerhedskopier.
- Sikkerheds-SLA er offentliggjort i
SECURITY.md; udgivelsesartefakter signeres med[email protected]GPG-nøglen.
Brugerflade og lokalisering

- Tjekkisk oversættelse tilføjet.
- Dropdown-kort til JWT- og planlægningssektionerne i skabelonformularen.
- Kopiér-til-udklipsholder-ikon er synligt i lyst tema; loading-indikatorer for kørende opgaver rettet; skabelonformular-padding rettet; arbejdsgangs-Beta-mærkat tilføjet.
- Udtræk af integrationsvariabler bevarer JSON-objekter og arrays i stedet for at konvertere dem til strenge.
Opgraderingsnoter
Væsentlige og adfærdsmæssige ændringer
- BoltDB er fjernet.
bolter ikke længere en gyldig dialekt; serveren nægter at starte med “Bolt is not supported starting from version 2.19”. Migrer til SQLite, MySQL eller PostgreSQL først. - Runner-krypteringsnøgler fjernet. Server og runners skal begge være på 2.19. Sørg for, at trafikken mellem runner og server er TLS-beskyttet.
- Opgaveliste-API’er er paginerede.
GET /api/project/{id}/tasks/lasttagercountogbefore; klienter, der har forladt sig på de seneste 200 opgaver i ét svar, skal anvende paginering. - Ingen forældet runner-fallback. Hvis alle runners er offline, forbliver opgaver i køen.
- Runner
active-flag fjernet fra registreringen. - Projektsikkerhedskopier indeholder ikke længere runner-tokens.
- SQLite:
v2.19.14genopbyggersession- ogtask-tabellerne for at tilføje korrekte fremmednøgler (løser sletning af brugere). Tag backup af databasen før opgradering.
Ny konfiguration
jwt, runners, encryption, option_encryption, secrets_path, db.dialect, runner.executor.{type,docker,k8s}, runner.connection.{server_ca_cert_file,skip_tls_verify}, runner.registration_token_file, runner.token_file. Alle er valgfrie; eksisterende konfigurationer fortsætter med at fungere.
Databasemigreringer
v2.18.6 (skabelon jwt_params), v2.18.15 (arbejdsgangstabeller), v2.19.2 (runner.started_at), v2.19.11 (project__workflow_node.task_params_id), v2.19.12 (project__template.executor_image), v2.19.14 (SQLite session/task genopbygning). Kompatibilitet med MariaDB 12.1-migrering rettet.
Rettelsesudgivelser
| Version | Ændringer |
|---|---|
| 2.19.8 | Rettelse af SQLite-migrering; rettelse af brugersletning (session/task fremmednøgler); case-insensitive strengsammenligning i databaseforespørgsler |
| 2.19.9 | SEMAPHORE_RUNNER_EXECUTOR_TYPE miljøvariabel; oprydning af omitempty i konfiguration |
| 2.19.10 | Rettelse af afvikler-konfiguration; rettelse af Docker-build-indstilling |
| 2.19.11 | Valgt workspace udskrives i logs; latest-tag for hjælpebillede; databasemigreringstest |
| 2.19.12 | Rettelse af nil pointer i runner-konfigurationsindstillinger; rettelse af fejlformidling |
| 2.19.14 | Rettelse af ældre secrets_path-håndtering i konfiguration |
Afhængigheder
Go 1.26; go-git 5.19, go-oidc 3.19, golang.org/x/crypto 0.53, go-ldap 3.4.13, modernc.org/sqlite 1.52. Dokumentation tilføjet som et git-undermodul; THIRD-PARTY-LICENSES.md genopbygget.
