
Semaphore UI 2.20 tilføjer en auditlog med SIEM-eksport, udvider Workflows til en egentlig pipeline-motor med delay-knuder, revisioner, outputs der sendes mellem opgaver, og workflow-variabler, omarbejder roller, så et medlem kan have flere af dem, og administratorer får instansdækkende roller og IdP-gruppemappings, introducerer host-konfiguration til SSH- og Git-adgangsoplysninger pr. vært, flytter alle Ansible-ekstravariabler til Vault-krypterede filer og eksponerer Prometheus-metrikker.
Serien starter ved v2.20.0. Rettelsesudgivelser bliver listet i slutningen af denne side,
efterhånden som de udkommer.
Højdepunkter
- Auditlog — hvem gjorde hvad, hvorfra og med hvilket resultat; en administratorside, opbevaringspolitik og eksport til SIEM via Syslog / Splunk HEC (eksport og filtre i Pro).
- Workflows — delay-knuder, uforanderlige revisioner bundet til kørsler, outputs leveret som inputs til den næste opgave, workflow-variabler der spørges om i en Kør-dialog, en redesignet editor med genvejstaster og fortryd, samt webhooks der starter workflows.
- Flere roller pr. medlem, roller med id’er og slugs, globale roller med instansdækkende rettigheder (Pro) og IdP-gruppe → rolle-mappings, der anvendes ved login (Enterprise).
- Eksterne identiteter — LDAP- og OIDC-logins bindes til konti ud fra udbyderens stabile id, ikke ud fra e-mail; flere LDAP-kataloger på én loginside.
- Host-konfiguration — knyt SSH-værter og Git-URL’er til projektets adgangsoplysninger; anvendes ved klon, Galaxy, Terraform-moduler og Ansible.
- Ansible-ekstravariabler ligger ikke længere på kommandolinjen; hemmeligheder sendes i en Ansible Vault-krypteret fil, og Jinja2 inde i værdier evalueres ikke længere.
- Skabeloner: Ansible-arbejdsmappe, unikke navne og
template_namei opgave-API’et, undertrykte fejlnotifikationer, skjult Dry Run / Diff, Galaxy-installationsindstillinger, survey-variabler med flere valg, survey-hemmeligheder på eksterne runnere. - Monorepo-repositories deler én checkout mellem skabeloner; Git-genforsøg, parallel hentning af undermoduler, kontrol af SSH-værtsnøgler.
- Prometheus-metrikker på
/api/metrics. - Generér SSH-nøglepar på serveren og kopiér den offentlige nøgle fra Key Store.
Auditlog

Semaphore registrerer nu sikkerhedsrelevante hændelser i en dedikeret log, der kun kan tilføjes til. Aktivér den med:
"audit": {
"enabled": true,
"instance_id": "semaphore-prod"
}
(SEMAPHORE_AUDIT_ENABLED, SEMAPHORE_AUDIT_INSTANCE_ID; instance_id er obligatorisk og
navngiver installationen på hver hændelse.)
Hvad der registreres. 116 hændelsestyper i otte kategorier: auth (logins, logouts, MFA,
afviste API-tokens, afviste forespørgsler, CSRF-blokeringer), iam (brugere, adgangskoder,
API-tokens, identiteter, medlemskaber, roller, skabelonrettigheder), resource (projekter,
sikkerhedskopier, inventories, repositories, skabeloner, tidsplaner, integrationer,
host-konfigurationer, workflows, variabelgrupper), secret (adgangsoplysninger og
hemmelighedslagre), task (start med udløseren, afslutning med resultat og varighed, godkendelser,
stop, sletning af historik), runner (registrering, ændringer, afviste rapporter), system
(indstillinger, licens) og audit selv (start, opbevaring, eksport). Adgangskoder, tokens,
hemmelige værdier, opgaveoutput og variabler skrives aldrig.
Hændelsens konvolut. Hver hændelse indeholder en UUID, et fortløbende sekvensnummer uden huller,
et UTC-tidsstempel med mikrosekunder, aktøren (bruger / anonym / system / runner / integration, med
session- eller API-token-godkendelse og et token-fingerprint), kilde-IP og User-Agent, målet,
projektet, et forespørgsels-id (som også returneres i svarheaderen X-Request-ID), instans-id’et og
HA-knudens id. Resultatet er success eller failure med en lukket liste af årsager; en handling,
der gemte objektet, men fejlede i et senere trin, er en success med partial = true. Bag en reverse
proxy betros X-Forwarded-For kun fra audit.trusted_proxy_cidrs.

Administratorside. Auditlog i brugermenuen (/audit-log) viser hændelserne med de nyeste
først, 50 pr. side, med Ældre / Nyere-paginering; en række åbner et kort med sektionerne Hvem,
Objekt, Hvor, Hvornår, Detaljer og Teknisk samt en knap, der kopierer hændelsen som den
JSON, der sendes til et SIEM. Adgang kræver den nye globale rettighed Læs auditloggen.
Opbevaring. audit.retention_days sletter ældre hændelser i batches, hver time med jitter, så
HA-knuder ikke kolliderer; hver kørsel, der sletter noget, registreres selv.
Pro: filtre og eksport. Filtrér på periode, bruger, projekt, hændelsestype, resultat og IP; spring videre fra en vilkårlig værdi på et kort; eksportér det aktuelle udvalg som CSV eller JSON Lines.
Pro: SIEM-eksport. To destinationer, hver med sin egen cursor, så intet springes over, når en
modtager er nede: Syslog over TLS (RFC 5424, hændelsens JSON som body) via audit.syslog og
Splunk HTTP Event Collector via audit.splunk_hec (url, token, index, source,
sourcetype, ca_file, …). Levering sker mindst én gang, ordnet efter sekvens; i HA eksporterer
kun én knude pr. destination, koordineret via en Redis-lease. Tre Prometheus-serier beskriver
eksportøren: semaphore_audit_export_pending_events,
semaphore_audit_export_oldest_pending_seconds og semaphore_audit_export_errors_total.
Lagring: tabellerne audit_event, audit_event_sequence, audit_export_state (migreringerne
v2.20.9 til v2.20.11). API: GET /api/audit/events og GET /api/audit/events/export.
Workflows
Workflows er en Pro-funktion; Beta-mærkatet er væk.
Delay-knuder
En fjerde knudetype ved siden af opgave, godkendelse og note: Delay sætter kørslen på pause i et
antal sekunder og frigiver derefter sine forbindelser. Kørselsvisningen viser en live nedtælling på
kortet; en stoppet kørsel annullerer forsinkelsen. Feltet delay_seconds, migrering v2.20.2.
Revisioner
Hver gang et workflow gemmes, oprettes en ny revision af grafen; en kørsel fastholder den
revision, den startede fra, så en redigering af et workflow aldrig ændrer en kørsel, der er i gang,
og aldrig efterlader knuderne fra tidligere kørsler uden ophæng. Editoren viser en rev. N-chip og
hvor mange kørsler der stadig afvikler en ældre revision; kørselsvisningen viser, hvilken revision
den afvikler. Revisioner, som ingen kørsel refererer til, slettes, når en nyere gemmes. API:
GET …/workflows/{id}/revisions og …/revisions/{revision_id}.
Outputs og inputs

En opgave kan videregive strukturerede data til de knuder, der kommer efter den. Hver opgave, der
startes af et workflow, får SEMAPHORE_OUTPUTS_FILE; alt hvad den skriver dertil som et
JSON-objekt, bliver dens outputs:
cat > "$SEMAPHORE_OUTPUTS_FILE" <<EOF
{"image_tag": "1.4.2", "replicas": 3, "subnet_ids": ["subnet-1", "subnet-2"]}
EOF
Ansible producerer outputs med ansible.builtin.set_stats via et medfølgende callback-plugin;
outputs fra Terraform, OpenTofu og Terragrunt opsamles automatisk fra output -json
(sensitive-værdier springes over og listes som Ikke opsamlet). Outputs læses kun, når opgaven
lykkes; grænserne er 100 outputs, 32 KB hver og 256 KB pr. fil.
En forbindelse ind i en opgaveknude leverer inputs — den udfylder survey-variablerne i målskabelonen med outputs fra kildeknuden:
- Efter navn (standard): hvert output, hvis navn svarer til en survey-variabel, udfylder den.
- Map inputs eksplicit: angiv de par af
variable ← output key, der skal leveres; når workflowet har en afsluttet kørsel, foreslår panelet de nøgler, den kørsel producerede.

Værdier konverteres til variablens type, godkendelses- og delay-knuder sender outputs videre, en
eksplicit mapping vinder over levering efter navn, og en påkrævet variabel uden værdi får
knudens opgave til at fejle, før den starter, så kørslen følger sine Ved fejl-forbindelser.
Kørselsvisningen viser et N outputs-badge pr. knude, opgavedialogen har en Outputs-tabel, og
opgaveloggen starter med én linje Input "x" <- output "y" of node N pr. leveret værdi. Outputs
gemmes i klartekst og udfylder aldrig en secret-variabel; en secret kan ikke sendes videre
gennem outputs. Opgaver på eksterne runnere producerer og modtager outputs; Docker- og
Kubernetes-eksekvererne opsamler dem endnu ikke.

Workflow-variabler og Kør-dialogen
Et workflow har sine egne survey-variabler, som der spørges om én gang i en Kør “…”-dialog,
når en kørsel starter (et workflow uden variabler starter med det samme, som før). Svarene gemmes på
kørslen, vises som chips i en Variabler-stribe over kørselslærredet og når kun frem til en
opgave gennem en eksplicit binding i knudepanelet — en workflow-variabel siver aldrig ind i en
skabelon via navnet. Hemmeligheder er ikke tilladt som workflow-variabler.
POST …/workflows/{id}/runs accepterer {"environment": {"image_tag": "1.4.3"}}; et svar, der ikke
passer til sin type, eller en manglende påkrævet værdi afviser starten.
Miljøet for en workflow-opgave
Hver opgave, der startes af et workflow, modtager SEMAPHORE_WORKFLOW_ID,
SEMAPHORE_WORKFLOW_RUN_ID, SEMAPHORE_WORKFLOW_URL (kræver web_host) og
SEMAPHORE_OUTPUTS_FILE — for hver app og også på eksterne runnere.
Redesignet editor

- Nye knudekort med typefelt, status, varighed, output-badge og inline Godkend / Afvis; forbindelseslabels med en betingelses-dropdown på stedet og en sletteknap; et lærred med punktgitter.
- Hurtig-tilføj-menu fra en knudes
+-håndtag, et højreklik på lærredet eller knappen i den tomme tilstand: en søgbar liste over knudetyper og opgaveskabeloner; den nye knude forbindes ved succes. - Fortryd / gentag (
Ctrl/⌘+Z,Ctrl/⌘+Shift+Z), omdøbning af workflowet på stedet, en Problemer-menu, der fokuserer den knude, som fejler, et Gem-badge for ugemte ændringer og en advarsel, når siden forlades. - Genvejstaster på lærredet: piletasterne panorerer (
Shiftfor et stort spring),+/-zoomer,0tilpasser grafen,1nulstiller zoom,Escrydder markeringen; knudekort kan få tastaturfokus. - Flydende kontroller: zoom ind / ud, tilpas visning, Tidy up-autolayout, zoomprocent.
- Én chevron skjuler paletten og hovednavigationen samtidig; tilstanden huskes.
- Overscroll på touchpad udløser ikke længere browserens tilbage-gestus på macOS.

Webhooks starter workflows
En integration kan nu køre et workflow i stedet for en skabelon (Runs: Template / Workflow i
integrationsformularen). Hver udtrukket værdi bliver et svar til workflowets survey. Administration
af sådanne integrationer kræver Pro-funktionen workflow_integrations_management. For
skabelonintegrationer sætter en udtrukket Task Params-værdi med navnet git_branch grenen for den
startede opgave, når skabelonen tillader at tilsidesætte den.
API-ændringer
POST …/workflows/{id}/run er omdøbt til POST …/workflows/{id}/runs og accepterer environment i
body. Kørselsdetaljer indeholder revision_id, revision, et delay-objekt pr. knude og
task.artifacts. workflow_run_id, workflow_node_id og artifacts leveret af klienten på en
opgave ignoreres, så en opgave ikke kan udgive sig for at være en knude i en anden kørsel.
Roller og adgangskontrol
Flere roller pr. medlem

Et projektmedlem har et sæt roller, der redigeres som chips på Team-siden. API’et accepterer
roles: ["manager", "release_approver"] ved siden af det ældre role; svaret beholder kun den
skalare role for medlemmer med én enkelt rolle. En ikke-administrator kan ikke tage den
indbyggede Owner-rolle fra den sidste ejer.
Roller med id’er, slugs og scopes
Roller er nu rækker med et heltals-id og et slug (^[A-Za-z0-9_-]{1,100}$, udledt af navnet i
formularen); de fire indbyggede roller er også rækker og kan ikke længere overskygges af en
tilpasset rolle. Roller har et scope: indbygget, delt (kan bruges i alle projekter) eller
projekt. Sletning af en rolle, der er i brug, svarer 409 med dens konsekvenser (medlemmer,
projekter, skabelonrettigheder, mappings) og kan gentages med ?force=true — Slet med
tildelinger i brugerfladen. Migreringerne v2.20.12 og v2.20.13 genopbygger rolletabellerne; se
opgraderingsbemærkningerne.
Globale roller og rettigheder (Pro)

Instansdækkende rettigheder er ikke længere kun administrator-flaget. En global rolle giver en
maske med fire rettigheder — Administrér brugere, Administrér globale roller, Administrér
systemindstillinger, Læs auditloggen — og tildeles brugere på fanen Roller på Brugere-siden
(/users/roles) og i fanen Globale roller i brugerdialogen, som også viser de effektive
rettigheder, og hvilken rolle der giver hver af dem. Hver administratorrute er beskyttet af en af de
fire bits; GET /api/user returnerer global_permissions. En instans har altid mindst én
administrator, håndhævet med en rækkelås, der er sikker på tværs af HA-knuder. En bruger med
Administrér brugere kan ikke redigere en administrator eller nogen, der har en rettighed, som
brugeren selv mangler. API: /api/global-roles, /api/users/{id}/global-roles,
/api/users/{id}/global-permissions, katalog på /api/global-roles/permissions.
Gruppe-rollemappings (Enterprise)

Knyt en gruppe fra en identitetsudbyder til en projektrolle på den nye side Gruppemappings
(/role-mappings): udbyder, gruppe, projekt, rolle. Ved hvert OIDC-login bringes brugerens mappede
roller i overensstemmelse med grupperne i tokenet (udbyderens groups_claim). Mappede roller vises
på Team-siden som låste chips med et provider: group-tooltip og kan ikke fjernes som
medlemsroller; mappede roller tæller ikke som projektets sidste ejer. Et login med adgangskode eller
LDAP rydder mappede roller, fordi det ikke medbringer grupper. API: /api/role_mappings.
Autentificering og identiteter

- Eksterne identiteter. LDAP- og OIDC-logins bindes til Semaphore-konti ud fra udbyderens
stabile id (OIDC
sub, LDAP DN) i den nye tabeluser__external_identity, ikke ud fra e-mail. Det lukker den klasse af fejl, hvor en IdP, der accepterer en vilkårlig indtastet adresse, overtager en anden brugers konto.external_auth_email_matching(autosom standard,always,never) styrer, om en eksisterende ekstern bruger uden en identitet stadig må matches på e-mail én gang; lokale konti med adgangskode overtages aldrig. En OIDC-e-mail tæller kun, nåremail_verifieder sat, og udbyderen sætterrequire_verified_email. Brugere tilknytter og fjerner selv identiteter i kontodialogen (/api/users/{id}/identities,POST /api/user/identities/ldap,/api/auth/oidc/{provider}/login?link=1). - Flere LDAP-kataloger.
ldap_providerser et map af navngivne kataloger, hver med sin egen server, bind, søgning, mappings, farve og rækkefølge; den ældre fladeldap_*-blok fungerer stadig som udbyderenldap. Loginsiden viser en vælger, når der er mere end én fane, og den interne fane sender aldrig en adgangskode til et katalog.GET /api/auth/loginreturnererldap_providersoglogin_with_password. - LDAPS-certifikater verificeres som standard. Sæt
ldap_tls_skip_verify(flad blok) ellertls_skip_verify(pr. udbyder) for et selvsigneret certifikat. - Absolut sessionslevetid.
auth.max_session_life_hours(SEMAPHORE_AUTH_MAX_SESSION_LIFE_HOURS) lader en session udløbe et fast tidsrum efter login, uanset aktiviteten;0bevarer kun inaktivitets-timeouten. - En bruger uden projekter, som ikke må oprette et, ser en Ingen projekter endnu-side i stedet for
en formular, som brugeren ikke kan indsende;
POST /api/projectssvarer403i det tilfælde. - Det sprog, der vælges i brugermenuen, gemmes på serveren og følger brugeren på tværs af browsere
(
langi/api/user/options).
Host-konfiguration

En ny projektside, Host-konfiguration, knytter SSH-værter og Git-URL’er til projektets adgangsoplysninger:
- en Host-mapping (
bastion.example.com) tilknytter en SSH-nøgle som enHost-blok i en genereretssh_config; - en URL-mapping (
https://github.com/acme/; et præfiks, der ender på/, dækker en hel gruppe) tilknytter en SSH-nøgle eller et login/adgangskode (kun HTTPS) som en Git-insteadOf-omskrivning; den mest specifikke URL vinder.
Mappings gælder for skabelonens repository og dets undermoduler, roller og samlinger fra
requirements.yml, moduler i terraform init, git-kommandoer kørt af en playbook,
inventory-repositories og inventory-værter samt gennemsyn af grene og playbooks; de sendes til
eksterne runnere. Private nøgler rører aldrig disken — én SSH-agent pr. mapping, bundet med
IdentityAgent; adgangskoder sendes via GIT_CONFIG_PARAMETERS, og repository-URL’er maskeres i
opgavelogs. En nøgle, der er refereret af en mapping, kan ikke slettes. Mappings er en del af
projektsikkerhedskopier. Kræver git_client: cmd_git. Tabellen project__host_config, migrering
v2.20.7; API /api/project/{id}/host_configs.
Skabeloner og opgaver

-
Ansible-arbejdsmappe. Anden arbejdsmappe kører
ansible-playbookfra en undermappe i repositoryet; stien skal forblive inde i checkouten (working_directory, migreringv2.20.3). -
Unikke skabelonnavne pr. projekt (migrering
v2.20.4), ogPOST /api/project/{id}/tasksaccepterertemplate_namei stedet fortemplate_id. -
Undertryk fejlnotifikationer pr. skabelon, ved siden af den eksisterende undertrykkelse af succesbeskeder; e-mail-advarsler respekterer begge for første gang (
suppress_error_alerts, migreringv2.20.5). -
Skjul Dry Run / Diff i opgavedialogen pr. skabelon; serveren tilføjer heller ikke længere
--check/--difffor den skabelon (task_params.hide_dry_run,hide_diff). -
Galaxy-installationsindstillinger — en sammenklappelig sektion med Spring Galaxy-installation over, separate CLI-argumenter til
ansible-galaxy role installogcollection install(en tilladelsesliste af flag;--token,--api-keyog sti-flag afvises) samt prompten til tilsidesættelse pr. opgave. -
Playbook-vælgeren viser undermapper, mens du skriver, filtreret pr. app (
.ymlfor Ansible, mapper på øverste niveau for Terraform / OpenTofu / Terragrunt / Pulumi,.sh,.py,.ps1), springer Ansible-layoutmapper og punktmapper over, er begrænset til 30 poster og gennemser en shallow clone, der er indespærret til repositoryets rod. -
Survey-variabler med flere valg — den nye type
selectaccepterer flere værdier, gengivet som chips i opgavedialogen;default_valuekan være et array.
-
Survey-hemmeligheder når frem til eksterne runnere. Et
secret-survey-svar ankom tidligere tomt på en runner. Det gemmes nu krypteret som en opgavebundet adgangsnøgle (access_key.task_id,expire_at, migreringv2.20.1), dekrypteres af den HA-knude, der betjener runneren, slettes når opgaven slutter og ryddes op hver time; den er skjult fra Key Store, sikkerhedskopier og nøgle-API’et. -
YAML-ekstravariabler. Editoren til variabelgrupper har fået en Tabel | JSON | YAML-omskifter og en fuldskærmseditor; konverteringer er strenge (datoer forbliver strenge, rødder der ikke er objekter, og ikke-endelige tal afvises). Lagringen er uændret.

-
Opgavesiden navngiver og linker til den tidsplan eller integration, der startede en opgave, og markerer en slettet oprindelse som
#id (deleted). Logtidsstempler markeres ikke længere, når en log kopieres. -
Tidsplaner validerer udtrykket på serveren, før de gemmes, så
@hourlyaccepteres, og tidszone-banneret kan lukkes.
-
Stop af en lokal opgave afslutter hele dens procesgruppe:
SIGTERM, en frist på 15 sekunder, derefterSIGKILL; efterladtessh- eller udbyderprocesser overlever ikke længere opgaven. En stoppet Terraform-plan fortsætter ikke længere; en plan, der afslutter med0påSIGTERM, læses ikke som en succes. -
Inventory-feltet
repository_idbevares kun for typenfileog skal tilhøre projektet. -
Serverlogs navngiver brugeren i posterne Task added to queue / Task started.
Hemmeligheder og Ansible Vault
-
Ekstravariabler sendes i filer, ikke på kommandolinjen. Variabelgrupper, survey-svar, workflow-inputs og opgavedetaljer skrives til en
0600YAML-fil, der sendes som--extra-vars @file. Hemmeligheder —secret-survey-svar og hemmeligheder i variabelgrupper — lægges i en anden fil, der er krypteret i formatet Ansible Vault 1.1 / AES-256 af en native Go-implementering (ingenansible-vault-binær nødvendig), og låses op med en engangsadgangskode, der svares påansible-playbooks--vault-id <uuid>@prompt. Hverken værdierne eller adgangskoden optræder ips, og begge filer fjernes, når opgaven slutter. -
Jinja2 i værdier er data, ikke kode. Hver streng, der indeholder
{{,{%,{#eller en#jinja2:-header, mærkes rekursivt som!unsafe, så et survey-svar som{{ lookup('pipe', 'id') }}videregives ordret. Strenge uden en delimiter mærkes med vilje ikke: ansible-core ≥ 2.19 genfortolker!unsafe-skalarer, hvilket ville gøre"2026.08"til et decimaltal. -
Et nyt debug-namespace
extra_vars(SEMAPHORE_DEBUG_FILTER=extra_vars) logger, hvordan variabler opdeles og skrives — kun navne, filer og størrelser, aldrig værdier. -
Generér et SSH-nøglepar på serveren. Generate SSH Key i Key Store opretter en RSA-nøgle; den offentlige nøgle gemmes sammen med nøglen, vises med Vis / Skjul og en kopiknap og tilbydes i en dialog lige efter oprettelsen (
generate_ssh_key).
-
En opdatering af en nøgle skriver kun
type,secretog den offentlige del, når Override er sat, så en klient ikke kan ændre en nøgles indhold uden at erstatte hemmeligheden. -
Læsning af adgangsoplysninger fra en miljøvariabel på serveren eller en fil under
dirs.secretser nu dokumenteret (fanerne Env / File i Key Store-formularen).
Repositories og Git
- Monorepo: én checkout for alle skabeloner. En repository-indstilling kloner repositoryet én
gang og deler det mellem skabeloner i stedet for en kopi pr. skabelon; checkouten låses under
fetch og pull, og opgaverne kører derefter parallelt. Skabeloner for et sådant repository kan ikke
have deres egen gren, og deres opgaver kan ikke tilsidesætte gren eller commit (
monorepo, migreringv2.20.11). - Git-genforsøg.
cloneogpullforsøges igen med en eksponentiel forsinkelse med loft på ét minut;git_attempts(SEMAPHORE_GIT_ATTEMPTS, standard4). - Parallelle undermoduler.
git_submodule_jobs(SEMAPHORE_GIT_SUBMODULE_JOBS, standard4) sendes som--jobs. - Kontrol af SSH-værtsnøgler. Ny
ssh-sektion:config_path,known_hosts_file(SEMAPHORE_SSH_KNOWN_HOSTS_FILE) ogstrict_host_key_checking—no(standard),yeselleraccept-new— anvendt på Git over SSH. - Gennemsyn af repositories bruger en shallow clone pr. gren; adgangsoplysninger procent-kodes ved klon på bare metal og maskeres i logs og hændelsesfeedet.
Runnere og integrationer
-
runner.check_interval_seconds(SEMAPHORE_RUNNER_CHECK_INTERVAL_SECONDS, standard5) bestemmer, hvor ofte en runner poller; en Avancerede indstillinger-kontakt på Runners-siden lægger den ind i de genererede env-, konfigurations- og Docker-udklip (udsendt iv2.19.17). -
runner.connection.timeout_seconds(SEMAPHORE_RUNNER_CONNECTION_TIMEOUT_SECONDS, standard3) afgrænser forbindelse, TLS-handshake og svarheadere hver for sig; upload af logs afbrydes ikke. -
runners.default_global_runners_mode(SEMAPHORE_DEFAULT_GLOBAL_RUNNERS_MODE:disable,prefer,require) erstatter det forældedeuse_remote_runner;runners.registration_tokenerstatterrunner_registration_tokenpå øverste niveau. -
Serverside-diagnostik for runnere under
SEMAPHORE_DEBUG_FILTER=runner: årsager til afviste tokens, genstart og detektion af online-status, afviste fremdriftsrapporter, sporing af opgavefordeling. -
Runnernes
unregister-forespørgsler godkendes; runner-klienten afviser HTTP-omdirigeringer. -
HMAC-SHA512-godkendelse af webhooks (
hmac-sha512) ved siden af den eksisterende HMAC-SHA256; signaturheaderen kan konfigureres.
-
En webhook, hvis integration tilhører et andet projekt, afvises.
Observerbarhed
-
Prometheus-metrikker.
GET /api/metricsbag HTTP Basic Auth med statiske tjeneste-adgangsoplysninger:"metrics": { "enabled": true, "username": "prometheus", "password": "…" }(
SEMAPHORE_METRICS_ENABLED,SEMAPHORE_METRICS_USERNAME,SEMAPHORE_METRICS_PASSWORD.) Serier:semaphore_tasks_running,semaphore_tasks_total{status}, de standardiseredego_*- ogprocess_*-collectors samt eksportmålerne for auditloggen i Pro. -
Nye debug-namespaces
extra_varsogrunner; gennemsyn af repositories logger Git-output på DEBUG. -
Eksport og gendannelse af projektsikkerhedskopier logges.
Sikkerhed
- Tilknytning af identiteter via udbyder-id i stedet for e-mail; verificering af LDAPS-certifikater slået til som standard.
- Ekstravariabler væk fra kommandolinjen; hemmeligheder Vault-krypteret; Jinja2 i værdier evalueres ikke.
- Forfalskede
workflow_run_id,workflow_node_idogartifactsfjernes fra klientopgaver. - Administratorruter beskyttes af eksplicitte globale rettigheder i stedet for administrator-flaget; ukendte rettighedsbits afvises; beskyttelse mod rettighedseskalering i brugeradministrationen.
- Playbook-vælgeren er indespærret til repositoryets rod (
OpenRoot), begrænset og filtreret. - Rødder for ekstravariabler og YAML-tal valideres; Galaxy-CLI-argumenter på en tilladelsesliste.
- Repository-adgangsoplysninger maskeres i logs og hændelsesfeedet;
=escapes i Git-konfigurationsparametre. - Audit-endepunkter afviser læsninger på tværs af websteder og misdannede cursors; betroede proxy-netværk valideres.
- Runnernes
unregistergodkendes; omdirigeringer afvises af runner-klienten. - Projekt- og integrations-id’er for webhooks verificeres.
- Lokale opgaver stoppes sammen med hele deres procesgruppe.
Opgraderingsbemærkninger
Væsentlige og adfærdsmæssige ændringer
- Skabelonnavne skal være unikke pr. projekt. Migrering
v2.20.4tilføjer et unikt indeks; omdøb dubletter før opgraderingen. - Rolletabellerne genopbygges (
v2.20.12/v2.20.13). Tag en sikkerhedskopi først. En tilpasset rolle, hvis slug kolliderer uden hensyn til store og små bogstaver med en indbygget eller en anden rolle, omdøbes (logges); skabelonrettigheder, der peger på en rolle, der ikke kan opløses, fjernes (logges). Medlemskab er flyttet tilproject__user_role; kolonnenproject__user.roleer væk. GET /api/project/{id}/usersreturnerer kunrolefor medlemmer med én enkelt rolle — læsroles./roles*er flyttet fra administrator-flaget til rettigheden Administrér globale roller; administratorer er upåvirkede.- LDAPS-certifikater verificeres som standard. Sæt
ldap_tls_skip_verifyeller en udbyderstls_skip_verifyfor selvsignerede certifikater. ansible-playbookkaldes anderledes:--extra-vars @fileplus en ekstra fil og en--vault-id <uuid>@prompt, når opgaven har hemmeligheder, også for skabeloner uden en vault. Alt, der parser kommandolinjen, eller enansible.cfg, der forbyder vault-prompts, er påvirket.- Jinja2 inde i ekstravariabel-værdier evalueres ikke længere. En playbook, der forlod sig på at templatere en webhook- eller survey-værdi, holder op med at gøre det.
- Endepunktet for workflow-kørsler er omdøbt:
POST …/workflows/{id}/run→…/runs. - Monorepo-repositories tilsidesætter skabelonen: ingen gren pr. skabelon, ingen tilsidesættelse af gren eller commit i opgaver.
- Inventory-feltet
repository_idfjernes for alle typer undtagenfile. - Stop af en lokal opgave dræber dens procesgruppe (endnu ingen tilsvarende funktion på Windows).
- Workflow-outputs opsamles endnu ikke af Docker- og Kubernetes-eksekvererne; survey-hemmeligheder når endnu ikke frem til disse eksekverere.
Ny konfiguration
audit, metrics, auth.max_session_life_hours, ssh.{config_path,known_hosts_file,strict_host_key_checking},
git_attempts, git_submodule_jobs, ldap_providers, ldap_tls_skip_verify,
external_auth_email_matching, groups_claim og require_verified_email pr. OIDC-udbyder,
runner.check_interval_seconds, runner.connection.timeout_seconds,
runners.{default_global_runners_mode,registration_token}. Alle er valgfrie. Konfigurationsfelter
af pointer-type kan nu sættes via miljøvariabler. Referencesiderne for konfiguration og CLI
genereres ud fra kildekoden.
Databasemigreringer
v2.20.0 eksterne identiteter · v2.20.1 opgavebundne survey-hemmeligheder · v2.20.2
delay-knuder · v2.20.3 arbejdsmappe · v2.20.4 unikke skabelonnavne · v2.20.5 undertrykkelse af
fejladvarsler · v2.20.7 host-konfiguration · v2.20.8 workflow-revisioner · v2.20.9–v2.20.11
auditlog og indekser, input-mappings på forbindelser, monorepo-flag · v2.20.12–v2.20.13
rolletabeller, workflow-variabler · v2.20.14 workflow-integrationer og gruppemappings ·
v2.20.16 globale roller.
Afhængigheder
Go 1.26; Docker-billeder på Alpine 3.24; prometheus/client_golang 1.23 tilføjet; go-oidc 3.21,
go-ldap 3.4.14, golang.org/x/crypto 0.57, modernc.org/sqlite 1.59, logrus 1.10; i frontenden
js-yaml 5 og cron-parser 5.10. Nye ét-kliks-udrulninger: Cloudzy, RepoCloud og Pethost.
