Workflow-kørsel med en godkendelse, en delay-knude og kørselsvariabler

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_name i 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

Auditlog-siden

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.

Kort for en audithændelse

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

Kørselsvisning med output-badges

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.

Forbindelsespanel med eksplicit input-mapping

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.

Opgavedialog med Outputs-tabellen

Workflow-variabler og Kør-dialogen

Kør-dialog, der spørger om workflow-variabler

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

Workflow-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 (Shift for et stort spring), + / - zoomer, 0 tilpasser grafen, 1 nulstiller zoom, Esc rydder 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.

Hurtig-tilføj-menu

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

Team-siden med 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)

Fanen Globale roller på Brugere-siden

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.

En brugers globale roller

Gruppe-rollemappings (Enterprise)

Siden Gruppemappings

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

Loginside med flere LDAP-kataloger

  • Eksterne identiteter. LDAP- og OIDC-logins bindes til Semaphore-konti ud fra udbyderens stabile id (OIDC sub, LDAP DN) i den nye tabel user__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 (auto som 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år email_verified er sat, og udbyderen sætter require_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_providers er et map af navngivne kataloger, hver med sin egen server, bind, søgning, mappings, farve og rækkefølge; den ældre flade ldap_*-blok fungerer stadig som udbyderen ldap. 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/login returnerer ldap_providers og login_with_password.
  • LDAPS-certifikater verificeres som standard. Sæt ldap_tls_skip_verify (flad blok) eller tls_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; 0 bevarer 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/projects svarer 403 i det tilfælde.
  • Det sprog, der vælges i brugermenuen, gemmes på serveren og følger brugeren på tværs af browsere (lang i /api/user/options).

Host-konfiguration

Siden 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 en Host-blok i en genereret ssh_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.
Formular til host-mapping

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

Skabelonformular med arbejdsmappe og notifikationsindstillinger

  • Ansible-arbejdsmappe. Anden arbejdsmappe kører ansible-playbook fra en undermappe i repositoryet; stien skal forblive inde i checkouten (working_directory, migrering v2.20.3).

  • Unikke skabelonnavne pr. projekt (migrering v2.20.4), og POST /api/project/{id}/tasks accepterer template_name i stedet for template_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, migrering v2.20.5).

  • Skjul Dry Run / Diff i opgavedialogen pr. skabelon; serveren tilføjer heller ikke længere --check / --diff for 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 install og collection install (en tilladelsesliste af flag; --token, --api-key og sti-flag afvises) samt prompten til tilsidesættelse pr. opgave.

  • Playbook-vælgeren viser undermapper, mens du skriver, filtreret pr. app (.yml for 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 select accepterer flere værdier, gengivet som chips i opgavedialogen; default_value kan være et array.

    Ny opgavedialog med en survey-variabel med flere valg
  • 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, migrering v2.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.

    Variabelgruppe-editoren i YAML-tilstand

  • 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å @hourly accepteres, og tidszone-banneret kan lukkes.

    Tidsplansformular
  • Stop af en lokal opgave afslutter hele dens procesgruppe: SIGTERM, en frist på 15 sekunder, derefter SIGKILL; efterladte ssh- eller udbyderprocesser overlever ikke længere opgaven. En stoppet Terraform-plan fortsætter ikke længere; en plan, der afslutter med 0 på SIGTERM, læses ikke som en succes.

  • Inventory-feltet repository_id bevares kun for typen file og 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 0600 YAML-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 (ingen ansible-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 i ps, 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).

    Nøgle med et genereret SSH-nøglepar
  • En opdatering af en nøgle skriver kun type, secret og 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.secrets er nu dokumenteret (fanerne Env / File i Key Store-formularen).


Repositories og Git

Repository-formular med indstillingen for enkelt checkout
  • 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, migrering v2.20.11).
  • Git-genforsøg. clone og pull forsøges igen med en eksponentiel forsinkelse med loft på ét minut; git_attempts (SEMAPHORE_GIT_ATTEMPTS, standard 4).
  • Parallelle undermoduler. git_submodule_jobs (SEMAPHORE_GIT_SUBMODULE_JOBS, standard 4) sendes som --jobs.
  • Kontrol af SSH-værtsnøgler. Ny ssh-sektion: config_path, known_hosts_file (SEMAPHORE_SSH_KNOWN_HOSTS_FILE) og strict_host_key_checking — no (standard), yes eller accept-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, standard 5) 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 i v2.19.17).

  • runner.connection.timeout_seconds (SEMAPHORE_RUNNER_CONNECTION_TIMEOUT_SECONDS, standard 3) 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ældede use_remote_runner; runners.registration_token erstatter runner_registration_token på ø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.

    Integrationsformular med HMAC-SHA512
  • En webhook, hvis integration tilhører et andet projekt, afvises.


Observerbarhed

  • Prometheus-metrikker. GET /api/metrics bag 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 standardiserede go_*- og process_*-collectors samt eksportmålerne for auditloggen i Pro.

  • Nye debug-namespaces extra_vars og runner; 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_id og artifacts fjernes 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 unregister godkendes; 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

  1. Skabelonnavne skal være unikke pr. projekt. Migrering v2.20.4 tilføjer et unikt indeks; omdøb dubletter før opgraderingen.
  2. 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 til project__user_role; kolonnen project__user.role er væk.
  3. GET /api/project/{id}/users returnerer kun role for medlemmer med én enkelt rolle — læs roles.
  4. /roles* er flyttet fra administrator-flaget til rettigheden Administrér globale roller; administratorer er upåvirkede.
  5. LDAPS-certifikater verificeres som standard. Sæt ldap_tls_skip_verify eller en udbyders tls_skip_verify for selvsignerede certifikater.
  6. ansible-playbook kaldes anderledes: --extra-vars @file plus 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 en ansible.cfg, der forbyder vault-prompts, er påvirket.
  7. 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.
  8. Endepunktet for workflow-kørsler er omdøbt: POST …/workflows/{id}/run → …/runs.
  9. Monorepo-repositories tilsidesætter skabelonen: ingen gren pr. skabelon, ingen tilsidesættelse af gren eller commit i opgaver.
  10. Inventory-feltet repository_id fjernes for alle typer undtagen file.
  11. Stop af en lokal opgave dræber dens procesgruppe (endnu ingen tilsvarende funktion på Windows).
  12. 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.