Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

CI/CD z GitHub Actions — Cursus Publicus

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ę.

Czym jest CI/CD?

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 — Podstawy

GitHub Actions to platforma CI/CD wbudowana w GitHub. Konfigurujemy ją plikami YAML w katalogu

.github/workflows/
.

Kluczowe pojęcia

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};

Workflow CI dla NestJS

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.0

Sekrety w GitHub Actions

Hasł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_key

Sekrety konfigurujemy w ustawieniach repozytorium: Settings > Secrets and variables > Actions.

Strategia branchowania

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.

Przejdź do CodeWorlds