Runner nedir?

Semaphore UI runner, kullanıcı arayüzü (UI) bulunmayan bağımsız bir Semaphore örneğidir. Ana Semaphore sunucunuza bağlanır, görevleri alır ve bunları yürütür. Runner’lar, Semaphore UI’ınızın barındırıldığı yerden tamamen bağımsız olarak herhangi bir bölgedeki veya ağdaki ayrı sunucularda barındırılabilir.

Hangi sorunu çözer?

Runner’lar olmadan tüm otomasyon görevleriniz tek bir sunucuda çalışır. Bu başlangıçta sorunsuz çalışır, ancak ekibiniz (veya ekip sayısı) büyüdükçe üç sorun ortaya çıkma eğilimindedir:

  • Yük. Tek bir sunucunun kaynakları için yarışan büyük bir görev kuyruğu her şeyi yavaşlatır.
  • Yalıtım (Isolation). Birden fazla ekip aynı yürütme ortamını paylaştığında, bozuk bir işlem hattı diğer herkesi etkileyebilir.
  • Coğrafya. Ansible, sunucularınıza SSH üzerinden bağlanır. Altyapınız Sidney’deyse ancak Semaphore örneğiniz Frankfurt’taysa, her dağıtım bir transatlantik bağlantı üzerinden sürünerek ilerler. Runner’lar bu üç sorunu da çözer.

Global runner’lar ve Proje runner’ları

Semaphore iki tür runner sunar ve Pro planını değerlendiriyorsanız aralarındaki fark önemlidir.

Özellik Global runner’lar (OSS) Proje runner’ları (Pro)
Kullanılabilirlik OSS (ücretsiz) Pro
Yük dağıtımı
Ağ yalıtımı
Etiket tabanlı yönlendirme
Proje bazlı kontrol

Global runner’lar tüm projeler arasında rastgele atanır. Yükü dağıtmak için harikadır, ancak hangi runner’ın hangi görevi alacağını kontrol edemezsiniz. Proje runner’ları, herhangi bir şablona veya envantere bir etiket eklemenize, ardından belirli görevleri belirli runner’lara yönlendirmenize olanak tanır. Yalıtımı ve coğrafi yönlendirmeyi sağlayan da budur.

Runner kullanırken karşılaşılan 3 gerçek kullanım senaryosu

  1. Birden fazla ekip, sıfır müdahale Platform ekibiniz ve ürün ekibiniz Semaphore kullanıyor. Bağımsız olarak çalışıyorlar — farklı projeler, farklı sunucular, farklı risk toleransı. Proje runner’ları ile her ekip kendi runner’ına sahip olur. Bir ekibin runner’ı çökerse, diğer ekip bunu fark etmez bile.

  2. Bölgeler arasında dağıtılmış altyapı Web siteniz bir New York veri merkezinde çalışıyor. Bir arka uç servisi ise Avustralya’da çalışıyor. Avrupa’da tek bir merkezi runner olduğunda, her dağıtım dünyanın öbür ucuna SSH ile bağlanır — bu yavaş ve gereksizdir.

    Biri New York’ta, diğeri Avustralya’da olmak üzere iki runner kurun. Envanterlerinizi buna göre etiketleyin. Artık her görev yerel olarak, aynı ağ içinde tam hızda bağlanır. Bonus olarak daha hızlı dağıtımlar ve daha küçük bir saldırı yüzeyi elde edersiniz.

  3. Webhook’lar + AWS Lambda ile bulut maliyetlerini düşürme Bunun üzerinde durmaya değer, çünkü anlamlı bir maliyet optimizasyonudur. Runner’lar iki olayda webhook’ları destekler: görev başlangıcı ve görev bitişi. Bunları bulut kaynaklarını otomatik olarak başlatıp durdurmak için kullanabilirsiniz.

    Kurulum şöyledir: runner’ınız bir AWS EC2 örneğinde bulunur. Çalışırken maliyet üretir. Durdurulduğunda hiçbir maliyeti yoktur.

    • Görev başlangıcında → webhook bir Lambda işlevini tetikler → Lambda EC2 örneğini başlatır → runner çevrimiçi olur, Semaphore’a bağlanır, görevi alır
    • Görev bitişinde → webhook başka bir Lambda’yı tetikler → Lambda EC2 örneğini durdurur

    Runner’ınız yalnızca fiilen iş yaparken çalışır. Düzensiz iş yüklerine sahip ekipler için yalnızca bu özellik bile Pro planını haklı çıkarabilir.

Proje runner’ı nasıl kurulur?

  1. Proje ayarlarınıza gidin ve Runners sekmesini açın. Mevcut runner’ların burada listelendiğini göreceksiniz.

  2. New Runner düğmesine tıklayın. Bir ad ve bir etiket verin — örneğin new-york.

  3. Kaydettikten sonra Semaphore iki kimlik bilgisi üretir: bir belirteç (her iki tarafta da saklanır, kimlik doğrulama için kullanılır) ve bir özel anahtar (yalnızca runner’da saklanır, aktarım sırasındaki verileri şifrelemek için kullanılır). Özel anahtarı indirin — bir sonraki adımda buna ihtiyacınız olacak.

  4. Runner’ı hedef sunucunuza dağıtın. En kolay yol Docker’dır:

    docker run \
    -e SEMAPHORE_WEB_ROOT=https://semaphore.example.com \
    -e SEMAPHORE_RUNNER_TOKEN=/ADwjSWmWV8FZB4pwQaaEOWgqIdOR+oDOeOXe2a3JD0= \
    -e SEMAPHORE_RUNNER_PRIVATE_KEY_FILE=/config.runner.key \
    -v "/path/to/private/key:/config.runner.key" \
    -d semaphoreui/runner:v2.17.28
    

    Alternatif olarak interaktif kurulum komutunu kullanın:

    semaphore runner setup
    
  5. Semaphore’a geri dönün, herhangi bir Şablon veya Envanteri açın ve ona new-york runner etiketini atayın. Bu görev artık her zaman New York runner’ınızda yürütülecektir.

Yalnızca şablonları değil, envanterleri de etiketleme

Sunucularınız bölgeye veya ağa göre gruplandırılmışsa görevleri yönlendirmenin daha akıllıca bir yolu vardır. Her şablonu ayrı ayrı etiketlemek yerine, bir runner etiketini doğrudan bir envantere atayabilirsiniz.

Semaphore’daki bir envanter, Ansible’ın sunucularınıza bağlanmak için kullandığı IP adreslerinin bir listesidir. Belirli bir sunucu grubunun New York’ta bulunduğunu biliyorsanız, bu envanteri new-york ile etiketleyin. Bu andan itibaren, bu envanteri kullanan herhangi bir şablon otomatik olarak New York runner’ında çalışır — şablon başına yapılandırmaya gerek yoktur.

Bu özellikle yeni şablonlar eklerken yararlıdır. Doğru envanteri seçersiniz ve runner yönlendirmesi kendiliğinden çalışır.

Bir şey daha: eşzamanlılık sınırları (concurrency limits)

Eşzamanlılığı sınırlamak istiyorsanız, runner başına maksimum paralel görev sayısını belirleyin. Varsayılan olarak sınırsızdır (0). Bunu 5 olarak ayarlarsanız ve bu runner zaten meşgulse, Semaphore görevi aynı etikete sahip başka bir runner’a yönlendirir.

Denemeye hazır mısınız?

Proje runner’ları Semaphore Pro planında mevcuttur. Ekibiniz yukarıdaki senaryolardan herhangi biriyle karşılaşıyorsa — büyüyen görev kuyrukları, birden fazla ekip, dağıtılmış altyapı — incelemeye değerdir.

İlginizi çekebilecek diğer yazılar