StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • SEO & Performance Sprint
  • QA & Stabilizacja
  • Konsultacje Product / Delivery
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
Next.jsDevOps

CI/CD dla Next.js — GitHub Actions, preview deployments i automatyczne testy

Jak skonfigurować CI/CD pipeline dla Next.js z GitHub Actions? Automatyczne testy, linting, build check, Lighthouse CI, preview deployments i deploy na produkcję.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
10 kwietnia 2026 15:10
Czytanie
3 min czytania
Aktualizacja
25 maja 2026 10:55

Po co CI/CD w projekcie Next.js?

CI/CD (Continuous Integration / Continuous Deployment) automatyzuje testowanie, budowanie i wdrażanie aplikacji. Zamiast ręcznie uruchamiać testy i deployować — każdy push na git triggeruje pipeline, który sprawdza jakość kodu i wdraża zmiany.

Artykuł w skrócie

  • Minimum to lint, type check i build — nawet ten najprostszy pipeline gwarantuje, że nie wdrożysz kodu, który się nie kompiluje albo nie buduje; dla jednoosobowego projektu też ma sens.
  • Pełny pipeline dokłada testy — unit testy, E2E w Playwright i Lighthouse CI łapią regresje funkcjonalne i wydajnościowe, zanim trafią na produkcję.
  • Cache przyspiesza pipeline o połowę i więcej — cache zależności (pnpm) i cache .next/cache skracają czas z minut do ułamka przy niezmienionych plikach.
  • Lighthouse CI jako performance gate — progi w lighthouserc (np. performance ≥ 0.9) wywalą build, gdy wydajność spadnie, więc regresja nie przechodzi dalej.
  • Na Vercel CI to tylko testy — deploy jest automatyczny przy pushu na main; GitHub Actions służy do kontroli jakości, a nie do wdrażania.
  • Self-hosting dokłada job deploy — przez SSH albo obraz Docker, uruchamiany tylko po przejściu testów na gałęzi main; zawsze z weryfikacją, że aplikacja wstała.

Minimalna korzyść z CI/CD (Continuous Integration / Continuous Deployment) to praktyka automatycznego integrowania, testowania i wdrażania kodu. CI uruchamia testy i build przy każdej zmianie, CD automatyzuje dostarczenie zmiany na środowisko docelowe — razem skracają drogę od commita do produkcji i wyłapują błędy wcześnie.: nigdy nie wdrożysz kodu, który nie przechodzi testów lub nie buduje się poprawnie.

Podstawowy pipeline — lint, test, build

Code
# .github/workflows/ci.yml
name: CI
 
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
 
jobs:
  quality:
    name: Code Quality
    runs-on: ubuntu-latest
 
    steps:
      - uses: actions/checkout@v4
 
      - uses: pnpm/action-setup@v4
        with:
          version: 9
 
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'
 
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
 
      - name: Lint
        run: pnpm lint
 
      - name: Type check
        run: pnpm tsc --noEmit
 
      - name: Unit tests
        run: pnpm test
 
      - name: Build
        run: pnpm build
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
          NEXT_PUBLIC_APP_URL: https://strivelab.pl

Ten pipeline uruchamia się na każdym PR i pushu na main. Jeśli lint, type check, testy lub build failują — PR jest blokowany.

Cache zależności i build cache

Przyspieszenie pipeline'u o 50–70% dzięki cachowaniu:

Code
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'
 
      - name: Cache Next.js build
        uses: actions/cache@v4
        with:
          path: |
            .next/cache
          key: nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('**/*.ts', '**/*.tsx') }}
          restore-keys: |
            nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-
            nextjs-${{ runner.os }}-

Testy E2E z Playwright

Code
  e2e:
    name: E2E Tests
    runs-on: ubuntu-latest
    needs: quality # Uruchom po quality check
 
    steps:
      - uses: actions/checkout@v4
 
      - uses: pnpm/action-setup@v4
        with:
          version: 9
 
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'
 
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
 
      - name: Install Playwright browsers
        run: pnpm exec playwright install --with-deps chromium
 
      - name: Build
        run: pnpm build
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
 
      - name: Run E2E tests
        run: pnpm exec playwright test
        env:
          BASE_URL: http://localhost:3000
 
      - name: Upload test results
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: playwright-report/

Lighthouse CI — automatyczny audyt wydajności

Code
  lighthouse:
    name: Lighthouse CI
    runs-on: ubuntu-latest
    needs: quality
 
    steps:
      - uses: actions/checkout@v4
 
      - uses: pnpm/action-setup@v4
        with:
          version: 9
 
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'
 
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
 
      - name: Build
        run: pnpm build
 
      - name: Run Lighthouse CI
        uses: treosh/lighthouse-ci-action@v12
        with:
          configPath: './lighthouserc.json'
          uploadArtifacts: true
Code
// lighthouserc.json
{
  "ci": {
    "collect": {
      "startServerCommand": "pnpm start",
      "url": ["http://localhost:3000", "http://localhost:3000/blog"],
      "numberOfRuns": 3
    },
    "assert": {
      "assertions": {
        "categories:performance": ["error", { "minScore": 0.9 }],
        "categories:accessibility": ["error", { "minScore": 0.9 }],
        "categories:best-practices": ["error", { "minScore": 0.9 }],
        "categories:seo": ["error", { "minScore": 0.9 }]
      }
    }
  }
}

Jeśli wynik Performance spadnie poniżej 90 — pipeline failuje. Wyłapujesz regresje wydajności, zanim trafią na produkcję. Lighthouse CI sam uruchamia serwer aplikacji dzięki startServerCommand w konfiguracji powyżej, więc nie musisz robić tego osobno.

Przy okazji warto domknąć konfigurację testów E2E z poprzedniej sekcji — żeby Playwright miał uruchomiony serwer, najczyściej zdefiniować webServer w playwright.config.ts:

Code
// playwright.config.ts
import { defineConfig } from '@playwright/test';
 
export default defineConfig({
  use: {
    baseURL: 'http://127.0.0.1:3000',
  },
  webServer: {
    command: 'pnpm start',
    url: 'http://127.0.0.1:3000',
    reuseExistingServer: !process.env.CI,
  },
});

Dzięki temu Playwright sam wystartuje aplikację przed testami w CI, a lokalnie wykorzysta już działający serwer, jeśli go masz.

Deploy na produkcję

Vercel — automatyczny

Na Vercel nie potrzebujesz workflow'u deploy — Vercel automatycznie deployuje każdy push na main. GitHub Actions używasz tylko do testów.

Self-hosted (Coolify/VPS) — SSH deploy

Code
  deploy:
    name: Deploy to Production
    runs-on: ubuntu-latest
    needs: [quality, e2e]
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
 
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /opt/apps/strivelab
            git pull origin main
            pnpm install --frozen-lockfile
            pnpm build
            pm2 restart strivelab
 
      - name: Verify deployment
        run: |
          sleep 10
          curl -f https://strivelab.pl || exit 1

Docker deploy

Code
  deploy:
    name: Build & Deploy Docker
    runs-on: ubuntu-latest
    needs: [quality]
    if: github.ref == 'refs/heads/main'
 
    steps:
      - uses: actions/checkout@v4
 
      - name: Login to registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
 
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:latest
 
      - name: Deploy to server
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            docker pull ghcr.io/${{ github.repository }}:latest
            docker stop strivelab || true
            docker rm strivelab || true
            docker run -d --name strivelab \
              -p 3000:3000 \
              --env-file /opt/apps/.env \
              ghcr.io/${{ github.repository }}:latest

Preview deployments na Vercel

Każdy PR automatycznie dostaje Preview deployment to osobne, w pełni działające wdrożenie aplikacji budowane automatycznie dla każdego pull requesta, pod unikalnym URL-em. Pozwala obejrzeć i przetestować zmiany w realnym środowisku przed scaleniem do main, bez dotykania produkcji. na Vercel. Aby dodać komentarz z linkiem do PR:

Code
  preview-comment:
    name: Preview URL Comment
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request'
    steps:
      - name: Wait for Vercel
        uses: patrickedqvist/wait-for-vercel-preview@v1.3.2
        id: vercel
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          max_timeout: 300
 
      - name: Comment PR
        uses: actions/github-script@v7
        with:
          script: |
            const previewUrl = '${{ steps.vercel.outputs.url }}';
 
            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `Preview: ${previewUrl}`
            });

Werdykt Labu

Dobry pipeline CI/CD dla Next.js buduje się warstwami. Minimum, które ma sens nawet w jednoosobowym projekcie, to lint, type check i build — gwarancja, że nie wdrożysz kodu, który się nie kompiluje. Na to dokładasz, w miarę dojrzewania projektu, testy jednostkowe, E2E w Playwright i Lighthouse CI jako performance gate, a cache zależności i .next/cache sprawiają, że to wszystko nadal mieści się w kilku minutach.

Strona deploymentu zależy od hostingu i tu reguła jest prosta. Na Vercel CI sprowadza się do kontroli jakości, bo wdrożenie i preview deployments dzieją się automatycznie; przy self-hostingu dokładasz job deploy przez SSH albo Docker, uruchamiany tylko po przejściu testów na main i zawsze z weryfikacją, że aplikacja wstała. Niezależnie od wariantu, sens całego pipeline'u realizuje się dopiero, gdy oznaczysz kluczowe joby jako wymagane sprawdzenia — wtedy zielony build naprawdę staje się warunkiem wejścia kodu na produkcję.

Chcesz ustawić solidny pipeline CI/CD dla projektu Next.js — od testów po automatyczny deploy? Napisz do mnie — pomagam budować procesy, które łapią błędy wcześnie i nie spowalniają zespołu.

  • Po co CI/CD w projekcie Next.js?1 min
  • Podstawowy pipeline — lint, test, build1 min
  • Cache zależności i build cache1 min
  • Testy E2E z Playwright1 min
  • Lighthouse CI — automatyczny audyt wydajności1 min
  • Deploy na produkcję1 min
  • Preview deployments na Vercel1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 30 maja 2026

Konfigurację workflow, cache i wymaganych sprawdzeń zweryfikowano na podstawie oficjalnej dokumentacji GitHub, Next.js i Playwright:

GitHub Actions: dokumentacja, GitHub: caching dependencies, Next.js: Continuous Integration build caching, Playwright: Continuous Integration.

Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Cursor czy Antigravity? Co wybrać do kodowania z AI
Cursor czy Antigravity? Co wybrać do kodowania z AI

Cursor czy Antigravity w 2026? Porównanie dwóch filozofii kodowania z AI — pilot kontra autonomiczni agenci. Modele, ceny, limity, stabilność i realna przydatność we frontendzie.

Maciej Sala

Maciej Sala

Founder Strivelab

1 czerwca 2026
Audyt SEO to nie lista TODO — dlaczego zalecenia techniczne muszą zamieniać się w PR-y
Audyt SEO to nie lista TODO — dlaczego zalecenia techniczne muszą zamieniać się w PR-y

Większość audytów SEO kończy się jako PDF, którego nikt nie wdraża. Pokazuję, dlaczego techniczna optymalizacja działa dopiero, gdy zalecenia zamieniają się w pull requesty, i jak zorganizować ten proces.

Maciej Sala

Maciej Sala

Founder Strivelab

30 maja 2026
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją

Zanim zaczniesz migrację, musisz wiedzieć dokąd. Matryca pięciu zmiennych (rozmiar serwisu, wydajność, e-commerce, model edycji treści, częstotliwość zmian) pokazuje, czy Twój następny stack to Astro, Next.js, czy nadal WordPress — zanim wydasz złotówkę na przepisywanie strony.

Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026