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​