{"id":42396,"date":"2026-06-08T21:02:59","date_gmt":"2026-06-08T18:02:59","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/"},"modified":"2026-06-08T21:03:16","modified_gmt":"2026-06-08T18:03:16","slug":"github-actions-ve-playwright-sharding-ile-ci-cd","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/","title":{"rendered":"GitHub Actions ve Playwright Sharding ile CI\/CD"},"content":{"rendered":"<h2>GitHub Actions ve Playwright Sharding ile CI\/CD<\/h2>\n<p>B\u00fcy\u00fck test paketlerinizin CI\/CD s\u00fcre\u00e7lerini yava\u015flatmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? GitHub Actions ve Playwright Sharding ile test s\u00fcrelerinizi nas\u0131l dakikalara indirece\u011finizi ke\u015ffedin.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z ve g\u00fcvenilirlik her \u015feyden \u00f6nce gelir. Geli\u015ftiriciler yazd\u0131klar\u0131 kodlar\u0131n do\u011frulu\u011fundan emin olmak isterken, ayn\u0131 zamanda bu kontrol s\u00fcre\u00e7lerinin saatler s\u00fcrmesini istemezler. Projeler b\u00fcy\u00fcd\u00fck\u00e7e, yaz\u0131lan u\u00e7tan uca (E2E &#8211; End-to-End) testlerin say\u0131s\u0131 da ka\u00e7\u0131n\u0131lmaz olarak artar. Ba\u015flang\u0131\u00e7ta birka\u00e7 dakika s\u00fcren test s\u00fcre\u00e7leri, zamanla geli\u015ftirme ekiplerinin \u00f6n\u00fcnde b\u00fcy\u00fck bir engel haline gelebilir. \u0130\u015fte tam bu noktada devreye modern test otomasyon ara\u00e7lar\u0131 ve ak\u0131ll\u0131 CI\/CD (Continuous Integration \/ Continuous Deployment &#8211; S\u00fcrekli Entegrasyon \/ S\u00fcrekli Da\u011f\u0131t\u0131m) stratejileri giriyor.<\/p>\n<p>Bu makalede, Playwright ve TypeScript kullanarak haz\u0131rlad\u0131\u011f\u0131n\u0131z test paketlerini, GitHub Actions \u00fczerinde &#8220;Sharding&#8221; (par\u00e7alara ay\u0131rma) y\u00f6ntemiyle nas\u0131l paralel olarak \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede test s\u00fcrelerinizi nas\u0131l radikal bir \u015fekilde d\u00fc\u015f\u00fcrebilece\u011finizi ger\u00e7ek d\u00fcnya senaryolar\u0131yla g\u00f6receksiniz.<\/p>\n<h2>Test S\u00fcrelerini K\u0131saltman\u0131n S\u0131rr\u0131: Sharding Nedir?<\/h2>\n<p>Yaz\u0131l\u0131m test s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, testlerin do\u011frusal bir \u015fekilde, yani ard\u0131 ard\u0131na \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131d\u0131r. Y\u00fczlerce test senaryosunun tek bir makinede s\u0131rayla \u00e7al\u0131\u015fmas\u0131, \u00f6zellikle karma\u015f\u0131k kullan\u0131c\u0131 etkile\u015fimleri i\u00e7eren web uygulamalar\u0131nda saatler s\u00fcrebilir. Bu sorunu \u00e7\u00f6zmek i\u00e7in geleneksel y\u00f6ntemlerde yerel makinelerin i\u015flemci \u00e7ekirdeklerinden yararlanarak paralel \u00e7al\u0131\u015ft\u0131rma (multithreading) yoluna gidilir. Ancak tek bir sunucunun veya sanal makinenin g\u00fcc\u00fc de bir yere kadar yeterlidir.<\/p>\n<p>Sharding (par\u00e7alara ay\u0131rma), test paketinizi mant\u0131ksal veya fiziksel olarak daha k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6l\u00fcp, bu par\u00e7alar\u0131 tamamen ba\u011f\u0131ms\u0131z farkl\u0131 makinelerde (runner) e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015ft\u0131rma i\u015flemidir. Playwright, sundu\u011fu yerle\u015fik sharding deste\u011fi sayesinde bu s\u00fcreci inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, 100 adet testten olu\u015fan bir paketiniz oldu\u011funu d\u00fc\u015f\u00fcnelim. Bu testleri tek bir makinede \u00e7al\u0131\u015ft\u0131rmak yerine, her biri 25 test i\u00e7eren 4 farkl\u0131 gruba (shard) ay\u0131rabilir ve bunlar\u0131 GitHub Actions \u00fczerinde ayn\u0131 anda \u00e7al\u0131\u015fan 4 farkl\u0131 sanal makineye da\u011f\u0131tabilirsiniz.<\/p>\n<p>Bu yakla\u015f\u0131m, teorik olarak test s\u00fcrenizi yakla\u015f\u0131k d\u00f6rtte birine indirir. Playwright, hangi testin hangi par\u00e7aya gidece\u011fini otomatik olarak hesaplar. Bu sayede sizin test dosyalar\u0131n\u0131 manuel olarak b\u00f6lmenize gerek kalmaz. A\u015fa\u011f\u0131daki tabloda, geleneksel s\u0131ral\u0131 test yakla\u015f\u0131m\u0131 ile sharding yakla\u015f\u0131m\u0131 aras\u0131ndaki temel farklar\u0131 inceleyebilirsiniz:<\/p>\n<table>\n<thead>\n<tr>\n<th>Metrik<\/th>\n<th>Geleneksel S\u0131ral\u0131 Test<\/th>\n<th>Playwright Sharding (4 Shard)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u00c7al\u0131\u015fma S\u00fcresi<\/td>\n<td>\u00c7ok Y\u00fcksek (\u00d6rn: 40 dakika)<\/td>\n<td>D\u00fc\u015f\u00fck (\u00d6rn: 10 dakika)<\/td>\n<\/tr>\n<tr>\n<td>Kaynak Kullan\u0131m\u0131<\/td>\n<td>Tek Makine (S\u0131n\u0131rl\u0131 kaynak)<\/td>\n<td>Da\u011f\u0131t\u0131k Yap\u0131 (Y\u00fcksek kaynak)<\/td>\n<\/tr>\n<tr>\n<td>Maliyet Yap\u0131s\u0131<\/td>\n<td>D\u00fc\u015f\u00fck (Tek makine s\u00fcresi)<\/td>\n<td>Orta (Paralel \u00e7al\u0131\u015fan makine s\u00fcresi)<\/td>\n<\/tr>\n<tr>\n<td>Hata Analizi<\/td>\n<td>Zor (Tek b\u00fcy\u00fck rapor dosyas\u0131)<\/td>\n<td>Kolay (Birle\u015ftirilmi\u015f tek rapor)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>GitHub Actions \u00dczerinde Playwright Altyap\u0131s\u0131 Nas\u0131l Kurulur?<\/h2>\n<p>GitHub Actions \u00fczerinde Playwright testlerini ko\u015fturmak i\u00e7in \u00f6ncelikle projenizin k\u00f6k dizininde bir i\u015f ak\u0131\u015f\u0131 (workflow) dosyas\u0131 tan\u0131mlaman\u0131z gerekir. Bu dosya, GitHub platformuna testlerinizin hangi tetikleyicilerle (trigger), hangi i\u015fletim sisteminde ve hangi ba\u011f\u0131ml\u0131l\u0131klarla \u00e7al\u0131\u015faca\u011f\u0131n\u0131 s\u00f6yler. TypeScript tabanl\u0131 bir Playwright projesinde ilk ad\u0131m, temiz bir i\u015f ak\u0131\u015f\u0131 dosyas\u0131 olu\u015fturmakt\u0131r.<\/p>\n<p>\u00d6ncelikle projenizin ana dizininde <code>.github\/workflows<\/code> klas\u00f6r yap\u0131s\u0131n\u0131 olu\u015fturun ve i\u00e7erisine <code>playwright.yml<\/code> ad\u0131nda bir dosya ekleyin. Bu dosya, CI\/CD hatt\u0131m\u0131z\u0131n kalbi olacakt\u0131r. \u0130lk a\u015famada, sharding yapmadan \u00f6nce temel bir GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131n nas\u0131l g\u00f6r\u00fcnmesi gerekti\u011fine bakal\u0131m. Bu sayede temel yap\u0131y\u0131 anlay\u0131p, \u00fczerine sharding mimarisini in\u015fa etmemiz \u00e7ok daha kolay olacakt\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>name: Playwright Tests\non:\n  push:\n    branches: [ main, master ]\n  pull_request:\n    branches: [ main, master ]\njobs:\n  test:\n    timeout-minutes: 60\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v4\n    - uses: actions\/setup-node@v4\n      with:\n        node-version: 18\n    - name: Install dependencies\n      run: npm ci\n    - name: Install Playwright Browsers\n      run: npx playwright install --with-deps\n    - name: Run Playwright tests\n      run: npx playwright test\n    - uses: actions\/upload-artifact@v4\n      if: always()\n      with:\n        name: playwright-report\n        path: playwright-report\/\n        retention-days: 30<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki yap\u0131land\u0131rma, her kod g\u00f6nderiminde (push) veya \u00e7ekme iste\u011finde (pull request) tetiklenir. Temel olarak Ubuntu i\u015fletim sistemini aya\u011fa kald\u0131r\u0131r, Node.js ortam\u0131n\u0131 kurar, projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckler, gerekli taray\u0131c\u0131 motorlar\u0131n\u0131 indirir ve testleri \u00e7al\u0131\u015ft\u0131r\u0131r. Son olarak da test raporunu bir \u00e7\u0131kt\u0131 (artifact) olarak kaydeder. Ancak test say\u0131n\u0131z artt\u0131k\u00e7a bu tekil i\u015f (job) ciddi bir darbo\u011faz olu\u015fturacakt\u0131r.<\/p>\n<h2>Playwright Sharding Konfig\u00fcrasyonu ve Matris Yap\u0131s\u0131<\/h2>\n<p>Temel i\u015f ak\u0131\u015f\u0131m\u0131z\u0131 olu\u015fturduktan sonra, \u015fimdi bu yap\u0131y\u0131 paralel \u00e7al\u0131\u015facak \u015fekilde optimize etme zaman\u0131 geldi. GitHub Actions, &#8220;Matrix Strategy&#8221; (matris stratejisi) ad\u0131 verilen harika bir \u00f6zellik sunar. Bu \u00f6zellik sayesinde, tek bir i\u015f tan\u0131m\u0131n\u0131 farkl\u0131 parametrelerle \u00e7oklu olarak klonlayabilir ve ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rabilirsiniz. Playwright&#8217;\u0131n sharding parametreleri ile GitHub Actions matris yap\u0131s\u0131n\u0131 birle\u015ftirdi\u011fimizde, tam otomatik bir paralel test canavar\u0131 elde ederiz.<\/p>\n<p>Playwright test komutu \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rken iki kritik parametre kabul eder: <code>--shard=x\/y<\/code>. Burada <code>x<\/code> mevcut par\u00e7an\u0131n indeksini, <code>y<\/code> ise toplam par\u00e7a say\u0131s\u0131n\u0131 temsil eder. \u00d6rne\u011fin, testleri 3 par\u00e7aya b\u00f6lmek istiyorsak, \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z komutlar s\u0131ras\u0131yla <code>--shard=1\/3<\/code>, <code>--shard=2\/3<\/code> ve <code>--shard=3\/3<\/code> olacakt\u0131r. Bunu GitHub Actions \u00fczerinde dinamik hale getirmek i\u00e7in matris yap\u0131s\u0131n\u0131 \u015fu \u015fekilde kurgular\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>name: Playwright Sharded Tests\non:\n  push:\n    branches: [ main, master ]\n  pull_request:\n    branches: [ main, master ]\njobs:\n  playwright-tests:\n    timeout-minutes: 40\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        shardIndex: [1, 2, 3, 4]\n        shardTotal: [4]\n    steps:\n    - uses: actions\/checkout@v4\n    - uses: actions\/setup-node@v4\n      with:\n        node-version: 18\n    - name: Install dependencies\n      run: npm ci\n    - name: Install Playwright Browsers\n      run: npx playwright install --with-deps\n    - name: Run Playwright tests\n      run: npx playwright test --shard=${{ matrix.shardIndex }}\/${{ matrix.shardTotal }}\n    - name: Upload blob report to GitHub Actions Artifacts\n      if: always()\n      with:\n        name: all-blob-reports\n        path: blob-report\/\n        retention-days: 1<\/code><\/pre>\n<\/div>\n<p>Bu yeni konfig\u00fcrasyonda neler de\u011fi\u015fti? \u0130lk olarak, <code>strategy.matrix<\/code> blo\u011fu alt\u0131nda <code>shardIndex<\/code> ve <code>shardTotal<\/code> de\u011fi\u015fkenlerini tan\u0131mlad\u0131k. GitHub Actions, bu matris tan\u0131m\u0131n\u0131 g\u00f6rd\u00fc\u011f\u00fc anda arka planda 4 adet tamamen ba\u011f\u0131ms\u0131z sanal makine ba\u015flat\u0131r. Her bir makineye s\u0131ras\u0131yla 1, 2, 3 ve 4 indeks de\u011ferlerini atar. \u0130kinci \u00f6nemli de\u011fi\u015fiklik ise test komutunun sonuna ekledi\u011fimiz dinamik parametredir. Son olarak, standart HTML raporu yerine &#8220;blob-report&#8221; \u00e7\u0131kt\u0131s\u0131 ald\u0131k. \u00c7\u00fcnk\u00fc her makine kendi par\u00e7as\u0131n\u0131n sonucunu \u00fcretecektir ve bu par\u00e7al\u0131 raporlar\u0131 daha sonra birle\u015ftirmemiz gerekecektir.<\/p>\n<h2>Ger\u00e7ek Zamanl\u0131 Vaka Analizi: E-Ticaret Platformunda Test S\u00fcrelerini %80 Azaltmak<\/h2>\n<p>Konuyu daha somut hale getirmek i\u00e7in T\u00fcrkiye pazar\u0131nda faaliyet g\u00f6steren hayali bir e-ticaret platformu olan &#8220;AlisverisSepeti&#8221; projesini ele alal\u0131m. Bu platformun QA (Quality Assurance &#8211; Kalite G\u00fcvence) ekibi, kullan\u0131c\u0131lar\u0131n sepet ad\u0131mlar\u0131, \u00f6deme sistemleri, \u00fcyelik i\u015flemleri ve \u00fcr\u00fcn arama fonksiyonlar\u0131 i\u00e7in toplamda 480 adet karma\u015f\u0131k u\u00e7tan uca test senaryosu yazd\u0131. Projede dil olarak TypeScript, test k\u00fct\u00fcphanesi olarak ise Playwright tercih edildi.<\/p>\n<p>\u0130lk ba\u015flarda t\u00fcm testler tek bir CI\/CD hatt\u0131nda s\u0131ral\u0131 olarak \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yordu. Ancak testlerin tamamlanmas\u0131 tam 55 dakika s\u00fcr\u00fcyordu. Bu durum, yaz\u0131l\u0131mc\u0131lar\u0131n kodlar\u0131n\u0131 canl\u0131ya (production) g\u00f6ndermeden \u00f6nce saatlerce beklemesine yol a\u00e7\u0131yor ve \u015firketin \u00e7evikli\u011fini ciddi \u015fekilde baltal\u0131yordu. Ekip, bu sorunu \u00e7\u00f6zmek i\u00e7in Playwright Sharding mimarisine ge\u00e7i\u015f karar\u0131 ald\u0131.<\/p>\n<p>Yap\u0131lan analizler sonucunda test y\u00fck\u00fcn\u00fcn 8 farkl\u0131 par\u00e7aya (shard) b\u00f6l\u00fcnmesine karar verildi. GitHub Actions matris yap\u0131s\u0131 8 paralel i\u015f \u00e7al\u0131\u015ft\u0131racak \u015fekilde g\u00fcncellendi. Sonu\u00e7lar ger\u00e7ekten g\u00f6z kama\u015ft\u0131r\u0131c\u0131yd\u0131:<\/p>\n<ul>\n<li><strong>Eski Test S\u00fcresi:<\/strong> 55 Dakika (Tekil makine)<\/li>\n<li><strong>Yeni Test S\u00fcresi:<\/strong> 7.5 Dakika (8 Paralel Shard ile)<\/li>\n<li><strong>Kazan\u0131lan Zaman Oran\u0131:<\/strong> Yakla\u015f\u0131k %86 zaman tasarrufu<\/li>\n<li><strong>Geli\u015ftirici Memnuniyeti:<\/strong> Kod da\u011f\u0131t\u0131m s\u0131kl\u0131\u011f\u0131 g\u00fcnde 2&#8217;den 10&#8217;un \u00fczerine \u00e7\u0131kt\u0131.<\/li>\n<\/ul>\n<p>Bu vaka analizi g\u00f6stermektedir ki, do\u011fru yap\u0131land\u0131r\u0131lm\u0131\u015f bir sharding stratejisi sadece teknik bir iyile\u015ftirme sunmakla kalmaz, ayn\u0131 zamanda do\u011frudan i\u015f \u00e7\u0131kt\u0131lar\u0131n\u0131n h\u0131zlanmas\u0131na ve geli\u015ftirme ekiplerinin motivasyonunun artmas\u0131na katk\u0131 sa\u011flar.<\/p>\n<h2>Test Raporlar\u0131n\u0131 Birle\u015ftirme ve Yay\u0131nlama (Merge Reports)<\/h2>\n<p>Testlerimizi paralel olarak ba\u015far\u0131yla ko\u015fturduk ve s\u00fcreleri k\u0131saltt\u0131k. Ancak \u015fu anda elimizde bir problem var: 4 veya 8 farkl\u0131 makineden elde edilmi\u015f, par\u00e7a par\u00e7a &#8220;blob&#8221; rapor dosyalar\u0131 var. Y\u00f6neticilerimize veya ekibimize sunmak i\u00e7in bize tek bir derli toplu HTML raporu gerekiyor. Neyse ki Playwright, bu farkl\u0131 par\u00e7alardan gelen raporlar\u0131 tek bir potada eritebilen <code>merge-reports<\/code> arac\u0131na sahiptir.<\/p>\n<p>Bunun i\u00e7in GitHub Actions i\u015f ak\u0131\u015f\u0131m\u0131za ikinci bir i\u015f (job) eklememiz gerekir. Bu i\u015f, paralel \u00e7al\u0131\u015fan t\u00fcm testlerin bitmesini bekleyecek, \u00fcretilen t\u00fcm blob raporlar\u0131n\u0131 indirecek, bunlar\u0131 birle\u015ftirecek ve tek bir HTML raporu olarak yay\u0131nlayacakt\u0131r. \u0130\u015fte bu s\u00fcreci otomatize eden tam i\u015f ak\u0131\u015f\u0131 \u015femas\u0131:<\/p>\n<div class=\"code-container\">\n<pre><code>jobs:\n  playwright-tests:\n    # (Yukar\u0131da tan\u0131mlad\u0131\u011f\u0131m\u0131z sharding i\u015f ad\u0131mlar\u0131 buraya gelecek)\n\n  merge-reports:\n    if: always()\n    needs: [playwright-tests]\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v4\n    - uses: actions\/setup-node@v4\n      with:\n        node-version: 18\n    - name: Install dependencies\n      run: npm ci\n    - name: Download all blob reports\n      uses: actions\/download-artifact@v4\n      with:\n        name: all-blob-reports\n        path: all-blob-reports\n    - name: Merge PDF\/HTML Reports\n      run: npx playwright merge-reports --reporter html .\/all-blob-reports\n    - name: Upload Final HTML Report\n      uses: actions\/upload-artifact@v4\n      with:\n        name: html-report\n        path: playwright-report\n        retention-days: 14<\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131da yer alan <code>needs: [playwright-tests]<\/code> ifadesi kritik bir \u00f6neme sahiptir. Bu ifade, rapor birle\u015ftirme ad\u0131m\u0131n\u0131n ancak ve ancak t\u00fcm paralel testler tamamland\u0131ktan sonra \u00e7al\u0131\u015fmaya ba\u015flayaca\u011f\u0131n\u0131 garanti eder. <code>actions\/download-artifact<\/code> ad\u0131m\u0131 ise t\u00fcm farkl\u0131 makinelerden toplanan blob raporlar\u0131n\u0131 tek bir klas\u00f6re indirir. Ard\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131lan <code>npx playwright merge-reports<\/code> komutu, sihirli bir \u015fekilde t\u00fcm verileri birle\u015ftirerek bize tertemiz bir HTML raporu sunar.<\/p>\n<h2>CI\/CD S\u00fcre\u00e7lerinde Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcm \u00d6nerileri<\/h2>\n<p>Playwright ve GitHub Actions entegrasyonu harika \u00e7al\u0131\u015fsa da, \u00f6l\u00e7ek b\u00fcy\u00fcd\u00fck\u00e7e baz\u0131 teknik zorluklarla kar\u015f\u0131la\u015fman\u0131z olas\u0131d\u0131r. Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in uygulayabilece\u011finiz baz\u0131 pratik y\u00f6ntemleri \u015fu \u015fekilde s\u0131ralayabiliriz:<\/p>\n<ol>\n<li><strong>Karars\u0131z Testler (Flaky Tests):<\/strong> Bazen testler yerel makinenizde sorunsuz \u00e7al\u0131\u015f\u0131rken, CI\/CD ortam\u0131nda a\u011f gecikmeleri veya kaynak yetersizli\u011fi nedeniyle ba\u015far\u0131s\u0131z olabilir. Bu durumu engellemek i\u00e7in Playwright konfig\u00fcrasyon dosyan\u0131zda (<code>playwright.config.ts<\/code>) otomatik yeniden deneme (retry) mekanizmas\u0131n\u0131 aktif hale getirin. \u00d6rne\u011fin, CI ortam\u0131 i\u00e7in <code>retry: process.env.CI ? 2 : 0<\/code> tan\u0131m\u0131 yapmak hayat kurtar\u0131r.<\/li>\n<li><strong>\u00d6nbellekleme (Caching) Kullan\u0131m\u0131:<\/strong> Her test \u00e7al\u0131\u015fmas\u0131nda ba\u011f\u0131ml\u0131l\u0131klar\u0131n (node_modules) s\u0131f\u0131rdan indirilmesi zaman kaybettirir. GitHub Actions&#8217;\u0131n \u00f6nbellekleme mekanizmas\u0131n\u0131 kullanarak npm paketlerini \u00f6nbelle\u011fe alabilir ve kurulum ad\u0131mlar\u0131n\u0131 saniyelere indirebilirsiniz.<\/li>\n<li><strong>Hassas Verilerin G\u00fcvenli\u011fi:<\/strong> Testleriniz ger\u00e7ek veya test ortam\u0131 API&#8217;lerine ba\u011flan\u0131rken kullan\u0131c\u0131 ad\u0131, \u015fifre veya API anahtar\u0131 gibi gizli bilgilere ihtiya\u00e7 duyabilir. Bu verileri asla kodunuzun i\u00e7ine d\u00fcz metin olarak yazmay\u0131n. GitHub projenizin ayarlar k\u0131sm\u0131ndaki &#8220;Secrets and Variables&#8221; b\u00f6l\u00fcm\u00fcn\u00fc kullanarak bu verileri g\u00fcvenli bir \u015fekilde saklay\u0131n ve i\u015f ak\u0131\u015f\u0131n\u0131zda <code>${{ secrets.API_KEY }}<\/code> \u015feklinde \u00e7a\u011f\u0131r\u0131n.<\/li>\n<\/ol>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>Sharding kullanmak GitHub Actions maliyetlerimi art\u0131r\u0131r m\u0131?<\/h3>\n<p>GitHub Actions, faturaland\u0131rmay\u0131 toplam kullan\u0131lan dakika baz\u0131nda yapar. \u00d6rne\u011fin, tek bir makinede 40 dakika s\u00fcren bir testi, 4 makinede paralel olarak 10&#8217;ar dakika \u00e7al\u0131\u015ft\u0131rmak teorik olarak ayn\u0131 toplam dakikay\u0131 (4 x 10 = 40 dakika) harcar. Dolay\u0131s\u0131yla faturaland\u0131rma \u00fczerinde ciddi bir olumsuz etkisi olmaz, aksine geli\u015ftiricilerin bekleme s\u00fcresini azaltt\u0131\u011f\u0131 i\u00e7in dolayl\u0131 yoldan verimlili\u011fi art\u0131r\u0131r.<\/p>\n<h3>Ka\u00e7 adet shard kullanmam gerekti\u011fine nas\u0131l karar vermeliyim?<\/h3>\n<p>Bu durum projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ve test say\u0131n\u0131za ba\u011fl\u0131d\u0131r. Genel bir kural olarak, toplam test s\u00fcreniz 15 dakikay\u0131 a\u015f\u0131yorsa sharding d\u00fc\u015f\u00fcnmeye ba\u015flamal\u0131s\u0131n\u0131z. \u0130lk a\u015famada 2 veya 4 shard ile ba\u015flay\u0131p, test s\u00fcreleriniz tekrar uzamaya ba\u015flad\u0131k\u00e7a bu say\u0131y\u0131 kademeli olarak art\u0131rabilirsiniz.<\/p>\n<h3>Paralel \u00e7al\u0131\u015fan testler ayn\u0131 veritaban\u0131n\u0131 kullan\u0131rken \u00e7ak\u0131\u015fma ya\u015far m\u0131?<\/h3>\n<p>Evet, bu en s\u0131k kar\u015f\u0131la\u015f\u0131lan mimari sorunlardan biridir. E\u011fer testleriniz veritaban\u0131nda ayn\u0131 verileri manip\u00fcle ediyorsa, paralel \u00e7al\u0131\u015f\u0131rken birbirlerini bozabilirler. Bu sorunu a\u015fmak i\u00e7in her testin kendi benzersiz test verisini (\u00f6rne\u011fin dinamik e-posta adresleri veya benzersiz ID&#8217;ler kullanarak) olu\u015fturmas\u0131n\u0131 sa\u011flamal\u0131 veya her shard i\u00e7in izole test ortamlar\u0131 kullanmal\u0131s\u0131n\u0131z.<\/p>\n<h3>Playwright Sharding sadece TypeScript ile mi kullan\u0131labilir?<\/h3>\n<p>Hay\u0131r, Playwright&#8217;\u0131n sharding \u00f6zelli\u011fi Python, Java ve .NET (C#) dillerini destekleyen di\u011fer Playwright k\u00fct\u00fcphanelerinde de kullan\u0131labilir. Ancak TypeScript ve JavaScript ekosistemi, sundu\u011fu zengin ara\u00e7 deste\u011fi ve h\u0131zl\u0131 kurulum avantajlar\u0131 nedeniyle sekt\u00f6rde en \u00e7ok tercih edilen se\u00e7enektir.<\/p>\n<p>#GitHubActions #Playwright #TypeScript #ContinuousIntegration #SoftwareTesting<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/playwright-sharding-github-actions-demo\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/playwright-sharding-github-actions-demo<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"B\u00fcy\u00fck test paketlerinizin CI\/CD s\u00fcre\u00e7lerini yava\u015flatmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? GitHub Actions ve Playwright Sharding ile test s\u00fcrelerinizi nas\u0131l dakikalara indirece\u011finizi ke\u015ffedin.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1401],"tags":[],"class_list":{"0":"post-42396","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-git","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GitHub Actions ve Playwright Sharding ile CI\/CD - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GitHub Actions ve Playwright Sharding ile CI\/CD\" \/>\n<meta property=\"og:description\" content=\"B\u00fcy\u00fck test paketlerinizin CI\/CD s\u00fcre\u00e7lerini yava\u015flatmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? GitHub Actions ve Playwright Sharding ile test s\u00fcrelerinizi nas\u0131l dakikalara indirece\u011finizi ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-08T18:02:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-08T18:03:16+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"GitHub Actions ve Playwright Sharding ile CI\/CD\",\"datePublished\":\"2026-06-08T18:02:59+00:00\",\"dateModified\":\"2026-06-08T18:03:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\"},\"wordCount\":2026,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Git\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\",\"name\":\"GitHub Actions ve Playwright Sharding ile CI\/CD - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-08T18:02:59+00:00\",\"dateModified\":\"2026-06-08T18:03:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GitHub Actions ve Playwright Sharding ile CI\/CD\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"GitHub Actions ve Playwright Sharding ile CI\/CD - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/","og_locale":"tr_TR","og_type":"article","og_title":"GitHub Actions ve Playwright Sharding ile CI\/CD","og_description":"B\u00fcy\u00fck test paketlerinizin CI\/CD s\u00fcre\u00e7lerini yava\u015flatmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? GitHub Actions ve Playwright Sharding ile test s\u00fcrelerinizi nas\u0131l dakikalara indirece\u011finizi ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-08T18:02:59+00:00","article_modified_time":"2026-06-08T18:03:16+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"GitHub Actions ve Playwright Sharding ile CI\/CD","datePublished":"2026-06-08T18:02:59+00:00","dateModified":"2026-06-08T18:03:16+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/"},"wordCount":2026,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Git"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/","url":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/","name":"GitHub Actions ve Playwright Sharding ile CI\/CD - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-08T18:02:59+00:00","dateModified":"2026-06-08T18:03:16+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-ve-playwright-sharding-ile-ci-cd\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GitHub Actions ve Playwright Sharding ile CI\/CD"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42396","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42396"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42396\/revisions"}],"predecessor-version":[{"id":42397,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42396\/revisions\/42397"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42396"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42396"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42396"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}