Pređi na glavni sadržaj

Arhitektura

Semaphore instalacija ima tri obavezna dela: jedan serverski proces, jednu bazu podataka i mesto na kom se zadaci izvršavaju. Sve ostalo — runner-i, Redis, obrnuti proksi, provajder identiteta — opciono je i dodaje se kada se pojavi konkretna potreba.

Delovi

Server

Jedna Go binarna datoteka. U sebi sadrži kompajlirani veb interfejs, pa jedan proces opslužuje korisnički interfejs, REST API i WebSocket endpoint na /api/ws koji izlaz zadatka prenosi otvorenim pregledačima. Podrazumevano sluša na portu 3000.

Unutar tog procesa istovremeno radi više stvari:

DeoOdgovornost
HTTP API i korisnički interfejsSve što pozivaju pregledač i API klijenti.
Skup zadataka (task pool)Red zadataka, njihova ograničenja konkurentnosti i njihovo stanje.
Planer (scheduler)Pokreće šablone po njihovim cron rasporedima.
Lokalni izvršilacPokreće zadatke na samom serveru kada njima ne upravlja udaljeni runner.
NotifikatorŠalje obaveštenja kada se zadaci završe.

Baza podataka

SQLite, MySQL ili PostgreSQL, odabrani opcijom dialect. Čuva projekte, šablone, inventare, rasporede, korisnike, uloge, istoriju zadataka i šifrovani sadržaj Skladišta ključeva. To je jedina stvar koja mora da se rezervno kopira: sve ostalo može ponovo da se izgradi.

SQLite je podrazumevani izbor i pogodan je za jedan server. Koristite PostgreSQL ili MySQL kada se više ljudi oslanja na servis, i uvek kada pokrećete više od jednog čvora.

Keš datoteka

Direktorijum u tmp_path (podrazumevano /tmp/semaphore) sadrži klonirane repozitorijume i radni direktorijum svakog pokretanja. To je keš, a ne skladište: njegovo brisanje košta jedno dodatno kloniranje po projektu. Clear cache u podešavanjima projekta radi upravo to.

Ovaj keš čuva mašina koja izvršava zadatak — server kada se zadaci izvršavaju lokalno, a svaki runner kada nije tako.

Gde se zadaci izvršavaju

Podrazumevano server sam izvršava zadatke, u sopstvenom sistemu datoteka i sa sopstvenim mrežnim pristupom. To je najjednostavnija postavka i prava je za mali tim koji upravlja hostovima do kojih server već može da dopre.

Dodavanje runner-a razdvaja to dvoje. Runner je ista binarna datoteka pokrenuta komandom semaphore runner start. Ne drži konekciju ka bazi podataka i ne otvara nijedan dolazni port: anketira server preko HTTPS-a pomoću bearer tokena, prima posao, klonira repozitorijum, pokreće alat i vraća izlaz nazad u toku. Runner-i vam omogućavaju da

  • smestite izvršavanje unutar mreže do koje server ne može da dopre,
  • držite kredencijale za produkciju na mašini koja ne opslužuje veb interfejs,
  • raspodelite opterećenje na više mašina i
  • (u Pro izdanju) usmerite zadatak na određeni runner pomoću oznaka.

Svaki runner bira način pokretanja posla pomoću svog executor.type:

IzvršilacPosao se izvršava
localKao proces na hostu runner-a, u tmp_path.
dockerU kontejneru koji runner pokrene za taj posao, a zatim ukloni.
k8sU Pod-u koji runner kreira u vašem klasteru, a zatim ukloni.

Portovi i smerovi

Svaka konekcija je odlazna iz komponente koja je započinje, što runner-e čini upotrebljivim preko granica mreže.

OdDoSvrha
Pregledač, API klijentServer :3000Korisnički interfejs, REST API, WebSocket.
ServerBaza podatakaCelokupno trajno stanje.
Server, runnerGit remote repozitorijumiKloniranje repozitorijuma.
Server, runnerHostovi kojima se upravlja, cloud API-jiSama automatizacija.
RunnerServer :3000Anketiranje za poslove, prenos izlaza.
ServerLDAP, OIDC, SMTP, chat webhook-oviPrijava i obaveštenja.

Skaliranje

Dve ose se skaliraju nezavisno.

Više izvršavanja znači više runner-a. Server ostaje jedan proces, a zadaci se raspodeljuju na runner-e koji su povezani.

Više dostupnosti znači više servera. Nekoliko čvorova radi nad jednom PostgreSQL ili MySQL bazom podataka uz Redis za distribuirane brave, deljeno stanje reda i pub/sub, iza balansera opterećenja koji podržava WebSocket. To je visoka dostupnost, Enterprise funkcionalnost. SQLite se za nju ne može koristiti.

Šta sledi