Continuous integration / deployment
Piotr Woszczyk @ 2019
CI - co to?
Praktyka częstego integrowania nowego kodu z dotychczasowym. Każdorazowo poprzedzona weryfikacją automatyczną.
Przygotowanie
- Odpowiednie przygotowanie zespołu (proces ważniejszy niż narzędzia)
- Repozytorium o odpowiedniej strukturze (gitflow)
- Częste (min. codzienne) przesyłanie kodu do repozytorium
Jak?
- Programista commituje kod w separowanym (feature / bugfix) branch'u
- Programista przesyła commit do usługi zarządzającej repozytorium (np. Stash)
- Usługa informuje serwer CI lub serwer CI cyklicznie odpytuje usługę o zmianach
- Serwer CI wykonuje testy i/lub buduje aplikacje
- Serwer CI może udostępnić efekt budowania
- Serwer CI przesyła informacje o (nie)powodzeniu, która decyduje o możliwości dołączenia nowego kodu

Narzędzia
- Usługa zarządzająca repozytorium
- GitHub
- GitLab
- Bitbucket / Stash
- Serwer CI
- Jenkins
- Travis, CircleCI, Bamboo, etc.
- Cloud, np. AWS CodePipeline
- Oprogramowanie testujące
- Codacy, SonarCube, linters
- phpmd, php-cs-fixer, phpunit
- JUnit i inne specyficzne dla języka
Jakie testy?
- Statyczna analiza kodu
- Weryfikacja błędów składniowych i semantycznych
- Weryfikacja jakości kodu, np. złożoność klas, długość metod
- Określenie podatności w zewnętrznych bibliotekach
- Formatowanie
- Testy jednostkowe
- Budowanie aplikacji (pobieranie zależności / kompilowanie)
version: 2.1
commands:
preparation:
description: "Enviroment preparation"
steps:
- run: apt-get update && apt-get install -y ssh rsync git unzip
- run: mkdir ~/.ssh
- run: ssh-keyscan github.com >> ~/.ssh/known_hosts
- run: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- run: composer config --global --auth github-oauth.github.com $GITHUBTOKEN
jobs:
build-job:
docker:
- image: php:7.1-fpm
working_directory: ~
steps:
- checkout
- preparation
- restore_cache:
keys:
- composer
- run: composer install --no-progress --ignore-platform-reqs --no-scripts
- run: vendor/bin/php-cs-fixer fix -q --rules=@PSR2 --dry-run src
- run: vendor/bin/phpmd src/ --exclude src/AdminBundle/Entity,src/MachineBundle/Entity --suffixes php text cleancode,codesize,controversial,design,unusedcode
- save_cache:
key: composer
paths:
- ~/.composer/cache/files
workflows:
version: 2
build-deploy:
jobs:
- build-jobKorzyści?
- Możliwość wyłapywania błędów przed ich wystąpieniem
- Szybsza naprawa błędów (precyzyjnie wskazane miejsce wystąpienia)
- Zwiększenie bezpieczeństwa
- Poprawa czytelności kodu
- Skrócenie procesu wprowadzania nowych zmian
Continuous Deployment
Praktyka częstego i automatycznego publikowania aplikacji. Ma za zadanie przyśpieszenie procesu wprowadzania zmian aby mogły pojawiać się mniejszymi partiami. Ważną składową jest zachowanie aplikacji w ciągłej gotowości do publikacji.
Continuous Deployment jest rozszerzeniem procesu Continuous Delivery o automatyczną publikację nowej wersji.
Jak?
- Do wybranej gałęzi trafia nowy commit (np. w wyniku merge feature branch do master).
- Usługa zarządzająca repozytorium informuje serwer CD lub serwer CD cyklicznie odpytuje usługę o zmianach
- Serwer CD pobiera kod i zależności oraz buduje aplikację
- Serwer CD uruchamia testy akceptacyjne
- Serwer CD umieszcza aplikacje w właściwym środowisku
- Serwer CD informuje o (nie)powodzeniu procesu
Narzędzia
- Usługa zarządzająca repozytorium
- Serwer CD
- Oprogramowanie testujące
- Cucumber (Behat)
- Selenium
- jMeter
- Hosting
- SCP, FTP
- rsync
- Magallanes
- Docker Hub, AWS ECR
- Azure Web Apps
- App Store, Google Play
Publikacja - rsync
version: 2.1
commands:
preparation:
description: "Enviroment preparation"
steps:
- run: apt-get update && apt-get install -y ssh rsync git unzip
- run: mkdir ~/.ssh
- run: ssh-keyscan github.com >> ~/.ssh/known_hosts
- run: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- run: composer config --global --auth github-oauth.github.com $GITHUBTOKEN
jobs:
deploy-job:
docker:
- image: php:7.1-fpm
working_directory: ~
steps:
- checkout
- preparation
- run: composer install --no-progress --ignore-platform-reqs --no-scripts
- run: ssh-keyscan makolab.pl >> ~/.ssh/known_hosts
- run: rsync --delete --compress --archive --exclude 'app/config/parameters.yml' --exclude 'var/*' --exclude 'web/public/*' * user@makolab.pl:/usr/share/nginx/html/
- run: ssh user@makolab.pl 'bash -v -s' < .circleci/deploy.sh
workflows:
version: 2
build-deploy:
jobs:
- deploy-job:
filters:
branches:
only: masterKorzyści
- Wyłapywanie błędów przed publikacją
- Możliwość publikowania historycznych oraz przyszłych wersji
- Automatyzacja powtarzalnego procesu, oszczędność czasu
- Czytelność i standaryzacja zasad publikacji
- Powtarzalność publikacji
- Zwiekszenie bezpieczeństwa (ograniczenie dostępu)
Do poduszki
https://martinfowler.com/articles/continuousIntegration.html
Pytania?
Podstawy CI & CD
By Piotr Woszczyk
Podstawy CI & CD
Prezentacja opisująca zasady działania procesów continuous integration i delivery.
- 57