Przejdź do głównej zawartości

CI/CD dla małego projektu webowego - idea i mini-pipeline

Co przekazesz słuchaczom?

Po tej prezentacji słuchacze będą w stanie:

  • Zrozumiec różnicę miedzy CI a CD
  • Wiedzieć dlaczego automatyzacja jest ważna
  • Zaprojektowac prosty pipeline dla projektu webowego
  • Zrozumiec podstawowe etapy: lint, test, build, deploy
  • Unikac typowych błędów (np. sekrety w repo)
  1. Wprowadzenie (2 min)

    • Co to jest CI/CD i dlaczego warto
    • Problem: “reczne wdrazanie jest meczace i podatne na błędy”
    • Historia: od ręcznego deploy do automatyzacji
  2. CI - Continuous Integration (3 min)

    • Automatyczne sprawdzanie jakosci
    • Lint, testy, build
    • Kiedy uruchamiać (push, PR)
  3. CD - Continuous Delivery/Deployment (2 min)

    • Automatyczne wdrazanie
    • Środowiska: dev, staging, production
    • Różnica: Delivery vs Deployment
  4. Mini-pipeline w praktyce (3 min)

    • Przykład dla prostego projektu
    • GitHub Actions / GitLab CI
    • Sekrety i bezpieczeństwo
  5. Podsumowanie (2 min)

    • Korzyści z CI/CD
    • Pytania i dyskusja

Continuous Integration - automatyczne sprawdzanie jakosci kodu przy każdej zmianie.

Co robi:

  • Uruchamia testy automatyczne
  • Sprawdza formatowanie kodu (lint)
  • Buduje aplikacje
  • Sprawdza czy kod się kompiluje

Kiedy: Przy każdym pushu lub Pull Request

Bez CI/CD

  • Reczne uruchamianie testow
  • “U mnie działa” - błędy na produkcji
  • Długie deploy przez FTP
  • Strach przed zmianami
  • Konflikty przy merge

Z CI/CD

  • Automatyczne testy przy każdym pushu
  • Szybkie wykrywanie błędów
  • Deploy jednym kliknieciem
  • Pewnosc jakosci
  • Czeste, małe zmiany

Typowy pipeline CI/CD

EtapCo robiPrzykład
1. CheckoutPobiera kod z repogit clone
2. InstallInstaluje zależnościnpm install, composer install
3. LintSprawdza formatowanieeslint, phpcs
4. TestUruchamia testyphpunit, jest
5. BuildBuduje aplikacjenpm run build, webpack
6. DeployWdraza na serwerrsync, ssh, docker
+--------+ +--------+ +--------+ +--------+ +--------+
| Commit | -> | Lint | -> | Test | -> | Build | -> | Deploy |
+--------+ +--------+ +--------+ +--------+ +--------+
| | | | |
v v v v v
[Git] [ESLint] [PHPUnit] [Webpack] [Serwer]
Jeśli ktorys etap FAIL --> Pipeline STOP --> Powiadomienie
+----------------+ +----------------+ +----------------+
| Development | -> | Staging | -> | Production |
+----------------+ +----------------+ +----------------+
| - Lokalne | | - Kopia prod | | - Użytkownicy |
| - Testy dev | | - Testy QA | | - Realne dane |
| - Szybkie zmiany | - Pre-release | | - Stabilnosc |
+----------------+ +----------------+ +----------------+
on: push # Kiedy uruchomić
jobs:
test: # Nazwa job
runs-on: ubuntu-latest
steps:
- Checkout # Pobierz kod
- Install # Zainstaluj zależności
- Lint # Sprawdz formatowanie
- Test # Uruchom testy
- Build # Zbuduj aplikacje
- Deploy # Wdraz (opcjonalnie)
.github/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install
- name: Run linter
run: composer run lint
- name: Run tests
run: composer run test
.github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: |
composer install
composer run test
deploy:
needs: test # Czekaj na testy
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Deploy to server
env:
SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
echo "$SSH_KEY" > key.pem
chmod 600 key.pem
rsync -avz -e "ssh -i key.pem" ./public/ user@server:/var/www/app/
.gitlab-ci.yml
stages:
- test
- build
- deploy
test:
stage: test
script:
- composer install
- composer run lint
- composer run test
build:
stage: build
script:
- npm install
- npm run build
artifacts:
paths:
- dist/
deploy:
stage: deploy
only:
- main
script:
- rsync -avz dist/ user@server:/var/www/app/
# DOBRZE - uzywanie sekretow
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
# ZLE - nigdy nie rob tego!
env:
DATABASE_URL: "mysql://user:password@localhost/db" # NIEBEZPIECZNE!
API_KEY: "sk-1234567890abcdef" # NIEBEZPIECZNE!
#!/bin/bash
# deploy.sh - prosty skrypt deploymentu
echo "Starting deployment..."
# 1. Pobierz najnowszy kod
git pull origin main
# 2. Zainstaluj zależności
composer install --no-dev
# 3. Zbuduj assety
npm run build
# 4. Wyczysc cache
php artisan cache:clear
# 5. Uruchom migracje
php artisan migrate --force
echo "Deployment complete!"

Wymagania minimalne:

  • Wyjaśnienie CI i CD (różnica)
  • Pokazanie 1 schematu pipeline
  • Podanie 2 przykładów kontroli jakosci (lint, test)
  • Omowienie dlaczego automatyzacja jest ważna
Ocena: 3.0 (minimum)

Co sprawdzić przy konfiguracji?

  1. Czy pipeline uruchamia się automatycznie?
  2. Czy testy sa uruchamiane przed deploy?
  3. Czy sekrety sa przechowywane bezpiecznie?
  4. Czy pipeline FAIL zatrzymuje deploy?
  5. Czy jest powiadomienie o błędach?
  6. Czy można łatwo zrobic rollback?
  7. Czy dokumentacja jest aktualna?
  8. Czy środowisko staging jest podobne do prod?

Sekrety i tokeny

NIGDY nie wrzucaj do repozytorium:

  • Haseł i tokenow API
  • Kluczy SSH
  • Plikow .env z produkcyjnymi danymi
  • Certyfikatow SSL
  • Connection stringow do baz danych

Uzywaj:

  • GitHub Secrets / GitLab CI Variables
  • Vault (HashiCorp)
  • Environment variables na serwerze
  • .gitignore dla plikow wrazliwych

Pytanie 1

Czym rozni się Continuous Delivery od Continuous Deployment?

Pytanie 2

Co się stanie jeśli test FAIL w środku pipeline?

Pytanie 3

Dlaczego sekrety nie powinny być w kodzie?

Pytanie 4

Jak zrobic rollback jeśli deploy się nie udał?

Zalety:

  • Zintegrowane z GitHub
  • Darmowe dla publicznych repo
  • Duży marketplace akcji
  • Łatwy start

Dla kogo: Projekty na GitHub