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.
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
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.
Korzyści z CI
Problem bez CI | Rozwiązanie z CI |
---|---|
Błędy wykrywane po tygodniach | Błędy wykrywane w ciągu minut |
Ręczne budowanie na różnych środowiskach | Jednolite, automatyczne buildy |
Konflicty przy mergowaniu kodu | Częste, małe integracje |
Niepewność czy kod działa | Natychmiastowy 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
# 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
- Pobierz jenkins.msi z oficjalnej strony
- Uruchom installer jako Administrator
- Wybierz port (domyślnie 8080)
- 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
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
- Kliknij „New Item” w lewym menu
- Wpisz nazwę projektu: jenkins-demo
- Wybierz „Maven project”
- Kliknij „OK”
### Konfiguracja Source Code Management
Repository URL: https://github.com/twojusername/jenkins-demo.git Branch Specifier: */master
### 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
- Kliknij na numer buildu (np. #1)
- Wybierz „Console Output” żeby zobaczyć logi
- 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”:
- „Manage Jenkins” > „Manage Plugins”
- „Available” > znajdź „Slack Notification Plugin”
- Zainstaluj i restartuj Jenkins
Bezpieczeństwo Jenkins
### Podstawowe zabezpieczenia
- Enable security w „Manage Jenkins” > „Configure Global Security”
- Wybierz „Jenkins’ own user database”
- Odznacz „Allow users to sign up”
- Ustaw „Matrix-based security”
### Uprawnienia użytkowników
Rola | Uprawnienia | Zastosowanie |
---|---|---|
Admin | Administer | Pełna kontrola systemu |
Developer | Read, Build, Cancel | Uruchamianie buildów |
Viewer | Read | Tylko 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
- „Manage Jenkins” > „Manage Nodes”
- „New Node” > wpisz nazwę i wybierz „Permanent Agent”
- Skonfiguruj:
- Remote root directory: /home/jenkins
- Launch method: „Launch slave agents via SSH”
- Host: IP adres slave machine
Praktyczne wskazówki
### Optymalizacja buildów
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:
- Zaznacz „This project is parameterized”
- Dodaj parametr typu „Choice Parameter”:
- Name: ENVIRONMENT
- Choices: dev, test, prod
- Użyj w Maven goals: -Dspring.profiles.active=${ENVIRONMENT}
Rozwiązywanie problemów
### Najczęstsze błędy
**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
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.
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.
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.
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ą.
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.
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.
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”.
Przydatne zasoby:
- Oficjalna dokumentacja Jenkins
- Lista wszystkich pluginów
- Jenkins Pipeline Documentation
- Jenkins na GitHub
🚀 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ę?