Pokretanje toka posla sa odobrenjem, čvorom čekanja i promenljivim pokretanja

Semaphore UI 2.20 dodaje revizioni dnevnik sa izvozom u SIEM, razvija Tokove posla u pravi pajplajn mehanizam sa čvorovima čekanja, revizijama, izlazima koji se prenose između zadataka i promenljivim tokova posla, preuređuje uloge tako da član može imati više njih, a administratori dobijaju uloge na nivou instance i mapiranja IdP grupa, uvodi konfiguraciju hostova za SSH i Git akreditive po hostu, premešta svaku dodatnu Ansible promenljivu u fajlove šifrovane Vault-om i izlaže Prometheus metrike.

Ova linija počinje verzijom v2.20.0. Zakrpe će biti navedene na kraju ove stranice kako budu izlazile.

Istaknuto

  • Revizioni dnevnik — ko je šta uradio, odakle i sa kakvim rezultatom; administratorski ekran, politika zadržavanja i izvoz u Syslog / Splunk HEC za SIEM sisteme (izvoz i filtri u Pro izdanju).
  • Tokovi posla — čvorovi čekanja, nepromenljive revizije vezane za pokretanja, izlazi koji se isporučuju kao ulazi sledećeg zadatka, promenljive toka posla koje se traže u dijalogu za pokretanje, redizajnirani uređivač sa prečicama i operacijom vrati, i webhook-ovi koji pokreću tokove posla.
  • Više uloga po članu, uloge sa ID-jevima i slug-ovima, globalne uloge sa dozvolama na nivou instance (Pro) i mapiranja IdP grupa → uloga koja se primenjuju pri prijavi (Enterprise).
  • Spoljni identiteti — LDAP i OIDC prijave se vezuju za račune pomoću stabilnog ID-ja provajdera, a ne pomoću e-pošte; više LDAP direktorijuma na jednoj stranici za prijavu.
  • Konfiguracija hostova — mapirajte SSH hostove i Git URL adrese na akreditive projekta, uz primenu na kloniranje, Galaxy, Terraform module i Ansible.
  • Dodatne Ansible promenljive se više nikada ne nalaze u komandnoj liniji; tajne se prenose u fajlu šifrovanom Ansible Vault-om, a Jinja2 unutar vrednosti se više ne izvršava.
  • Šabloni: Ansible radni direktorijum, jedinstveni nazivi i template_name u API-ju zadataka, potiskivanje obaveštenja o greškama, skrivanje Dry Run / Diff opcija, opcije Galaxy instalacije, promenljive upitnika sa višestrukim izborom, tajne iz upitnika na udaljenim runner-ima.
  • Monorepo repozitorijumi dele jednu radnu kopiju između šablona; ponovni pokušaji Git operacija, paralelno preuzimanje podmodula, provera SSH ključeva hostova.
  • Prometheus metrike na /api/metrics.
  • Generisanje SSH parova ključeva na serveru i kopiranje javnog ključa iz skladišta ključeva.

Revizioni dnevnik

Ekran revizionog dnevnika

Semaphore sada beleži bezbednosno značajne događaje u posebnom dnevniku u koji se samo dodaje. Omogućava se sa:

"audit": {
  "enabled": true,
  "instance_id": "semaphore-prod"
}

(SEMAPHORE_AUDIT_ENABLED, SEMAPHORE_AUDIT_INSTANCE_ID; instance_id je obavezan i imenuje instalaciju u svakom događaju.)

Šta se beleži. 116 vrsta događaja u osam kategorija: auth (prijave, odjave, MFA, odbijeni API tokeni, odbijeni zahtevi, blokirani CSRF), iam (korisnici, lozinke, API tokeni, identiteti, članstva, uloge, dozvole nad šablonima), resource (projekti, rezervne kopije, inventari, repozitorijumi, šabloni, rasporedi, integracije, konfiguracije hostova, tokovi posla, grupe promenljivih), secret (akreditivi i skladišta tajni), task (pokretanje sa okidačem, završetak sa rezultatom i trajanjem, odobrenja, zaustavljanja, brisanje istorije), runner (registracija, promene, odbijeni izveštaji), system (podešavanja, licenca) i audit sam (pokretanje, zadržavanje, izvoz). Lozinke, tokeni, vrednosti tajni, izlaz zadataka i promenljive se nikada ne upisuju.

Omot događaja. Svaki događaj nosi UUID, redni broj bez praznina, UTC vremensku oznaku u mikrosekundama, aktera (korisnik / anonimni / sistem / runner / integracija, uz autentifikaciju sesijom ili API tokenom i otisak tokena), izvornu IP adresu i User‑Agent, cilj, projekat, ID zahteva (koji se vraća i u X-Request-ID zaglavlju odgovora), ID instance i ID HA čvora. Ishodi su success ili failure sa zatvorenom listom razloga; akcija koja je sačuvala objekat ali nije uspela u kasnijem koraku je uspeh sa partial = true. Iza reverznog proksija, X-Forwarded-For se smatra pouzdanim samo sa mreža navedenih u audit.trusted_proxy_cidrs.

Kartica revizionog događaja

Administratorski ekran. Revizioni dnevnik u korisničkom meniju (/audit-log) prikazuje događaje od najnovijih, 50 po stranici, uz paginaciju Stariji / Noviji; red otvara karticu sa sekcijama Ko, Objekat, Gde, Kada, Detalji i Tehnički podaci i dugmetom koje kopira događaj kao JSON koji se šalje SIEM sistemu. Pristup zahteva novu globalnu dozvolu Čitanje revizionog dnevnika.

Zadržavanje. audit.retention_days briše starije događaje u serijama, na svakih sat vremena sa slučajnim odstupanjem kako se HA čvorovi ne bi sudarali; svaki prolaz koji nešto obriše i sam se beleži.

Pro: filtri i izvoz. Filtrirajte po periodu, korisniku, projektu, vrsti događaja, rezultatu i IP adresi; pređite na filtar iz bilo koje vrednosti na kartici; izvezite trenutni izbor kao CSV ili JSON Lines.

Pro: izvoz u SIEM. Dve destinacije, svaka sa sopstvenim kursorom tako da se ništa ne preskače kada je prijemnik nedostupan: Syslog preko TLS-a (RFC 5424, JSON događaja kao telo) putem audit.syslog i Splunk HTTP Event Collector putem audit.splunk_hec (url, token, index, source, sourcetype, ca_file, …). Isporuka je najmanje jednom, uređena po rednom broju; u HA režimu samo jedan čvor izvozi po destinaciji, uz koordinaciju preko Redis zakupa. Tri Prometheus serije opisuju izvoznik: semaphore_audit_export_pending_events, semaphore_audit_export_oldest_pending_seconds i semaphore_audit_export_errors_total.

Skladištenje: tabele audit_event, audit_event_sequence, audit_export_state (migracije od v2.20.9 do v2.20.11). API: GET /api/audit/events i GET /api/audit/events/export.


Tokovi posla

Tokovi posla su Pro funkcija; oznaka Beta je uklonjena.

Čvorovi čekanja

Četvrta vrsta čvora, pored zadatka, odobrenja i beleške: Čekanje pauzira pokretanje određeni broj sekundi i zatim otpušta svoje veze. Prikaz pokretanja pokazuje odbrojavanje uživo na kartici; zaustavljeno pokretanje otkazuje čekanje. Polje delay_seconds, migracija v2.20.2.

Revizije

Svako čuvanje toka posla kreira novu reviziju grafa; pokretanje fiksira reviziju iz koje je započeto, tako da izmena toka posla nikada ne menja pokretanje u toku niti ostavlja čvorove prošlih pokretanja bez roditelja. Uređivač prikazuje oznaku rev. N i koliko pokretanja još izvršava stariju reviziju; prikaz pokretanja pokazuje koju reviziju izvršava. Revizije na koje se nijedno pokretanje ne poziva brišu se kada se sačuva novija. API: GET …/workflows/{id}/revisions i …/revisions/{revision_id}.

Izlazi i ulazi

Prikaz pokretanja sa oznakama izlaza

Zadatak može predati strukturirane podatke čvorovima koji slede. Svaki zadatak koji pokrene tok posla dobija SEMAPHORE_OUTPUTS_FILE; sve što u njega upiše kao JSON objekat postaje njegov izlaz:

cat > "$SEMAPHORE_OUTPUTS_FILE" <<EOF
{"image_tag": "1.4.2", "replicas": 3, "subnet_ids": ["subnet-1", "subnet-2"]}
EOF

Ansible proizvodi izlaze pomoću ansible.builtin.set_stats kroz ugrađeni callback plugin; izlazi za Terraform, OpenTofu i Terragrunt se automatski preuzimaju iz output -json (sensitive vrednosti se preskaču i prikazuju kao Nije preuzeto). Izlazi se čitaju samo kada zadatak uspe; ograničenja su 100 izlaza, po 32 KB, 256 KB po fajlu.

Veza koja ulazi u čvor zadatka isporučuje ulaze — puni promenljive upitnika ciljnog šablona izlazima izvornog čvora:

  • Po nazivu (podrazumevano): svaki izlaz čiji naziv odgovara nazivu promenljive upitnika je puni.
  • Eksplicitno mapiranje ulaza: navedite parove variable ← output key koje treba isporučiti; kada tok posla ima završeno pokretanje, panel predlaže ključeve koje je to pokretanje proizvelo.

Panel veze sa eksplicitnim mapiranjem ulaza

Vrednosti se pretvaraju u tip promenljive, čvorovi odobrenja i čekanja propuštaju izlaze dalje, eksplicitno mapiranje ima prednost nad isporukom po nazivu, a obavezna promenljiva ostavljena bez vrednosti obara zadatak čvora pre nego što počne, tako da pokretanje sledi svoje veze pri neuspehu. Prikaz pokretanja pokazuje oznaku N izlaza po čvoru, dijalog zadatka ima tabelu Izlazi, a log zadatka počinje jednim redom Input "x" <- output "y" of node N po isporučenoj vrednosti. Izlazi se čuvaju kao čist tekst i nikada ne pune promenljivu tipa secret; secret se ne može prenositi kroz izlaze. Zadaci na udaljenim runner-ima proizvode i primaju izlaze; Docker i Kubernetes izvršioci ih još ne preuzimaju.

Dijalog zadatka sa tabelom izlaza

Promenljive toka posla i dijalog za pokretanje

Dijalog za pokretanje koji traži promenljive toka posla

Tok posla ima sopstvene promenljive upitnika, koje se traže jednom u dijalogu Pokreni “…” pri pokretanju (tok posla bez promenljivih počinje odmah, kao i do sada). Odgovori se čuvaju na pokretanju, prikazuju se kao oznake u traci Promenljive iznad platna pokretanja i do zadatka dolaze samo kroz eksplicitno povezivanje u panelu čvora — promenljiva toka posla nikada ne ulazi u šablon po nazivu. Tajne nisu dozvoljene kao promenljive toka posla. POST …/workflows/{id}/runs prihvata {"environment": {"image_tag": "1.4.3"}}; odgovor koji ne odgovara svom tipu ili izostala obavezna vrednost odbijaju pokretanje.

Okruženje zadatka toka posla

Svaki zadatak koji pokrene tok posla prima SEMAPHORE_WORKFLOW_ID, SEMAPHORE_WORKFLOW_RUN_ID, SEMAPHORE_WORKFLOW_URL (zahteva web_host) i SEMAPHORE_OUTPUTS_FILE, za svaku aplikaciju i na udaljenim runner-ima.

Redizajnirani uređivač

Uređivač toka posla

  • Nove kartice čvorova sa pločicom vrste, statusom, trajanjem, oznakom izlaza i ugrađenim dugmadima Odobri / Odbij; oznake veza sa padajućim izborom uslova na mestu i dugmetom za brisanje; platno sa tačkastom mrežom.
  • Meni za brzo dodavanje sa + tačke spajanja čvora, desnim klikom na platno ili dugmetom u praznom stanju: lista vrsta čvorova i šablona zadataka sa pretragom, novi čvor se povezuje pri uspehu.
  • Vrati / ponovi (Ctrl/⌘+Z, Ctrl/⌘+Shift+Z), preimenovanje toka posla na mestu, meni Problemi koji fokusira problematični čvor, oznaka Sačuvaj za nesačuvane promene i zaštita pri napuštanju stranice.
  • Prečice na platnu: strelice pomeraju prikaz (Shift za veliki korak), + / - zumiraju, 0 uklapa graf, 1 resetuje zum, Esc briše izbor; kartice čvorova se mogu fokusirati tastaturom.
  • Lebdeće kontrole: uvećavanje / umanjivanje, uklapanje prikaza, automatski raspored Uredi, procenat zuma.
  • Jedna strelica skuplja paletu i glavnu navigaciju zajedno; stanje se pamti.
  • Prekomerno skrolovanje na trekpedu više ne pokreće pretraživačev pokret za nazad na macOS-u.

Meni za brzo dodavanje

Webhook-ovi pokreću tokove posla

Integracija sada može pokrenuti tok posla umesto šablona (Pokreće: šablon / tok posla u formi integracije). Svaka izvučena vrednost postaje odgovor na upitnik toka posla. Upravljanje takvim integracijama zahteva Pro funkciju workflow_integrations_management. Za integracije sa šablonima, izvučena vrednost iz Parametara zadatka sa nazivom git_branch postavlja granu pokrenutog zadatka kada šablon dozvoljava njeno predefinisanje.

Promene u API-ju

POST …/workflows/{id}/run je preimenovan u POST …/workflows/{id}/runs i prihvata telo environment. Detalji pokretanja nose revision_id, revision, objekat delay po čvoru i task.artifacts. Polja workflow_run_id, workflow_node_id i artifacts koja klijent pošalje na zadatku se ignorišu, tako da se zadatak ne može predstaviti kao čvor tuđeg pokretanja.


Uloge i kontrola pristupa

Više uloga po članu

Stranica tima sa više uloga po članu

Član projekta ima skup uloga, koji se uređuje kao oznake na stranici Tim. API prihvata roles: ["manager", "release_approver"] uz nasleđeno role; odgovor zadržava skalarno role samo za članove sa jednom ulogom. Korisnik koji nije administrator ne može poslednjem vlasniku oduzeti ugrađenu ulogu Vlasnik.

Uloge sa ID-jevima, slug-ovima i opsezima

Uloge su sada redovi u bazi sa celobrojnim id i slug (^[A-Za-z0-9_-]{1,100}$, izveden iz naziva u formi); i četiri ugrađene uloge su redovi, pa ih prilagođena uloga više ne može zakloniti. Uloge imaju opseg: ugrađene, deljene (upotrebljive u svakom projektu) ili projektne. Brisanje uloge koja je u upotrebi vraća 409 sa opisom posledica (članovi, projekti, dozvole nad šablonima, mapiranja) i može se ponoviti sa ?force=true — Obriši sa dodelama u interfejsu. Migracije v2.20.12 i v2.20.13 ponovo grade tabele uloga; vidite napomene o nadogradnji.

Globalne uloge i dozvole (Pro)

Kartica globalnih uloga na stranici korisnika

Prava na nivou instance nisu više samo administratorska oznaka. Globalna uloga dodeljuje masku od četiri dozvole — Upravljanje korisnicima, Upravljanje globalnim ulogama, Upravljanje sistemskim podešavanjima, Čitanje revizionog dnevnika — i dodeljuje se korisnicima na kartici Uloge stranice Korisnici (/users/roles) i u kartici Globalne uloge dijaloga korisnika, koja prikazuje i efektivne dozvole i to koja ih uloga dodeljuje. Svaku administratorsku rutu čuva jedan od ta četiri bita; GET /api/user vraća global_permissions. Instanca uvek zadržava najmanje jednog administratora, što se obezbeđuje zaključavanjem reda koje je sigurno i između HA čvorova. Korisnik sa dozvolom Upravljanje korisnicima ne može izmeniti administratora niti bilo koga ko ima dozvolu koju sam nema. API: /api/global-roles, /api/users/{id}/global-roles, /api/users/{id}/global-permissions, katalog na /api/global-roles/permissions.

Globalne uloge korisnika

Mapiranja grupa na uloge (Enterprise)

Stranica mapiranja grupa

Mapirajte grupu provajdera identiteta na ulogu u projektu na novoj stranici Mapiranja grupa (/role-mappings): provajder, grupa, projekat, uloga. Pri svakoj OIDC prijavi mapirane uloge korisnika se usklađuju sa grupama iz tokena (groups_claim provajdera). Mapirane uloge se na stranici Tim prikazuju kao zaključane oznake sa opisom provider: group i ne mogu se ukloniti kao uloge člana; mapirane uloge se ne računaju kao poslednji vlasnik projekta. Prijava lozinkom ili preko LDAP-a briše mapirane uloge, jer ne nosi grupe. API: /api/role_mappings.


Autentifikacija i identiteti

Stranica za prijavu sa više LDAP direktorijuma

  • Spoljni identiteti. LDAP i OIDC prijave se vezuju za Semaphore račune pomoću stabilnog ID-ja provajdera (OIDC sub, LDAP DN) u novoj tabeli user__external_identity, a ne pomoću e-pošte. Time se zatvara klasa grešaka u kojoj IdP koji prihvata svaku unetu adresu preuzme tuđi račun. external_auth_email_matching (auto podrazumevano, always, never) određuje da li se postojeći spoljni korisnik bez identiteta i dalje može jednom upariti po e-pošti; lokalni računi sa lozinkom se nikada ne preuzimaju. OIDC e-pošta se uzima u obzir samo kada je email_verified i kada provajder postavi require_verified_email. Korisnici sami povezuju i raskidaju identitete u dijalogu računa (/api/users/{id}/identities, POST /api/user/identities/ldap, /api/auth/oidc/{provider}/login?link=1).
  • Više LDAP direktorijuma. ldap_providers je mapa imenovanih direktorijuma, svaki sa sopstvenim serverom, povezivanjem, pretragom, mapiranjima, bojom i redosledom; nasleđeni ravan blok ldap_* nastavlja da radi kao provajder ldap. Stranica za prijavu prikazuje prekidač kada postoji više od jedne kartice, a interna kartica nikada ne šalje lozinku direktorijumu. GET /api/auth/login vraća ldap_providers i login_with_password.
  • LDAPS sertifikati se podrazumevano proveravaju. Postavite ldap_tls_skip_verify (ravan blok) ili tls_skip_verify (po provajderu) za samopotpisani sertifikat.
  • Apsolutno trajanje sesije. auth.max_session_life_hours (SEMAPHORE_AUTH_MAX_SESSION_LIFE_HOURS) poništava sesiju fiksno vreme nakon prijave, bez obzira na aktivnost; 0 zadržava samo vremensko ograničenje neaktivnosti.
  • Korisnik bez projekata koji ne sme da ga kreira vidi stranicu Još nema projekata umesto forme koju ne može da pošalje; POST /api/projects u tom slučaju vraća 403.
  • Jezik izabran u korisničkom meniju čuva se na serveru i prati korisnika kroz različite pretraživače (lang u /api/user/options).

Konfiguracija hostova

Stranica konfiguracije hostova

Nova stranica projekta, Konfiguracija hostova, mapira SSH hostove i Git URL adrese na akreditive projekta:

  • mapiranje tipa Host (bastion.example.com) prilaže SSH ključ, u obliku Host bloka generisanog ssh_config fajla;
  • mapiranje tipa URL (https://github.com/acme/, prefiks koji se završava sa / pokriva celu grupu) prilaže SSH ključ ili korisničko ime/lozinku (samo HTTPS), u obliku Git insteadOf prepisivanja; najspecifičnija URL adresa ima prednost.
Forma mapiranja hosta

Mapiranja se primenjuju na repozitorijum šablona i njegove podmodule, uloge i kolekcije iz requirements.yml, module za terraform init, git komande koje pokreće playbook, repozitorijume inventara i hostove iz inventara, kao i na pregledanje grana i playbook-ova; isporučuju se udaljenim runner-ima. Privatni ključevi nikada ne dolaze na disk — po jedan SSH agent za svako mapiranje, vezan pomoću IdentityAgent; lozinke se prenose kroz GIT_CONFIG_PARAMETERS, a URL adrese repozitorijuma se prikrivaju u logovima zadataka. Ključ na koji se mapiranje poziva ne može se obrisati. Mapiranja su deo rezervnih kopija projekta. Zahteva git_client: cmd_git. Tabela project__host_config, migracija v2.20.7; API /api/project/{id}/host_configs.


Šabloni i zadaci

Forma šablona sa radnim direktorijumom i opcijama obaveštenja

  • Ansible radni direktorijum. Opcija Drugi radni direktorijum pokreće ansible-playbook iz poddirektorijuma repozitorijuma; putanja mora ostati unutar radne kopije (working_directory, migracija v2.20.3).

  • Jedinstveni nazivi šablona po projektu (migracija v2.20.4), a POST /api/project/{id}/tasks prihvata template_name umesto template_id.

  • Potiskivanje obaveštenja o greškama po šablonu, uz postojeće potiskivanje obaveštenja o uspehu; obaveštenja e-poštom prvi put poštuju oba (suppress_error_alerts, migracija v2.20.5).

  • Skrivanje Dry Run / Diff opcija iz dijaloga zadatka po šablonu; server za taj šablon takođe prestaje da dodaje --check / --diff (task_params.hide_dry_run, hide_diff).

  • Opcije Galaxy instalacije — sekcija koja se skuplja, sa opcijom Preskoči Galaxy instalaciju, odvojenim CLI argumentima za ansible-galaxy role install i collection install (lista dozvoljenih zastavica; --token, --api-key i zastavice sa putanjama se odbijaju) i upitom za predefinisanje po zadatku.

  • Birač playbook-ova prikazuje poddirektorijume dok kucate, filtrirano po aplikaciji (.yml za Ansible, direktorijumi najvišeg nivoa za Terraform / OpenTofu / Terragrunt / Pulumi, .sh, .py, .ps1), preskače Ansible strukturne direktorijume i direktorijume sa tačkom, ograničen je na 30 unosa i pregleda plitki klon ograničen na korenski direktorijum repozitorijuma.

  • Promenljive upitnika sa višestrukim izborom — novi tip select prihvata više vrednosti, prikazanih kao oznake u dijalogu zadatka; default_value može biti niz.

    Dijalog novog zadatka sa promenljivom upitnika sa višestrukim izborom
  • Tajne iz upitnika dolaze do udaljenih runner-a. Odgovor tipa secret ranije je na runner dolazio prazan. Sada se čuva šifrovan kao pristupni ključ vezan za zadatak (access_key.task_id, expire_at, migracija v2.20.1), dešifruje ga onaj HA čvor koji opslužuje runner-a, briše se po završetku zadatka i čisti na svakih sat vremena; skriven je iz skladišta ključeva, rezervnih kopija i API-ja za ključeve.

  • Dodatne promenljive u YAML formatu. Uređivač grupa promenljivih dobio je prekidač Tabela | JSON | YAML i uređivač preko celog ekrana; konverzije su stroge (datumi ostaju stringovi, korenske vrednosti koje nisu objekti i nekonačni brojevi se odbijaju). Način čuvanja je nepromenjen.

    Uređivač grupe promenljivih u YAML režimu

  • Stranica zadatka imenuje i povezuje raspored ili integraciju koja je pokrenula zadatak, a obrisano poreklo označava kao #id (deleted). Vremenske oznake u logu se više ne označavaju pri kopiranju loga.

  • Rasporedi validiraju izraz na serveru pre čuvanja, pa je @hourly prihvaćen, a baner sa vremenskom zonom se može zatvoriti.

    Forma rasporeda
  • Zaustavljanje lokalnog zadatka prekida celu njegovu grupu procesa: SIGTERM, 15 s perioda mirovanja, zatim SIGKILL; napušteni ssh ili procesi provajdera više ne nadživljavaju zadatak. Zaustavljen Terraform plan se više ne nastavlja; plan koji na SIGTERM izađe sa 0 ne tumači se kao uspeh.

  • repository_id inventara se zadržava samo za tip file i mora pripadati projektu.

  • Logovi servera imenuju korisnika u unosima Zadatak dodat u red / Zadatak pokrenut.


Tajne i Ansible Vault

  • Dodatne promenljive se prenose u fajlovima, a ne u komandnoj liniji. Grupe promenljivih, odgovori iz upitnika, ulazi toka posla i detalji zadatka upisuju se u YAML fajl sa pravima 0600 koji se prosleđuje kao --extra-vars @file. Tajne — odgovori upitnika tipa secret i tajne iz grupa promenljivih — idu u drugi fajl šifrovan u formatu Ansible Vault 1.1 / AES‑256 pomoću izvorne Go implementacije (nije potreban ansible-vault program), a otključava se jednokratnom lozinkom unetom na --vault-id <uuid>@prompt komande ansible-playbook. Ni vrednosti ni lozinka se ne pojavljuju u ps, a oba fajla se brišu po završetku zadatka.

  • Jinja2 u vrednostima je podatak, a ne kod. Svaki string koji sadrži {{, {%, {# ili #jinja2: zaglavlje označava se sa !unsafe, rekurzivno, tako da se odgovor iz upitnika kao {{ lookup('pipe', 'id') }} prosleđuje doslovno. Stringovi bez razdvajača namerno ostaju neoznačeni: ansible‑core ≥ 2.19 ponovo razrešava !unsafe skalare, što bi "2026.08" pretvorilo u broj sa pokretnom zapetom.

  • Novi debag prostor imena extra_vars (SEMAPHORE_DEBUG_FILTER=extra_vars) beleži kako se promenljive razdvajaju i upisuju — samo nazive, fajlove i veličine, nikada vrednosti.

  • Generisanje SSH para ključeva na serveru. Opcija Generiši SSH ključ u skladištu ključeva kreira RSA ključ; javni ključ se čuva zajedno sa ključem, prikazuje se pomoću Prikaži / Sakrij i dugmeta za kopiranje, i nudi se u dijalogu odmah nakon kreiranja (generate_ssh_key).

    Ključ sa generisanim SSH parom ključeva
  • Ažuriranje ključa upisuje type, secret i javni deo samo kada je postavljena opcija Predefiniši, tako da klijent ne može izmeniti sadržaj ključa bez zamene tajne.

  • Čitanje akreditiva iz promenljive okruženja servera ili fajla unutar dirs.secrets je sada dokumentovano (kartice Env / File u formi skladišta ključeva).


Repozitorijumi i Git

Forma repozitorijuma sa opcijom jedne radne kopije
  • Monorepo: jedna radna kopija za sve šablone. Opcija repozitorijuma klonira repozitorijum jednom i deli ga između šablona umesto kopije po šablonu; radna kopija se zaključava za fetch i pull, a zadaci se zatim izvršavaju paralelno. Šabloni takvog repozitorijuma ne mogu imati sopstvenu granu, a njihovi zadaci ne mogu predefinisati granu ni komit (monorepo, migracija v2.20.11).
  • Ponovni pokušaji Git operacija. clone i pull se ponavljaju sa eksponencijalnim zastojem ograničenim na jedan minut; git_attempts (SEMAPHORE_GIT_ATTEMPTS, podrazumevano 4).
  • Paralelni podmoduli. git_submodule_jobs (SEMAPHORE_GIT_SUBMODULE_JOBS, podrazumevano 4) se prosleđuje kao --jobs.
  • Provera SSH ključeva hostova. Nova ssh sekcija: config_path, known_hosts_file (SEMAPHORE_SSH_KNOWN_HOSTS_FILE) i strict_host_key_checking — no (podrazumevano), yes ili accept-new — primenjeno na Git preko SSH-a.
  • Pregledanje repozitorijuma koristi plitki klon po grani; akreditivi se procentualno kodiraju za kloniranje direktno na mašini i prikrivaju u logovima i listi događaja.

Runner-i i integracije

  • runner.check_interval_seconds (SEMAPHORE_RUNNER_CHECK_INTERVAL_SECONDS, podrazumevano 5) određuje koliko često runner proverava server; prekidač Napredne opcije na stranici Runner-i ga uvrštava u generisane isečke za promenljive okruženja, konfiguraciju i Docker (isporučeno u v2.19.17).

  • runner.connection.timeout_seconds (SEMAPHORE_RUNNER_CONNECTION_TIMEOUT_SECONDS, podrazumevano 3) odvojeno ograničava povezivanje, TLS rukovanje i zaglavlja odgovora; otpremanje logova se ne prekida.

  • runners.default_global_runners_mode (SEMAPHORE_DEFAULT_GLOBAL_RUNNERS_MODE: disable, prefer, require) zamenjuje zastarelo use_remote_runner; runners.registration_token zamenjuje runner_registration_token na najvišem nivou.

  • Dijagnostika runner-a na strani servera pod SEMAPHORE_DEBUG_FILTER=runner: razlozi odbijanja tokena, detekcija ponovnog pokretanja i prisutnosti, odbijeni izveštaji o napretku, praćenje dodeljivanja zadataka.

  • unregister zahtevi runner-a se autentifikuju; klijent runner-a odbija HTTP preusmerenja.

  • HMAC‑SHA512 autentifikacija webhook-ova (hmac-sha512) uz postojeći HMAC‑SHA256; zaglavlje potpisa je konfigurabilno.

    Forma integracije sa HMAC-SHA512
  • Webhook čija integracija pripada drugom projektu se odbija.


Nadgledanje

  • Prometheus metrike. GET /api/metrics iza HTTP Basic autentifikacije sa statičkim servisnim akreditivom:

    "metrics": { "enabled": true, "username": "prometheus", "password": "…" }
    

    (SEMAPHORE_METRICS_ENABLED, SEMAPHORE_METRICS_USERNAME, SEMAPHORE_METRICS_PASSWORD.) Serije: semaphore_tasks_running, semaphore_tasks_total{status}, standardni go_* i process_* kolektori, i merači izvoza revizionog dnevnika u Pro izdanju.

  • Novi debag prostori imena extra_vars i runner; pregledanje repozitorijuma beleži Git izlaz na nivou DEBUG.

  • Izvoz i obnova rezervnih kopija projekta se beleže.


Bezbednost

  • Povezivanje identiteta po ID-ju provajdera umesto po e-pošti; provera LDAPS sertifikata je podrazumevano uključena.
  • Dodatne promenljive izvan komandne linije; tajne šifrovane Vault-om; Jinja2 u vrednostima se ne izvršava.
  • Falsifikovani workflow_run_id, workflow_node_id i artifacts se uklanjaju iz zadataka koje pošalje klijent.
  • Administratorske rute čuvaju eksplicitne globalne dozvole umesto administratorske oznake; nepoznati bitovi dozvola se odbijaju; zaštita od eskalacije privilegija pri upravljanju korisnicima.
  • Birač playbook-ova je ograničen na korenski direktorijum repozitorijuma (OpenRoot), sa ograničenim brojem unosa i filtriranjem.
  • Korenske vrednosti dodatnih promenljivih i YAML brojevi se validiraju; Galaxy CLI argumenti su na listi dozvoljenih.
  • Akreditivi repozitorijuma se prikrivaju u logovima i listi događaja; znak = se escape-uje u Git konfiguracionim parametrima.
  • Krajnje tačke revizionog dnevnika odbijaju čitanja sa drugih sajtova i neispravne kursore; mreže pouzdanih proksija se validiraju.
  • unregister runner-a se autentifikuje; klijent runner-a odbija preusmerenja.
  • ID-jevi projekta i integracije za webhook se proveravaju.
  • Lokalni zadaci se zaustavljaju zajedno sa celom grupom procesa.

Napomene o nadogradnji

Prekidne promene i promene ponašanja

  1. Nazivi šablona moraju biti jedinstveni po projektu. Migracija v2.20.4 dodaje jedinstveni indeks; preimenujte duplikate pre nadogradnje.
  2. Tabele uloga se ponovo grade (v2.20.12 / v2.20.13). Prvo napravite rezervnu kopiju. Prilagođena uloga čiji se slug, bez obzira na velika i mala slova, sudara sa ugrađenom ili drugom ulogom biva preimenovana (uz zapis u logu); dozvole nad šablonima koje pokazuju na nerazrešivu ulogu se odbacuju (uz zapis u logu). Članstvo je premešteno u project__user_role; kolona project__user.role je uklonjena.
  3. GET /api/project/{id}/users vraća role samo za članove sa jednom ulogom — čitajte roles.
  4. /roles* je premešten sa administratorske oznake na dozvolu Upravljanje globalnim ulogama; administratori nisu pogođeni.
  5. LDAPS sertifikati se podrazumevano proveravaju. Postavite ldap_tls_skip_verify ili tls_skip_verify provajdera za samopotpisane sertifikate.
  6. ansible-playbook se poziva drugačije: --extra-vars @file, uz drugi fajl i --vault-id <uuid>@prompt kada zadatak ima tajne, čak i za šablone bez vault-a. Pogođeno je sve što parsira komandnu liniju, kao i ansible.cfg koji zabranjuje vault upite.
  7. Jinja2 unutar vrednosti dodatnih promenljivih se više ne izvršava. Playbook koji se oslanjao na šablonizovanje vrednosti iz webhook-a ili upitnika to više neće raditi.
  8. Krajnja tačka za pokretanje toka posla je preimenovana: POST …/workflows/{id}/run → …/runs.
  9. Monorepo repozitorijumi imaju prednost nad šablonom: nema grane po šablonu, nema predefinisanja grane ni komita u zadacima.
  10. repository_id inventara se odbacuje za sve tipove osim file.
  11. Zaustavljanje lokalnog zadatka prekida njegovu grupu procesa (na Windows-u još nema ekvivalenta).
  12. Docker i Kubernetes izvršioci još ne preuzimaju izlaze toka posla; tajne iz upitnika još ne dolaze do tih izvršilaca.

Nova konfiguracija

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 i require_verified_email po OIDC provajderu, runner.check_interval_seconds, runner.connection.timeout_seconds, runners.{default_global_runners_mode,registration_token}. Sve stavke su opcione. Konfiguraciona polja tipa pokazivača sada se mogu postaviti iz promenljivih okruženja. Referentne stranice za konfiguraciju i CLI generišu se iz izvornog koda.

Migracije baze podataka

v2.20.0 spoljni identiteti · v2.20.1 tajne iz upitnika vezane za zadatak · v2.20.2 čvorovi čekanja · v2.20.3 radni direktorijum · v2.20.4 jedinstveni nazivi šablona · v2.20.5 potiskivanje obaveštenja o greškama · v2.20.7 konfiguracija hostova · v2.20.8 revizije tokova posla · v2.20.9–v2.20.11 revizioni dnevnik i indeksi, mapiranja ulaza na vezama, monorepo oznaka · v2.20.12–v2.20.13 tabele uloga, promenljive tokova posla · v2.20.14 integracije tokova posla i mapiranja grupa · v2.20.16 globalne uloge.

Zavisnosti

Go 1.26; Docker slike na Alpine 3.24; dodat prometheus/client_golang 1.23; go-oidc 3.21, go-ldap 3.4.14, golang.org/x/crypto 0.57, modernc.org/sqlite 1.59, logrus 1.10; na frontendu js-yaml 5 i cron-parser 5.10. Nova postavljanja jednim klikom: Cloudzy, RepoCloud i Pethost.