Pokretanje toka posla na čekanju odobrenja

Semaphore UI 2.19 je najveće izdanje u liniji 2.x. Donosi Tokove posla (Workflows) sa grafičkim uređivačem, omogućava runner-ima da izvršavaju zadatke u Docker kontejnerima i Kubernetes pod-ovima, omogućava Semaphore-u da izdaje kratkotrajne JWT identifikacione tokene zadacima koji se izvršavaju, dodaje rotaciju ključeva za šifrovanje, trajno rešava pouzdanost runner-a i donosi dugu listu bezbednosnih unapređenja.

Ova linija obuhvata verzije od v2.19.0 do v2.19.14. Zakrpe su navedene na kraju.

Istaknuto

  • Tokovi posla (Beta) — povežite šablone zadataka u pajplajn sa kapijama za odobrenje, nacrtane u grafičkom uređivaču i praćene uživo na istom platnu.
  • Docker i Kubernetes izvršioci — runner-i mogu izvršavati svaki zadatak u svežem kontejneru ili pod-u (Pro / Enterprise).
  • JWT identifikacioni tokeni za zadatke — autentifikacija bez statičkih ključeva iz playbook-ova ka Vault-u, AWS-u, GCP-u, Azure-u i svemu drugom što prihvata OIDC tokene.
  • Rotacija ključeva za šifrovanje — označeni privezak ključeva (keyring) sa vrućim ponovnim učitavanjem i komandom vaults check.
  • Promenljive upitnika kao promenljive okruženja, uz int, text i redizajnirane enum tipove.
  • Prava paginacija istorije zadataka na strani servera — projekti sa milionima zadataka ostaju brzi.
  • Pouzdanost runner-a — onlajn/oflajn status, jednokratni hešovani registracioni tokeni i automatski oporavak zadataka zaglavljenih na prekinutom runner-u.
  • Selektivno debagovanje u logovima pomoću SEMAPHORE_DEBUG_FILTER.
  • Bezbednosno učvršćivanje: provera trenutne lozinke, CSRF provera porekla, bezbedni kolačići, stroža validacija unosa kroz ceo API.
  • BoltDB uklonjen — podržani su isključivo SQLite, MySQL i PostgreSQL.

Tokovi posla (Beta)

Tok posla (Workflow) je graf šablona zadataka koji se izvršava kao celina. Svaki čvor je ili zadatak (pokreće šablon), odobrenje (pauzira izvršavanje dok korisnik ne odobri ili odbije), ili beleška (slobodna anotacija koja se nikada ne izvršava). Veze nose uslov: pri uspehu, pri neuspehu ili uvek.

Tokovi posla se pojavljuju kao nova stavka Workflows u bočnoj traci projekta, označena sa oznakom Beta. Dostupni su u Pro izdanju; tokom beta faze omogućeni su nezavisno od plana pretplate.

Grafički uređivač

Uređivač toka posla

Uređivač je platno preko celog ekrana izgrađeno na Drawflow biblioteci:

  • prevucite čvorove iz palete, povežite ih povlačenjem sa tačke spajanja čvora;
  • kliknite na vezu da promenite njen uslov; veze su označene bojama, a legenda se nalazi u uglu;
  • kliknite na čvor da biste izmenili njegova svojstva u bočnom panelu: šablon, režim konvergencije (svi roditelji / bilo koji roditelj), vreme čekanja i poruku za odobrenje, tekst beleške;
  • petlje i ciklične veze se automatski odbijaju tokom crtanja, a panel Problemi prati validaciju na strani servera tako da se neispravan graf ne može sačuvati;
  • pozicije čvorova se pamte; tokovi posla kreirani putem API-ja bez koordinata dobijaju automatski topološki raspored;
  • zumirajte pomoću trake sa alatkama ili Ctrl + točkić miša, prevucite platno za navigaciju, skupite paletu radi više prostora;
  • Početna verzija postavlja verziju pokretanja (1.4.0, 1.4.1, …); verzija se prosleđuje svakom zadatku koji tok posla pokrene.

Panel svojstava čvora

Prikaz izvršavanja uživo

Prikaz izvršavanja ponovo koristi isto platno. Svaki čvor prikazuje status svog zadatka, aktivni čvor je istaknut, a odobrenja na čekanju prikazuju dugmad Odobri / Odbij direktno na platnu. Dugme Zaustavi prinudno zaustavlja svaki zadatak u toku, odbija odobrenja na čekanju i označava pokretanje kao stopped.

Prikaz izvršavanja u tamnoj temi

Statusi pokretanja su running, approval, success, failed i stopped. Napredovanje toka posla vodi server: kada se bilo koji zadatak toka završi, planiraju se sledeći čvorovi, tako da šablon bez podređenih automatskih koraka više ne blokira celo izvršavanje.

Lista tokova posla

Parametri zadataka po čvoru

Svaki čvor zadatka može predefinisati parametre koje prosleđuje svom šablonu (promenljive, inventar, grana, argumenti, verzija, poruka), na isti način kao i ručno pokretanje.

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}

Poznata ograničenja beta verzije: trenutno nema minimape, operacija vrati/ponovi (undo/redo) niti višestrukog izbora; artefakti toka posla (vrednosti set_stats) još uvek se ne prenose između zadataka koji se izvršavaju na udaljenim runner-ima.


Docker i Kubernetes izvršioci (Pro / Enterprise)

Runner-i mogu izvršavati svaki zadatak u izolovanom okruženju umesto direktno na host mašini runner-a. Izvršilac se bira jednom po procesu runner-a pomoću opcije runner.executor.type (local, docker, k8s).

Docker (runner.executor.docker, Pro):

Opcija Promenljiva okruženja Podrazumevano
host SEMAPHORE_RUNNER_DOCKER_HOST lokalni 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):

Opcija Promenljiva okruženja Podrazumevano
kubeconfig SEMAPHORE_RUNNER_K8S_KUBECONFIG u klasteru
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

CI objavljuje dve nove slike: semaphoreui/job (Ansible, Terraform, OpenTofu, Terragrunt, paramiko) i semaphoreui/helper. Šablon može promeniti sliku za sopstvene zadatke pomoću novog polja Executor image u formi šablona (prikazuje se sa oznakom Upgrade to PRO kada funkcija izvršioca nije licencirana).

Konekcija runner-a je takođe dobila runner.connection.server_ca_cert_file i runner.connection.skip_tls_verify.


JWT identifikacioni tokeni za zadatke

Semaphore može da deluje kao provajder identiteta u OIDC stilu za zadatke koji se izvršavaju, tako da playbook može da se autentifikuje na Vault, cloud STS tačke ili interne servise bez dugotrajnih statičkih akreditiva.

Forma šablona: Napredne opcije sa JWT

  • Omogućite po šablonu pomoću Issue JWT to task runner; postavite jednu ili više ciljnih grupa (audiences) i TTL (ograničeno pomoću jwt.max_ttl).
  • Zadatak prima token u promenljivoj okruženja SEMAPHORE_JWT.
  • Tokeni su potpisani ES256 algoritmom (ECDSA P‑256) i sadrže samo identifikatore: task_id, project_id, template_id, user_id uz standardne tvrdnje iss, sub, aud, exp, nbf, iat, jti.
  • Javni ključevi se objavljuju na GET /.well-known/jwks.json.

Konfiguracija servera:

"jwt": {
  "enabled": true,
  "issuer": "https://semaphore.example.com",
  "default_ttl": "1h",
  "max_ttl": "24h"
}

Promenljive okruženja: SEMAPHORE_JWT_ENABLED, SEMAPHORE_JWT_ISSUER, SEMAPHORE_JWT_DEFAULT_TTL, SEMAPHORE_JWT_MAX_TTL.


Promenljive upitnika

Isporuka promenljive kao promenljive okruženja

Promenljiva upitnika sada ima postavku Prosledi promenljivu kao: specifičan CLI način za aplikaciju (--extra-vars za Ansible, -var za Terraform/OpenTofu, CLI argument za shell skripte) ili promenljiva okruženja procesa. Naziv promenljive se koristi doslovno, tako da je korisnik Terraform-a jednostavno nazove TF_VAR_region. Promenljive okruženja se ne prikazuju u listama procesa, što ovo čini bezbednijim izborom za tajne podatke.

Promenljiva upitnika isporučena kao promenljiva okruženja

Novi tipovi

  • int — numerički unos sa validacijom;
  • text — tekst u više redova;
  • enum — redizajnirani uređivač sa parovima naziv/vrednost i podrazumevanom vrednošću.

Uređivač enum promenljivih upitnika

Dijalog zadatka prikazuje svaki tip u skladu sa tim:

Dijalog novog zadatka sa tipiziranim promenljivim upitnika

Čuvaju se u postojećem survey_vars JSON formatu — migracija nije potrebna.


Šabloni i zadaci

  • Dinamički birač playbook-ova. Polje Putanja do fajla playbook-a prikazuje playbook-ove pronađene u repozitorijumu (GET /api/project/{id}/repositories/{repository_id}/playbooks). Lista prati izabranu granu i vraća se na slobodan tekst ukoliko repozitorijum ne može da se pročita.

  • Preskakanje instalacije Ansible Galaxy-ja — opcija po šablonu, opciono predefinisana po zadatku, za preskakanje instalacije uloga i kolekcija iz requirements.yml.

  • Tipizirane promenljive u grupama promenljivih, uključujući brojeve:

    Grupa promenljivih sa tipiziranim promenljivim

  • Paginacija istorije zadataka. Stranica Istorija je ranije preuzimala 200 najnovijih zadataka i vršila paginaciju na klijentu, pa je sve starije bilo nedostupno. Bekend sada vraća jednu po jednu stranicu koristeći keyset kursor (?count=20&before=<task_id>, zaglavlje odgovora X-Has-Next) bez COUNT(*) i bez OFFSET. Podnožje nudi opcije Redova po stranici i kontrole za prethodnu/sledeću stranicu. Ista paginacija važi i za listu zadataka po šablonu i kontrolnu tablu.

    Istorija sa paginacijom na strani servera

  • Liste zadataka se osvežavaju najviše jednom u 5 sekundi; uklonjeno je nekoliko suvišnih zahteva.

  • Rasporedi se validiraju pomoću cron parsera na strani servera, tako da klijent i server više nemaju neslaganja.

  • Promena grane u zadatku se prihvata samo kada šablon to dozvoljava.

  • Git operacije su serijalizovane po direktorijumu repozitorijuma. Šabloni sa uključenom opcijom Dozvoli paralelne zadatke dele jednu radnu kopiju, a konkurentni git pull / git checkout mogli su da je oštete. Ažuriranje i checkout sada čine jedinstvenu kritičnu sekciju, kako za lokalno izvršavanje tako i za runner-e, uključujući repozitorijume inventara.


Runner-i

Stranica runner-a sa statusom onlajn/oflajn

  • Onlajn / oflajn status na stranici Runner-a, određen na osnovu liveness signala (heartbeat).

  • Jednokratni registracioni tokeni. Runner se prvo može kreirati u interfejsu i registrovati kasnije pomoću smrs_… tokena koji se prikazuje samo jednom, čuva se isključivo kao SHA‑256 heš i ističe nakon jednog sata. Dijalog prikazuje spremne komande za promenljive okruženja, konfiguracioni fajl i Docker. Ponovno generisanje tokena resetuje već registrovanog runner-a kako bi se mogao ponovo registrovati.

    Dijalog registracionog tokena runner-a

    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
    
  • Oporavak zaglavljenih zadataka. Runner-i šalju vreme pokretanja svog procesa (X-Runner-Started-At). Runner koji prestane da se javlja označava se kao offline nakon runners.offline_timeout_sec (120 s): više ne prima nove zadatke, a njegovi zadaci sa statusom starting se preraspoređuju. Nakon runners.task_fail_timeout_sec (420 s) njegovi zadaci sa statusom running dobijaju status neuspeha uz jasnu poruku. Runner koji se ponovo pokrenuo i izgubio svoj skup poslova u memoriji detektuje se odmah. Usklađivanje se pokreće svakih runners.reconcile_interval_sec (30 s).

  • Zadaci preraspoređeni sa runner-a se prekidaju na starom runner-u.

  • Uklonjen je zastareli mehanizam prelaska na neaktivnog runner-a: kada su svi runner-i oflajn, zadaci čekaju u redu umesto da budu dodeljeni runner-u koji se nije javio i do 30 minuta.

  • Uklonjeni RSA ključevi za šifrovanje po runner-u. Saobraćaj između runner-a i servera se oslanja na TLS; time se uklanja korak razmene ključeva iz registracije i setup komande.

  • Ispravljeno curenje TCP konekcija u klijentu runner-a; nevažeći registracioni tokeni vraćaju 400.


Tajne i šifrovanje

  • Rotacija ključeva za šifrovanje. Novi blok encryption opisuje označeni privezak ključeva: inline keys (vrednost ili fajl), ili keys_folder gde je svaki fajl ključ nazvan po svom imenu, plus active pokazivači za tajni ključ i ključ za opcije. Šifrovani tekst sada nosi ID ključa, tako da se ključevi mogu rotirati bez potpunog ponovnog šifrovanja. encryption.keys_file sa keys_poll_interval (podrazumevano 15s) vruće ponovo učitava privezak ključeva. Novi CLI: semaphore vaults check; komanda semaphore vaults rekey je ponovo napisana oko priveska ključeva. Nasleđeni ravan access_key_encryption i dalje funkcioniše.
  • option_encryption — poseban ključ za opcije sačuvane u bazi podataka.
  • OpenBao tip skladišta tajni (rutiran kroz Vault provajder) sa sopstvenom ikonom.
  • AWS Secrets Manager bez statičkih akreditiva — polje za potvrdu Use IAM role.
  • Opcija za preskakanje TLS verifikacije (TLS-skip-verify) za Vault/OpenBao skladišta.
  • Sinhronizovana polja tajni i polja samo za čitanje se više ne brišu prilikom ažuriranja.

Nadgledanje

  • Namespaced debagovanje u logovima. --debug-filter / SEMAPHORE_DEBUG_FILTER bira koji podsistemi emituju debag izlaz, u Node.js debug stilu: runner, runner,task_pool, task_*, *, *,-db. Dostupni prostori imena: runner, task_pool, task_runner, task_logger, git, terraform, session, ldap, schedule, db, ha. Filter se primenjuje samo kada je nivo logovanja DEBUG; nikada ne podiže nivo samostalno. Syslog kuke poštuju isti filter.
  • Mnogo novih kontekstualnih debag poruka kroz runner-e, zadatke i autentifikaciju; izabrani radni prostor se ispisuje pri pokretanju.

Bezbednost

Promena lozinke zahteva trenutnu lozinku

  • Promena lozinke sada zahteva unos trenutne lozinke (CWE‑620).
  • Provera Origin / Referer zaglavlja na zahtevima koji menjaju stanje (CSRF zaštita).
  • Kolačići sesije su označeni sa Secure kada se servira preko HTTPS-a.
  • Registracioni tokeni runner-a se čuvaju hešovani i ističu; uklonjeni su ključevi za šifrovanje po runner-u.
  • Kreiranje prilagođenih uloga proverava dozvole pozivaoca (popravka eskalacije privilegija).
  • Validacija Git URL adresa; --end-of-options se prosleđuje git-u tako da pripremljena referenca ne može biti pročitana kao zastavica; heševi komita se proveravaju po formatu; grane se validiraju pre pregledanja repozitorijuma; putanje playbook-ova se validiraju.
  • Validacija sadržaja pristupnih ključeva i polja app u šablonima.
  • JWT tvrdnje nose samo ID-jeve — nikakva imena ili e-pošta ne cure u spoljne sisteme.
  • Tokeni runner-a se više ne upisuju u rezervne kopije projekata.
  • API vraća grešku odmah nakon greške pri pisanju umesto da nastavi sa delimično upisanim odgovorom.
  • Bezbednosni SLA objavljen u SECURITY.md; artefakti izdanja su potpisani [email protected] GPG ključem.

Korisnički interfejs i lokalizacija

Birač jezika sa češkim jezikom

  • Češki prevod.
  • Padajuće kartice za JWT i sekcije rasporeda u formi šablona.
  • Ikona za kopiranje u privremenu memoriju (clipboard) vidljiva je u svetloj temi; popravljeni indikatori pokrenutih zadataka; popravljen unutrašnji razmak u formi šablona; oznaka Beta za tokove posla.
  • Ekstrakcija integracionih promenljivih čuva JSON objekte i nizove umesto da ih pretvara u stringove.

Napomene o nadogradnji

Prekidne promene i promene ponašanja

  1. BoltDB je uklonjen. bolt više nije podržan dijalekt; server odbija da se pokrene sa porukom “Bolt is not supported starting from version 2.19”. Prvo migrirajte na SQLite, MySQL ili PostgreSQL.
  2. Uklonjeni ključevi za šifrovanje runner-a. Server i runner-i moraju biti na verziji 2.19. Uverite se da je saobraćaj između runner-a i servera zaštićen TLS-om. Skriptovano postavljanje runner-a koje je očekivalo ključ mora biti ažurirano.
  3. API-ji lista zadataka su paginirani. GET /api/project/{id}/tasks/last prima parametre count i before; limit se i dalje prihvata, ali klijenti koji su se oslanjali na 200 najnovijih zadataka u jednom odgovoru moraju koristiti paginaciju.
  4. Nema mehanizma dodeljivanja neaktivnom runner-u. Kada su svi runner-i oflajn, zadaci ostaju u redu čekanja.
  5. Uklonjena oznaka active za runner-e iz registracije.
  6. Rezervne kopije projekata više ne sadrže tokene runner-a.
  7. SQLite: v2.19.14 ponovo gradi tabele session i task kako bi dodao ispravne spoljne ključeve (rešava brisanje korisnika). Napuštene sesije se uklanjaju. Napravite rezervnu kopiju baze podataka pre nadogradnje.

Nova konfiguracija

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. Sve stavke su opcione; postojeće konfiguracije nastavljaju da funkcionišu. Dokumenti config.schema.yaml i referentna dokumentacija konfiguracije su ponovo generisani.

Migracije baze podataka

v2.18.6 (šablon jwt_params), v2.18.15 (tabele tokova posla), 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 obnova tabela session/task). Ispravljena kompatibilnost migracije za MariaDB 12.1.


Zakrpe

Verzija Promene
2.19.8 Ispravljena SQLite migracija; popravljeno brisanje korisnika (session/task spoljni ključevi); poređenje stringova neosetljivo na velika/mala slova u upitima baze
2.19.9 SEMAPHORE_RUNNER_EXECUTOR_TYPE promenljiva okruženja; čišćenje omitempty u konfiguraciji
2.19.10 Popravka konfiguracije izvršioca; popravka Docker build opcije
2.19.11 Izabrani radni prostor se ispisuje u logovima; oznaka latest za pomoćnu sliku; testovi migracije baze
2.19.12 Ispravljen nil pokazivač u opcijama konfiguracije runner-a; popravka propagacije grešaka
2.19.14 Ispravljeno rukovanje nasleđenim secrets_path u konfiguraciji

Zavisnosti

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. Dokumentacija dodata kao git podmodul; THIRD-PARTY-LICENSES.md ponovo generisan.