GITHUB ACTIONS nodetonet.com
Integration GitHub Actions CI/CD E2E Webhooks

GitHub Actions'da Nodetonet — E2E ve webhook testleri için test sunucunu aç

GitHub Actions içinde Nodetonet HTTP tünelleriyle E2E ve webhook testlerinizi gerçek bir public URL'e karşı çalıştırın — statik sunucu gerekmez, boştaki tüneller ücretsiz.

N Nodetonet Team
15 Mayıs 2026 9 dk okuma

CI ortamında tünel istemenin en yaygın nedeni "E2E testimde dünya dev sunucuma erişebilmeli." Cypress / Playwright aynı job'da localhost:3000'a karşı çalışır; ama Stripe, GitHub, Shopify gibi webhook sağlayıcıları ve Lighthouse CI gibi tarayıcılar gerçek bir public URL ister. Bir Nodetonet HTTP tüneli bir workflow içinde yaklaşık üç saniyede açılır ve yarım saniyede kapanır — herhangi bir test bütçesinin çok altında.

Özet: İki curl komutu — bir POST tüneli açmak için, bir DELETE kapatmak için — CI job'u boyunca geçerli, kuruş düzeyinde maliyetli bir HTTPS URL sağlar. Boştaki tüneller ücretsizdir; Nodetonet aylık abonelik olmadan peşin kredi kullanır.

Henüz resmi bir nodetonet/cli-action yayınlamıyoruz; bu yol haritasında. Şimdilik iki curl çağrısı bir action'ın yapacağının %95'ini yapar. REST API kanonik arayüzdür ve her zaman çalışmaya devam edecektir.

CI'da neden tünele ihtiyacınız var?

GitHub tarafından barındırılan runner'lar geçici NAT'ın arkasında oturur — bir dış servisin test sunucunuza doğrudan ulaşması mümkün değildir. Nodetonet tüneli, edge'imizden runner'ınıza kurulan kalıcı bir ters bağlantıdır: açıldığında https://<subdomain>.nodetonet.com'a gelen her istek localhost'unuza iletilir. Port yönlendirmesi, güvenlik duvarı kuralı veya rezerve IP gerekmez.

CI ekiplerinin bugün kullandığı başlıca seçeneklerin karşılaştırması:

YöntemMaliyet modeliKurulumWebhook desteğiÖzel alan adı
Nodetonet tüneliPeşin kredi, saniye bazındaİki curl çağrısıEvetEvet
ngrok ücretsiz planÜcretsiz (oturum sınırlı)Tek ikili indirmeEvet (sınırlı)Yalnızca ücretli plan
Cloudflare TunnelÜcretsiz (kalıcı daemon)Daemon kurulum + DNSEvetEvet (kendi alan adınız)
Kalıcı staging sunucuAylık VPS maliyeti, sürekli açıkSağlama + bakımEvetEvet
Statik S3/CDN deployDepolama + transfer ücretiBuild pipeline değişikliğiHayırEvet

Nodetonet'in avantajı, tünellerin aynı panelde çalıştırdığınız mobil proxy ve rotating proxy ile bütünleşmesidir — tek peşin bakiye, tek panel, tek API anahtarı. E2E paketinizin giden istekler için temiz bir mobil IP'ye de ihtiyacı varsa ikinci bir satıcıya gerek yoktur. Ayrıntılı karşılaştırma için Nodetonet vs ngrok ve Nodetonet vs Cloudflare Tunnel sayfalarına bakabilirsiniz.

Üç adımda desen

  1. Job başlangıcında — test sunucusunun portuyla POST /api/v1/proxies. Dönen URL'i $GITHUB_ENV'e kaydet.
  2. Job sırasında — test aracın http://localhost kullanacağı her yerde $TUNNEL_URL'i kullan.
  3. Job sonunda — bir if: always() adımında DELETE /api/v1/proxies/{id} — testler başarısız olsa bile çalışır.

Üçüncü adım çalışmasa bile (iptal edilen job, ölen runner), Nodetonet trafik olmayan tünelleri 30 dakika sonra otomatik durdurur; durdurulan tüneller ücretsizdir. Sızdırılan bir tünelin sonucu en fazla "fark edene kadar boşta duran bir URL" olur. Tünel sağlığını izleme ve denetim kayıtları hakkında daha fazla bilgi edinin.

Çalışan bir workflow dosyası

Şunu .github/workflows/e2e.yml'e ekleyin. Test sunucunun arka planda başladığını, :3000'i dinlediğini ve testlerin TARGET_URL'a saygı duyduğunu varsayar:

name: Nodetonet tüneli ile E2E
on: [push, pull_request]

jobs:
  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with: { node-version: '20' }

      - name: Bağımlılıkları kur
        run: npm ci

      - name: Test sunucusunu başlat (arka plan)
        run: npm run start:test &
        env:
          PORT: 3000

      - name: Sunucuyu bekle
        run: npx wait-on http://localhost:3000

      - name: Nodetonet tüneli aç
        env:
          NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
        run: |
          SUB="ci-${{ github.run_id }}"
          RESP=$(curl -fsS -X POST https://nodetonet.com/api/v1/proxies             -H "Authorization: Bearer $NTN_TOKEN"             -H "Content-Type: application/json"             -d "{\"subdomain\":\"$SUB\",\"target_host\":\"127.0.0.1\",\"target_port\":3000}")
          echo "TUNNEL_ID=$(echo $RESP | jq -r .id)"  >> $GITHUB_ENV
          echo "TUNNEL_URL=$(echo $RESP | jq -r .url)" >> $GITHUB_ENV

      - name: Public URL'e karşı Playwright çalıştır
        env:
          TARGET_URL: ${{ env.TUNNEL_URL }}
        run: npx playwright test

      - name: Nodetonet tünelini kapat
        if: always()
        env:
          NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
        run: |
          curl -fsS -X DELETE             -H "Authorization: Bearer $NTN_TOKEN"             https://nodetonet.com/api/v1/proxies/${{ env.TUNNEL_ID }} || true

jq tüm ubuntu-latest runner'larına önceden yüklüdür. Kendi barındırdığınız bir runner kullanıyorsanız ve jq yoksa tünel adımından önce sudo apt-get install -y jq ile kurun.

Webhook testleri — öldürücü kullanım senaryosu

Stripe, GitHub veya Twilio webhook entegrasyonunu test ediyorsanız, sağlayıcının sunucunuza ulaşması gerekir. localhost belli ki yetmez; act gibi lokal runner araçları da yardımcı olmaz çünkü üçüncü taraf servis kendi veri merkezinde.

Akış E2E ile tamamen aynıdır — tünel aç, webhook uç noktasını $TUNNEL_URL/webhooks/stripe olarak kaydet, eventi tetikleyen testi çalıştır, sonucu doğrula. Tek fark, bir koşu yarıda kesilirse temizliği kolaylaştırmak için branş başına öngörülebilir subdomain kullanmak istersiniz. PR job'larında github.head_ref kullanın:

      - name: Branş başına tünel aç
        env:
          NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
        run: |
          SUB="webhook-$(echo ${{ github.head_ref || github.ref_name }}                        | tr '/' '-' | tr -cd 'a-z0-9-' | cut -c1-40)"
          # ... yukarıdakiyle aynı POST

Nodetonet tünellerinin yaşam döngüsünü daha ayrıntılı anlamak için — TLS sertifikalarının otomatik verilmesi ve özel alan adı kurulumu dahil — bu yazılara bakın.

API token'ını güvenle saklamak

CI token güvenliği için iki kural:

Deployment ortamları kullanıyorsanız (staging, prod), denetim kayıtlarında hangi CI koşusunun hangi tüneli açtığını görmek için ortam başına ayrı bir token kullanın.

Paralel job'lar ve matris build'ler

Bir matris build çalıştırdığınızda her paralel job'un kendi tüneline ihtiyacı vardır. Subdomain yaklaşımı bunu zaten çözer: matris değişkenini subdomaine dahil ederseniz (örn. "ci-${{ github.run_id }}-${{ matrix.node }}") her shard benzersiz bir public URL alır ve çakışma olmaz. if: always()'deki DELETE yalnızca o shard'ın tünelini kapatır.

Kota, iş parçacığı sınırı ve IP izin listeleri gibi istemci başına kontroller gereken büyük filo build'leri için istemci başına kimlik doğrulama ve iş parçacığı sınırları yazılarına bakın — aynı model HTTP tünelleri için de geçerlidir.

Maliyet — bu gerçekten ne kadar tutuyor?

Nodetonet peşin kredi kullanır; aktif tünel süresine göre saniye bazında faturalandırır. On dakikalık bir CI job'u boyunca açık kalan bir tünel, koşu başına kuruşun çok altında bir maliyete sahiptir. Her PR push'unda E2E çalıştıran bir repo (örneğin ayda 150 koşu) tüneller için genellikle aylık bir doların oldukça altında harcar. Binlerce koşu içeren hiperaktif bir monorepo bile ucuz kalır. Aktif trafik olmayan boştaki tüneller hiçbir şey tutmaz.

Sağlayıcılar arası dürüst bir maliyet karşılaştırması için Nodetonet vs ngrok ve Nodetonet vs Cloudflare Tunnel sayfalarımıza bakın.

Yolda: resmi bir GitHub Action

Yukarıdaki desen güvenilir ama uzun. Resmi nodetonet/cli-action@v1 yol haritasında; dört adımı (POST, env yakala, testleri çalıştır, DELETE) tek bir bloğa indirgeyecek:

      - uses: nodetonet/cli-action@v1
        with:
          token: ${{ secrets.NTN_TOKEN }}
          port: 3000
        # TUNNEL_URL'u otomatik export eder, job sonunda otomatik temizler

      - run: npx playwright test
        env:
          TARGET_URL: ${{ env.TUNNEL_URL }}

Yukarıdaki curl deseni her zaman çalışmaya devam edecek — kanonik REST arayüzü o. Ne zaman yayınlanacağını öğrenmek için destek ekibiyle iletişime geçin veya Discord'a katılın.

Başlayın

Hazır mısınız? Ücretsiz hesap oluşturun, bir API token'ı üretin, yukarıdaki workflow'u yapıştırın ve bir PR açın. Tüneliniz saniyeler içinde açılır. Tam tünel referansı için HTTP tünelleri özellik sayfasını inceleyin ya da proxy denetleyici ile herhangi bir uç noktanızı doğrulayın.

Sıkça sorulan sorular

Bir CI job'u ölürse ve temizlik adımı hiç çalışmazsa ne olur?
Nodetonet trafik olmayan tünelleri 30 dakika sonra otomatik durdurur; durdurulan tüneller ücretsizdir. Yetim tünel siz silene kadar panelde kalır ama fatura kesmez. Ek güvenlik için her CI ortamına ayrı bir kapsamlı token kullanın; böylece o ortamın açtığı tüm tünelleri görüp toplu silebilirsiniz.
CI tünelleri için özel alan adı kullanabilir miyim?
Evet. Panel üzerinden özel bir subdomain yapılandırın — özel alan adı kılavuzuna bakın — ve sabit bir subdomain adıyla koşular arasında yeniden kullanın. Çoğu ekip geçici CI tünelleri için otomatik oluşturulan {ad}.nodetonet.com adresini kullanır; özel alan adlarını staging ve production için saklar.
Public URL'i CI koşuları arasında nasıl sabit tutarım?
Panelde bir subdomain rezerve edin ve POST gövdesinde aynı "subdomain" değerini kullanarak workflow'unuzda yeniden kullanın. API, subdomain zaten varsa 200, yeniyse 201 döner — her iki durumda da aynı URL'i geri alırsınız. Harici bir webhook sağlayıcısının koşular arasında yeniden yapılandıramayacağı sabit bir hedef gerektirdiğinde kullanışlıdır.
Cypress ve Playwright testlerini Nodetonet tüneliyle çalıştırabilir miyim?
Evet. Her iki framework de baseURL veya TARGET_URL ortam değişkenini destekler; bu değişkeni tünel URL'ine ayarlayın, testleriniz public uç noktaya karşı aynı şekilde çalışır. Playwright'ın playwright.config.ts dosyasında baseURL: process.env.TARGET_URL || "http://localhost:3000" kullanarak yerel ve CI koşularını sorunsuz hale getirin.
Nodetonet CI tünelleri için kutudan çıktığı gibi HTTPS desteği sunuyor mu?
Evet. Nodetonet'in verdiği her tünel URL'i varsayılan olarak HTTPS'dir; TLS sertifikası otomatik olarak verilir — ek yapılandırma gerekmez. Sertifika yaşam döngüsü ayrıntıları için Let's Encrypt otomatik yenileme yazısına bakın.
CI için Nodetonet ngrok'tan nasıl farklı?
Her ikisi de localhost için bir public URL sağlar. Nodetonet, aktif tünel süresi başına saniye bazında ücretlendirir; ücretli planlarda oturum sınırı veya bağlantı kapısı yoktur ve aynı fatura hesabını çalıştırdığınız mobil proxy veya rotating proxy'lerle paylaşır. Yan yana karşılaştırma için Nodetonet vs ngrok sayfasına bakın.
Nodetonet tünellerini kendi barındırdığım GitHub Actions runner'larıyla kullanabilir miyim?
Evet. Tünel, runner'ınızdan Nodetonet API'sine giden bir giden HTTPS isteğiyle açılır; dolayısıyla internet erişimi olan herhangi bir makinede çalışır — GitHub tarafından barındırılan, kendi barındırdığınız veya yerel bir iş istasyonu. Tek bağımlılık curl ve jq'dur; her ikisi de Linux runner'larında standarttır.

CI'nıza Nodetonet'i beş dakikada ekleyin

Yukarıdaki workflow parçacığını yapıştırın, NTN_TOKEN'ı secret olarak ayarlayın, bir PR gönderin. Tüneliniz testlerinizden önce açılır.