W Imperium Rzymskim istniał cursus publicus — system dróg i stacji pocztowych zapewniający szybki transport wiadomości i towarów po całym Imperium. Współczesnym odpowiednikiem jest CI/CD (Continuous Integration / Continuous Deployment) — automatyczny system, który buduje, testuje i wdraża naszą aplikację.
1const cicdDefinicje = {
2 CI: {
3 nazwa: 'Continuous Integration',
4 opis: 'Automatyczne budowanie i testowanie kodu po każdym push',
5 analogia: 'Inspekcja legionów przed wyprawą',
6 },
7 CD_Delivery: {
8 nazwa: 'Continuous Delivery',
9 opis: 'Automatyczne przygotowanie do wdrożenia (wymaga ręcznego zatwierdzenia)',
10 analogia: 'Legion gotowy do wymarszu — czeka na rozkaz Cesarza',
11 },
12 CD_Deployment: {
13 nazwa: 'Continuous Deployment',
14 opis: 'Automatyczne wdrożenie na produkcję po przejściu testów',
15 analogia: 'Legion wyrusza automatycznie gdy jest gotowy',
16 },
17};GitHub Actions to platforma CI/CD wbudowana w GitHub. Konfigurujemy ją plikami YAML w katalogu
.github/workflows/.1const githubActionsConcepts = {
2 workflow: 'Cały proces CI/CD (plik YAML)',
3 trigger: 'Wydarzenie uruchamiające workflow (push, PR)',
4 job: 'Zestaw kroków wykonywanych na jednym runner',
5 step: 'Pojedyncza akcja w job (checkout, test, build)',
6 runner: 'Maszyna wykonująca job (ubuntu-latest)',
7 action: 'Gotowy krok wielokrotnego użytku (actions/checkout)',
8 secret: 'Bezpieczna zmienna (hasła, klucze API)',
9};Stwórzmy kompletny workflow CI:
1# .github/workflows/ci.yml
2name: Roman Imperium CI
3
4on:
5 push:
6 branches: [main, develop]
7 pull_request:
8 branches: [main]
9
10env:
11 NODE_VERSION: '20'
12
13jobs:
14 # ===========================================
15 # Job 1: Lint i Formatowanie
16 # ===========================================
17 lint:
18 name: Inspekcja Kodu
19 runs-on: ubuntu-latest
20 steps:
21 - name: Checkout kodu
22 uses: actions/checkout@v4
23
24 - name: Setup Node.js
25 uses: actions/setup-node@v4
26 with:
27 node-version: 20
28 cache: 'yarn'
29
30 - name: Instalacja zależności
31 run: yarn install --frozen-lockfile
32
33 - name: Linting
34 run: yarn lint
35
36 - name: Sprawdź formatowanie
37 run: yarn format:check
38
39 # ===========================================
40 # Job 2: Testy
41 # ===========================================
42 test:
43 name: Testy Jednostkowe
44 runs-on: ubuntu-latest
45 needs: lint
46 steps:
47 - name: Checkout kodu
48 uses: actions/checkout@v4
49
50 - name: Setup Node.js
51 uses: actions/setup-node@v4
52 with:
53 node-version: 20
54 cache: 'yarn'
55
56 - name: Instalacja zależności
57 run: yarn install --frozen-lockfile
58
59 - name: Uruchom testy
60 run: yarn test --coverage
61
62 - name: Upload coverage
63 uses: actions/upload-artifact@v4
64 with:
65 name: coverage-report
66 path: coverage/
67
68 # ===========================================
69 # Job 3: Build
70 # ===========================================
71 build:
72 name: Budowanie Aplikacji
73 runs-on: ubuntu-latest
74 needs: test
75 steps:
76 - name: Checkout kodu
77 uses: actions/checkout@v4
78
79 - name: Setup Node.js
80 uses: actions/setup-node@v4
81 with:
82 node-version: 20
83 cache: 'yarn'
84
85 - name: Instalacja zależności
86 run: yarn install --frozen-lockfile
87
88 - name: Build
89 run: yarn build
90
91 - name: Upload build
92 uses: actions/upload-artifact@v4
93 with:
94 name: dist
95 path: dist/
96
97 # ===========================================
98 # Job 4: Docker Build & Push
99 # ===========================================
100 docker:
101 name: Docker Image
102 runs-on: ubuntu-latest
103 needs: build
104 if: github.ref == 'refs/heads/main'
105 steps:
106 - name: Checkout kodu
107 uses: actions/checkout@v4
108
109 - name: Login do Docker Hub
110 uses: docker/login-action@v3
111 with:
112 username: imperator
113 password: roma_secret_token
114
115 - name: Build i push obrazu
116 uses: docker/build-push-action@v5
117 with:
118 context: .
119 push: true
120 tags: |
121 imperator/roman-imperium:latest
122 imperator/roman-imperium:1.0.0Hasła i klucze API przechowujemy jako GitHub Secrets:
1# Użycie sekretów w workflow
2- name: Login do Docker Hub
3 uses: docker/login-action@v3
4 with:
5 username: imperator_username
6 password: docker_hub_token
7
8- name: Deploy
9 env:
10 DATABASE: db_connection_string
11 JWT_SECRET: jwt_secret_keySekrety konfigurujemy w ustawieniach repozytorium: Settings > Secrets and variables > Actions.
1const branchStrategy = {
2 main: 'Produkcja — deploy automatyczny po merge',
3 develop: 'Development — CI bez deploy',
4 'feature/*': 'Nowe funkcje — CI na pull request',
5 'hotfix/*': 'Poprawki krytyczne — szybki deploy na produkcję',
6};CI/CD to cursus publicus naszego Imperium — automatyzuje transport kodu od developera do produkcji, zapewniając że każda zmiana jest przetestowana i bezpieczna.