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?

  1. Programista commituje kod w separowanym (feature / bugfix) branch'u
  2. Programista przesyła commit do usługi  zarządzającej repozytorium (np. Stash)
  3. Usługa informuje serwer CI lub serwer CI cyklicznie odpytuje usługę o zmianach
  4. Serwer CI wykonuje testy i/lub buduje aplikacje
  5. Serwer CI może udostępnić efekt budowania
  6. Serwer CI przesyła informacje o (nie)powodzeniu, która decyduje o możliwości dołączenia nowego kodu

Narzędzia

  1. Usługa zarządzająca repozytorium
    1. GitHub
    2. GitLab
    3. Bitbucket / Stash
  2. Serwer CI
    1. Jenkins
    2. Travis, CircleCI, Bamboo, etc.
    3. Cloud, np. AWS CodePipeline
  3. Oprogramowanie testujące
    1. Codacy, SonarCube, linters
    2. phpmd, php-cs-fixer, phpunit
    3. 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-job

Korzyś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?

  1. Do wybranej gałęzi trafia nowy commit (np. w wyniku merge feature branch do master).
  2. Usługa zarządzająca repozytorium informuje serwer CD lub serwer CD cyklicznie odpytuje usługę o zmianach
  3. Serwer CD pobiera kod i zależności oraz buduje aplikację
  4. Serwer CD uruchamia testy akceptacyjne
  5. Serwer CD umieszcza aplikacje w właściwym środowisku
  6. Serwer CD informuje o (nie)powodzeniu procesu

Narzędzia

  1. Usługa zarządzająca repozytorium
  2. Serwer CD
  3. Oprogramowanie testujące
    1. Cucumber (Behat)
    2. Selenium
    3. jMeter
  4. Hosting
    1. SCP, FTP
    2. rsync
    3. Magallanes
    4. Docker Hub, AWS ECR
    5. Azure Web Apps
    6. 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: master

Korzyś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