CI/CD na serwerze Linux Automatyzuje budowanie, testowanie i wdrażanie kodu przy każdej zmianie. Aby z niego skorzystać: wybierz narzędzie CI/CD (Jenkins, GitHub Actions, GitLab CI), przygotuj bezpieczny host Linux, podłącz repozytorium, napisz potok (plik YAML/Jenkins) i wdróż za pośrednictwem SSH lub Docker z funkcją wycofywania i monitorowania.
Jeśli po raz pierwszy konfigurujesz CI/CD na serwerze Linux, ten przewodnik przeprowadzi Cię przez podstawy, wybór narzędzi, architekturę, bezpieczeństwo i kompleksową konfigurację z wykorzystaniem Jenkinsa lub GitHub Actions. Poznasz sprawdzone w praktyce praktyki z rzeczywistych wdrożeń, a także strategie zerowego przestoju z wykorzystaniem Dockera i… Nginx.
Czym jest CI/CD na serwerze Linux?
CI/CD (Continuous Integration/Continuous Delivery) to proces automatycznego budowania, testowania i wdrażania oprogramowania po zmianach w kodzie. Na serwerze Linux CI/CD zazwyczaj obejmuje proces, który kompiluje aplikację, uruchamia testy, buduje obraz artefaktu lub kontenera, a następnie wdraża ją do środowiska testowego lub produkcyjnego za pośrednictwem… SSH, Docker lub Kubernetes.

Dlaczego warto używać CI/CD w systemie Linux?
Linux jest stabilny, bezpieczny i wszechobecny w infrastrukturze produkcyjnej. Bezproblemowo integruje się z Gitem, systemd, Dockerem i innymi systemami. Nginxi zapór sieciowych, co czyni go idealnym rozwiązaniem do niezawodnych, zautomatyzowanych wdrożeń. Dzięki CI/CD zespoły szybciej dostarczają oprogramowanie, zmniejszają liczbę błędów, standaryzują wydania i egzekwują testy – bez ręcznego przesyłania danych i doraźnych skryptów.
Wymagania wstępne i lista kontrolna środowiska
- Serwer Linux (zalecany Ubuntu 22.04+ lub Debian 12+) z dostępem sudo
- Repozytorium Git (GitHub, GitLab lub Bitbucket)
- Domena i SSL/TLS w przypadku obsługi ruchu sieciowego (Let's Encrypt)
- Skonfigurowano zaporę sieciową (UFW/iptables) i SSH Klawisze
- Opcjonalnie: Docker i Docker Compose w przypadku wdrożeń kontenerowych
- Wybrane narzędzie CI/CD: Jenkins, GitHub Actions (samodzielnie hostowany program uruchamiający) lub GitLab CI
Jak działa CI/CD w systemie Linux (architektura)
- Programista przekazuje kod do głównej gałęzi lub gałęzi wydania.
- Proces CI wyzwala i uruchamia testy jednostkowe/integracyjne.
- Pipeline buduje artefakt (binarny, zip) lub obraz Dockera.
- Krok CD wdraża na serwerze Linux: kopiuje pliki, uruchamia migracje, przeładowuje usługi i aktualizuje odwrotny serwer proxy.
- Monitorowanie i rejestrowanie stanu urządzenia w celu weryfikacji, z możliwością wycofania zmian w przypadku awarii.
Wybór narzędzia CI/CD
Wybór odpowiedniego narzędzia zależy od hosta repozytorium, umiejętności zespołu i wymagań dotyczących zgodności. Poniżej przedstawiamy najpopularniejsze opcje. CI/CD na serwerach Linux.
Jenkins (samodzielny hosting)
- Plusy: W pełni konfigurowalny, bogaty w wtyczki, działa wszędzie, świetny do złożonych potoków.
- Wady: Wymaga konserwacji, stosowania poprawek, tworzenia kopii zapasowych i audytu wtyczek.
- Najlepszy dla: Przedsiębiorstwa i zespoły potrzebujące kontroli lokalnej i zaawansowanej koordynacji.
GitHub Actions (samodzielnie hostowany Runner)
- Plusy: Natywny dla GitHub, oparty na YAML, duży rynek, łatwe sekrety management.
- Wady: Wymaga samodzielnego hostowania modułu uruchamiającego w celu wdrożenia w sieciach prywatnych.
- Najlepszy dla: Zespoły już korzystające z GitHub, które chcą mieć prostą ścieżkę wdrażania.
GitLab CI / CD
- Plusy: Wbudowany w GitLab, doskonała wizualizacja potoku, łatwe uruchamianie manage.
- Wady: Wymaga GitLab; należy wziąć pod uwagę kwestie licencjonowania w dużej skali.
- Najlepszy dla: Użytkownicy GitLab poszukujący jednej zintegrowanej platformy.
Krok po kroku: konfiguracja CI/CD na serwerze Linux
Utwórz użytkownika usługi, SSH Klucze i hartowanie
Uruchom te polecenia, aby utworzyć użytkownika wdrażania innego niż root, w razie potrzeby dodać dostęp do Dockera i przygotować SSH Klawisze. Aby zwiększyć bezpieczeństwo, wyłącz logowanie za pomocą hasła.
# Create user
sudo adduser ci
sudo usermod -aG sudo ci
# Optional: if using Docker
sudo usermod -aG docker ci
# Generate SSH key for CI (run as ci user)
sudo -u ci ssh-keygen -t ed25519 -C "ci@server"
# Harden SSH (disable password auth)
sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl reload ssh
# Allow only required ports (SSH, HTTP, HTTPS)
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enableZainstaluj Dockera i Nginx (Opcjonalne, ale zalecane)
Kontenery ujednolicają wdrożenia i zwiększają bezpieczeństwo wycofywania zmian. Nginx zapewnia zakończenie protokołu TLS i routing blue-green/canary.
# Docker (Ubuntu)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Nginx
sudo apt-get install -y nginx
sudo systemctl enable --now nginxOpcja A: Jenkins na Linuksie (Freestyle lub Jenkinsfile)
Zainstaluj Jenkinsa, połącz się z repozytorium i zdefiniuj potok. Trzymaj Jenkinsa za TLS i ogranicz dostęp administratora.
# Install Jenkins (Ubuntu LTS)
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc >/dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list >/dev/null
sudo apt-get update && sudo apt-get install -y openjdk-17-jdk jenkins
sudo systemctl enable --now jenkinsPrzykładowy plik Jenkinsfile dla aplikacji Dockerized z testami i etapem wdrożenia:
pipeline {
agent any
environment {
REGISTRY = "registry.example.com/myapp"
IMAGE = "${REGISTRY}:${env.GIT_COMMIT}"
}
stages {
stage('Checkout') { steps { checkout scm } }
stage('Build') { steps { sh 'docker build -t $IMAGE .' } }
stage('Test') { steps { sh 'pytest -q || npm test || true' } }
stage('Push') { steps { sh 'docker login -u $REG_USER -p $REG_PASS registry.example.com; docker push $IMAGE' } }
stage('Deploy') {
steps {
sh 'ssh -o StrictHostKeyChecking=no ci@prod.example.com "APP_IMAGE=$IMAGE bash -s" < deploy.sh'
}
}
}
post { failure { mail to: 'devops@example.com', subject: 'Build Failed', body: "Check Jenkins #${env.BUILD_NUMBER}" } }
}Opcja B: Akcje GitHub z samodzielnie hostowanym programem uruchamiającym
Zainstaluj program uruchamiający na serwerze Linux lub hoście kompilacji. Użyj sekretów repozytorium do przechowywania danych uwierzytelniających i ograniczenia uprawnień programu uruchamiającego.
# On the server as the ci user:
mkdir -p ~/actions-runner && cd ~/actions-runner
curl -o actions.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64-*.tar.gz
tar xzf actions.tar.gz
./config.sh --url https://github.com/ORG/REPO --token YOUR_TOKEN
./run.sh # or install as a servicePrzykładowy przepływ pracy polegający na tworzeniu, testowaniu i wdrażaniu aplikacji Node.js przy użyciu Dockera:
name: CI/CD
on:
push:
branches: [ "main" ]
jobs:
build-test-deploy:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install deps and test
run: npm ci && npm test
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Deploy
env:
IMAGE_SHA: ${{ github.sha }}
run: |
APP_IMAGE="myapp:${IMAGE_SHA}" bash ./deploy.shWdrożenia bez przestojów dzięki Dockerowi, Nginxi systemd
Niebiesko-zielony utrzymuje dwie wersje aktywne (niebieską i zieloną). Ruch zmienia się, gdy nowy kontener przejdzie kontrolę poprawności. Użyj Nginx bloki upstream i dowiązanie symboliczne lub zmienna wskazująca na aktywny port.
# /etc/nginx/conf.d/app.conf
upstream app_upstream {
server 127.0.0.1:8081; # blue
# server 127.0.0.1:8082; # green (toggle when ready)
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Przykładowy skrypt wdrożenia, który obraca kontenery i je ponownie ładuje Nginx po badaniu kontrolnym:
#!/usr/bin/env bash
set -euo pipefail
IMAGE="${APP_IMAGE:-myapp:latest}"
# Determine target port
CURRENT=$(grep -q "8081" /etc/nginx/conf.d/app.conf && echo "blue" || echo "green")
if [ "$CURRENT" = "blue" ]; then
NEW_PORT=8082
OLD_PORT=8081
else
NEW_PORT=8081
OLD_PORT=8082
fi
# Run new container
docker rm -f myapp_new || true
docker run -d --name myapp_new -p ${NEW_PORT}:3000 --health-cmd="curl -f http://localhost:3000/health || exit 1" \
--health-interval=10s --restart=always "$IMAGE"
# Wait for healthy
for i in {1..30}; do
STATUS=$(docker inspect --format='{{json .State.Health.Status}}' myapp_new | tr -d '"')
[ "$STATUS" = "healthy" ] && break
sleep 2
done
# Switch Nginx upstream
sudo sed -i "s/${OLD_PORT}/${NEW_PORT}/" /etc/nginx/conf.d/app.conf
sudo nginx -t && sudo systemctl reload nginx
# Replace old container
docker rm -f myapp_old || true
docker rename myapp_new myapp_oldNajlepsze praktyki w zakresie bezpieczeństwa i zgodności
- Zastosowanie SSH klucze (ed25519) i wyłącz logowanie hasłem; ogranicz użytkownika CI do najmniejszych uprawnień.
- Przechowuj sekrety w sejfie narzędzia CI (GitHub Secrets, Jenkins Credentials, GitLab Variables).
- Przypnij obrazy bazowe i zweryfikuj sumy kontrolne; skanuj obrazy za pomocą Trivy lub Grype.
- Włącz zaporę sieciową, fail2ban i automatyczne aktualizacje zabezpieczeń.
- Regularnie przeprowadzaj audyt i łataj narzędzia CI, usuwaj nieużywane wtyczki.
- Rejestruj i monitoruj za pomocą systemd-journald, Prometheus/Node Exporter i Nginx dzienniki dostępu.
- Postępuj zgodnie z normami CIS Benchmarks i wytycznymi OWASP ASVS dotyczącymi wzmacniania zabezpieczeń.
Monitorowanie, rejestry i wycofywanie zmian
- Kontrole stanu zdrowia: Udostępnij punkty końcowe /health; CI czeka na „zdrowie” przed przełączeniem ruchu.
- Obserwowalność: Użyj Prometheusa + Grafany lub managed APM (np. New Relic).
- Ustrukturyzowane logi: Wyślij do Loki/ELK w celu przeprowadzenia wyszukiwania i otrzymywania alertów.
- Cofnij: Zachowaj N-1 obrazów/tagów, poprzednie pliki .env i kopie zapasowe bazy danych; zautomatyzuj wycofywanie jako zadanie w ramach potoku.
Wskazówki dotyczące konkretnego stosu
node.js
- Użyj pamięci podręcznej npm z kluczami pamięci podręcznej CI, aby przyspieszyć kompilację.
- Użyj PM2 lub kontenera; unikaj instalacji globalnych w obrazach produkcyjnych.
- Uruchom npm ci w celu uzyskania powtarzalnych zależności i npm audit w CI.
PHP/Laravel lub WordPress
- Instalacja Composera –no-dev –optimize-autoloader w CI.
- Uruchom PHP artisan migruj bezpiecznie z kopiami zapasowymi; w przypadku WordPress, kontrola wersji wp-content (motyw/wtyczki, które posiadasz).
- Podawać przez Nginx + PHP-FPM; przeładuj PHP-FPM przy wdrażaniu w celu wyczyszczenia pamięci podręcznej kodów operacji.
Pythona/Django
- Utwórz zablokowany plik requirements.txt za pomocą pip-compile.
- Uruchom managePliki .py migrate i collectstatic na etapie CD.
- Użyj Gunicorn za Nginx; wstępnie załaduj aplikację i ustaw łagodny limit czasu, aby ponownie uruchomić się bez przestoju.
Rozwiązywanie problemów i typowe pułapki
- Przepustki rurociągowe, przerwy w aplikacji: Dodaj testy integracyjne/kontraktowe i kontrole stanu.
- Problemy z uprawnieniami: Upewnij się, że użytkownik CI jest właścicielem katalogów wdrażania i członkiem grupy Docker.
- Niestabilne kompilacje: Przypnij zależności, użyj powtarzalnych kompilacji i poprawnie buforuj.
- Wyciek tajemnic: Nigdy nie ukrywaj sekretów w logach, maskuj dane wyjściowe i regularnie zmieniaj dane uwierzytelniające.
- Przestój podczas wdrażania: Wprowadź niebiesko-zielony lub kanarkowy; unikaj ponownych uruchomień w miejscu bez sondowania gotowości.
Koszty, hosting i miejsce YouStable Pomaga
Do uruchomienia CI/CD w systemie Linux wymagane są niezawodne zasoby obliczeniowe, szybkie zasoby pamięci masowej i stabilne połączenie sieciowe. YouStableSerwery VPS i dedykowane z dyskami SSD zapewniają ochronę przed atakami DDoS za darmo SSLi pełny dostęp do roota idealny dla Jenkinsa, runnerów, Dockera i NginxNasz zespół wsparcia może udzielić Ci wskazówek dotyczących wzmacniania zabezpieczeń, tworzenia kopii zapasowych i dostrajania wydajności bez konieczności uzależniania się od konkretnego produktu.
FAQ
1. Jaki jest najłatwiejszy sposób skonfigurowania CI/CD na serwerze Linux?
Dla większości użytkowników GitHub najszybszą drogą jest GitHub Actions z samodzielnie hostowanym programem uruchamiającym. Zainstaluj program uruchamiający na serwerze Linux, przechowuj sekrety w GitHub i napisz przepływ pracy w formacie YAML do kompilacji, testowania i wdrażania za pośrednictwem Dockera lub… SSH.
2. Który z narzędzi, Jenkins czy GitHub Actions, jest lepszy w przypadku wdrożeń Linux?
Jenkins oferuje głęboką personalizację i kontrolę lokalną, idealną dla złożonych potoków. GitHub Actions jest prostszy, ściśle zintegrowany z GitHubem i idealny dla większości zespołów. Jeśli potrzebujesz ścisłej izolacji i niestandardowych agentów, wybierz Jenkinsa; jeśli zależy Ci na szybkości i prostocie, wybierz Actions.
3. Jak osiągnąć wdrożenia bez przestojów w systemie Linux?
Stosuj strategie niebiesko-zielone lub kanarkowe z Dockerem i NginxUruchom nową wersję na innym porcie, sprawdź jej stan i przełącz Nginx upstream i wycofaj stary kontener. Zawsze miej pod ręką obraz przywracania i kopię zapasową bazy danych.
4. Jak przechowywać i manage sekrety w CI/CD?
Wykorzystaj sekrety swojego narzędzia CI manager (GitHub Secrets, Jenkins Credentials, GitLab Variables). Nie zapisuj sekretów na stałe w kodzie ani obrazach. Regularnie wymieniaj tokeny, ogranicz zakres uprawnień i maskuj sekrety w logach.
5. Czy mogę używać CI/CD dla WordPressa na serwerze Linux?
TakKontroluj wersje swojego motywu i niestandardowych wtyczek, uruchamiaj automatyczne testy (PHPJednostka, linting), tworzenie zasobów i wdrażanie za pośrednictwem SSH lub Docker. Użyj Nginx + PHP-FPM, przeładuj PHP-FPM po wydaniu oraz wykonaj kopię zapasową bazy danych i przesłanych danych przed uruchomieniem aktualizacji lub migracji.
Przeczytaj także: