Continuous Integration z Jenkins

TL;DR: Jenkins to najpopularniejsze narzędzie CI/CD, które automatyzuje budowanie, testowanie i deployment aplikacji. W tym artykule dowiesz się jak skonfigurować podstawowy pipeline CI dla projektu Java z Maven.

Dlaczego Continuous Integration jest ważne

W 2016 roku coraz więcej zespołów programistycznych odkrywa korzyści z automatyzacji procesów deweloperskich. Continuous Integration (CI) eliminuje ręczne budowanie aplikacji i pozwala wykrywać błędy już na etapie commitowania kodu do repozytorium.

Bez CI zespoły często spotykają się z problemem „works on my machine” – kod działa lokalnie, ale nie na serwerze produkcyjnym.

Co się nauczysz:

  • Jak zainstalować i skonfigurować Jenkins
  • Tworzenie pierwszego job’a CI dla projektu Java
  • Integracja z Git i Maven
  • Konfiguracja automatycznych testów
  • Podstawowe praktyki bezpieczeństwa Jenkins
Wymagania wstępne: Podstawowa znajomość Java, Maven, Git. Doświadczenie z pracą w zespole programistycznym mile widziane.

Czym jest Continuous Integration

Continuous Integration to praktyka programistyczna, gdzie developerzy regularnie (kilka razy dziennie) integrują swój kod z główną gałęzią projektu. Każda integracja jest weryfikowana przez automatyczne buildy i testy.

Continuous Integration – automatyczny proces który buduje, testuje i weryfikuje kod po każdym commit do repozytorium

Korzyści z CI

Problem bez CIRozwiązanie z CI
Błędy wykrywane po tygodniachBłędy wykrywane w ciągu minut
Ręczne budowanie na różnych środowiskachJednolite, automatyczne buildy
Konflicty przy mergowaniu koduCzęste, małe integracje
Niepewność czy kod działaNatychmiastowy feedback

Dlaczego Jenkins

Jenkins powstał w 2011 roku (jako fork Hudson) i szybko stał się standardem w świecie CI. W 2016 roku to najdojrzalsze i najbardziej elastyczne rozwiązanie na rynku.

Zalety Jenkins

  • Open source – darmowy i z otwartym kodem
  • Bogaty ekosystem pluginów – ponad 1000 pluginów dostępnych
  • Wsparcie dla wszystkich głównych SCM – Git, SVN, Mercurial
  • Distributed builds – możliwość uruchamiania buildów na wielu maszynach
  • REST API – pełna kontrola programistyczna

Instalacja Jenkins

### Wymagania systemowe

Uwaga: Jenkins wymaga Java 7 lub nowszej. Zalecane jest użycie Oracle JDK 8.
# Sprawdzenie wersji Java
java -version

# Powinno pokazać coś takiego:
# java version "1.8.0_112"
# Java(TM) SE Runtime Environment (build 1.8.0_112-b15)

### Instalacja na Windows

  1. Pobierz jenkins.msi z oficjalnej strony
  2. Uruchom installer jako Administrator
  3. Wybierz port (domyślnie 8080)
  4. Ustaw Jenkins jako Windows Service

### Instalacja na Linux (Ubuntu/Debian)

# Dodanie klucza Jenkins
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -

# Dodanie repozytorium
echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

# Instalacja
sudo apt-get update
sudo apt-get install jenkins

# Uruchomienie
sudo systemctl start jenkins
sudo systemctl enable jenkins

Pierwsza konfiguracja

Po instalacji Jenkins jest dostępny pod adresem http://localhost:8080.

Unlock Jenkins

# Odczytanie hasła początkowego
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# Na Windows znajdziesz hasło w:
# C:\Program Files (x86)\Jenkins\secrets\initialAdminPassword

Instalacja pluginów

Pro tip: Wybierz „Install suggested plugins” – zawiera wszystkie niezbędne pluginy dla podstawowej pracy z Jenkins.

Sugerowane pluginy dla projektów Java:
– **Git Plugin** – integracja z Git
– **Maven Integration Plugin** – wsparcie dla Maven
– **JUnit Plugin** – raporty z testów
– **Email Extension Plugin** – powiadomienia email

### Tworzenie administratora

Utwórz konto administratora z silnym hasłem. Unikaj używania konta „admin” w środowisku produkcyjnym.

Pierwszy projekt – Maven + Git

### Przygotowanie projektu

Załóżmy że mamy prosty projekt Maven z testami:




    4.0.0
    
    com.example
    jenkins-demo
    1.0-SNAPSHOT
    jar
    
    
        1.8
        1.8
        4.12
    
    
    
        
            junit
            junit
            ${junit.version}
            test
        
    
    
    
        
            
                org.apache.maven.plugins
                maven-surefire-plugin
                2.19.1
            
        
    

### Tworzenie Job’a w Jenkins

  1. Kliknij „New Item” w lewym menu
  2. Wpisz nazwę projektu: jenkins-demo
  3. Wybierz „Maven project”
  4. Kliknij „OK”

### Konfiguracja Source Code Management

Repository URL: https://github.com/twojusername/jenkins-demo.git
Branch Specifier: */master
Uwaga: Jeśli używasz prywatnego repozytorium, musisz skonfigurować credentials w Jenkins.

### Build Triggers

Najważniejsze opcje:
– **Poll SCM** – sprawdza repozytorium co X minut
– **GitHub hook trigger** – buduje natychmiast po push

# Poll SCM - sprawdzenie co 5 minut
H/5 * * * *

# Cron syntax:
# Minuta (0-59)
# Godzina (0-23) 
# Dzień miesiąca (1-31)
# Miesiąc (1-12)
# Dzień tygodnia (0-7, gdzie 0 i 7 = niedziela)

### Build Configuration

W sekcji „Build”:
– **Root POM**: pom.xml
– **Goals and options**: clean compile test

### Post-build Actions

  • Publish JUnit test result report
    • Test report XMLs: target/surefire-reports/*.xml
  • Archive the artifacts
    • Files to archive: target/*.jar
  • E-mail Notification
    • Recipients: team@example.com

Pierwszy Build

Po zapisaniu konfiguracji, kliknij „Build Now” w lewym menu.

### Monitorowanie buildu

  1. Kliknij na numer buildu (np. #1)
  2. Wybierz „Console Output” żeby zobaczyć logi
  3. Sprawdź czy build zakończył się sukcesem (niebieski kolor)
# Przykładowy output z udanego buildu
[INFO] Scanning for projects...
[INFO] Building jenkins-demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ jenkins-demo ---
[INFO] Deleting target
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ jenkins-demo ---
[INFO] Compiling 1 source file to target/classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ jenkins-demo ---
[INFO] Running com.example.CalculatorTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

Konfiguracja powiadomień

### Email notifications

Jenkins może wysyłać powiadomienia gdy:
– Build się nie powiedzie
– Build zostanie naprawiony
– Build jest niestabilny (testy przechodzą ale są warnings)

# Konfiguracja SMTP w "Manage Jenkins" > "Configure System"
SMTP server: smtp.gmail.com
Use SMTP Authentication: ✓
Username: jenkins@yourcompany.com
Password: [app password]
Use SSL: ✓
SMTP port: 465

### Slack integration

Jeśli używasz Slack (bardzo popularny w 2016), zainstaluj „Slack Notification Plugin”:

  1. „Manage Jenkins” > „Manage Plugins”
  2. „Available” > znajdź „Slack Notification Plugin”
  3. Zainstaluj i restartuj Jenkins

Bezpieczeństwo Jenkins

Uwaga: Domyślnie Jenkins może być dostępny dla wszystkich. To ogromne zagrożenie bezpieczeństwa!

### Podstawowe zabezpieczenia

  1. Enable security w „Manage Jenkins” > „Configure Global Security”
  2. Wybierz „Jenkins’ own user database”
  3. Odznacz „Allow users to sign up”
  4. Ustaw „Matrix-based security”

### Uprawnienia użytkowników

RolaUprawnieniaZastosowanie
AdminAdministerPełna kontrola systemu
DeveloperRead, Build, CancelUruchamianie buildów
ViewerReadTylko podgląd wyników

Distributed Builds

W większych zespołach jeden serwer Jenkins może nie wystarczyć. Jenkins pozwala na konfigurację slave nodes.

### Konfiguracja Slave Node

  1. „Manage Jenkins” > „Manage Nodes”
  2. „New Node” > wpisz nazwę i wybierz „Permanent Agent”
  3. Skonfiguruj:
    • Remote root directory: /home/jenkins
    • Launch method: „Launch slave agents via SSH”
    • Host: IP adres slave machine

Praktyczne wskazówki

### Optymalizacja buildów

Pro tip: Używaj maven dependency plugin żeby cache’ować dependencies między buildami.


    org.apache.maven.plugins
    maven-dependency-plugin
    2.10
    
        
            copy-dependencies
            package
            
                copy-dependencies
            
        
    

### Workspace cleanup

# Dodaj jako Post-build action - Execute shell
echo "Cleaning workspace..."
rm -rf target/
git clean -fdx

### Build parametrization

Jenkins pozwala na parametryzowanie buildów:

  1. Zaznacz „This project is parameterized”
  2. Dodaj parametr typu „Choice Parameter”:
    • Name: ENVIRONMENT
    • Choices: dev, test, prod
  3. Użyj w Maven goals: -Dspring.profiles.active=${ENVIRONMENT}

Rozwiązywanie problemów

### Najczęstsze błędy

Pułapka: „Unable to find Java” – Jenkins nie może znaleźć Java JDK.

**Rozwiązanie**: Skonfiguruj JDK w „Manage Jenkins” > „Global Tool Configuration”:

Name: JDK 8
JAVA_HOME: /usr/lib/jvm/java-8-oracle
# lub na Windows: C:\Program Files\Java\jdk1.8.0_112

### Git authentication issues

# Jeśli masz problemy z Git authentication:
# 1. Dodaj SSH key dla Jenkins user
sudo su - jenkins
ssh-keygen -t rsa -b 4096 -C "jenkins@yourcompany.com"

# 2. Dodaj public key do GitHub/GitLab
cat ~/.ssh/id_rsa.pub

### Memory issues

# Zwiększenie heap size dla Jenkins
# W /etc/default/jenkins dodaj:
JAVA_ARGS="-Xmx2048m -XX:MaxPermSize=512m"

# Restart Jenkins
sudo systemctl restart jenkins
Czy Jenkins może budować inne języki niż Java?

Tak! Jenkins obsługuje praktycznie wszystkie języki programowania. Ma pluginy dla .NET, Python, Ruby, PHP, Node.js i wielu innych. Wystarczy zainstalować odpowiedni plugin i skonfigurować narzędzia build’owe.

Jak często powinniśmy budować projekt?

Najlepiej przy każdym commit do repozytorium. Jeśli to za dużo obciąża serwer, można ustawić polling co 5-15 minut. Ważne żeby buildy były częste – wykrywamy błędy szybciej.

Czy mogę używać Jenkins za darmo w firmie?

Tak, Jenkins jest w pełni darmowy i open source. Nie ma ograniczeń na użycie komercyjne. CloudBees oferuje płatne wsparcie enterprise, ale sama aplikacja jest zawsze darmowa.

Co robić gdy build trwa zbyt długo?

Można: 1) Użyć distributed builds (slave nodes), 2) Cache’ować dependencies Maven, 3) Uruchamiać testy równolegle, 4) Wykluczyć długie integration testy z podstawowego buildu i uruchamiać je nocą.

Jak zabezpieczyć Jenkins przed atakami?

Podstawy: 1) Włącz autoryzację i authentication, 2) Nie wystawiaj Jenkins na internet bez reverse proxy, 3) Regularnie aktualizuj Jenkins i pluginy, 4) Używaj HTTPS, 5) Ogranicz uprawnienia użytkowników do minimum.

Czy mogę deployować aplikacje przez Jenkins?

Tak! To nazywa się Continuous Deployment (CD). Można skonfigurować automatyczny deploy na środowiska testowe po udanym build, a na produkcję po ręcznym zatwierdzeniu. Użyj pluginów jak Deploy to container lub SSH.

Jak monitorować Jenkins w produkcji?

Warto monitorować: 1) Czas buildów (czy nie wydłużają się), 2) Success rate projektów, 3) Wykorzystanie zasobów serwera, 4) Liczbę pending jobs. Jenkins ma wbudowane monitoring w „Manage Jenkins” > „System Information”.

Następne kroki:

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz projekt Maven z prostą klasą Calculator (dodawanie, odejmowanie) i testami JUnit. Skonfiguruj Jenkins job który będzie budować projekt po każdym commit i wysyłać powiadomienie email o wyniku. Bonus: dodaj parametr build’a który pozwoli wybrać poziom logowania.

Continuous Integration to fundament profesjonalnego software development. Jenkins w 2016 roku to najlepsze narzędzie do tego celu – darmowe, stabilne i z ogromną społecznością. Jakie jest Twoje doświadczenie z Jenkins? Masz jakieś ciekawe konfiguracje do podzielenia się?

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry