Как да изградим съвременен тръбопровод CI / CD

Използване на безплатни и хоствани услуги

Софтуерните разработчици са решаване на проблеми. Въпреки че могат да бъдат много упорити в намирането на решения, в момента, в който имат такова, искат да го споделят със света; усещането за код за доставка е страхотно. Кодът, който никога не се изпълнява за потребителите, не е нищо повече от дигитален отпадъчен продукт. За да предотвратят строителните отпадъци, съвременните разработчици на софтуер доставят функционалност на своите потребители в кратки повторения и малки стъпки.

Начин за изпращане на код с малки стъпки и повторения е чрез използване на тръбопровод за непрекъсната интеграция и непрекъснато внедряване или CI / CD. В този урок ще преминем през всички стъпки в настройката на такъв тръбопровод с помощта на безплатни и хоствани услуги. От началото до края този урок ви показва в 9 стъпки как да:

  1. Напишете малко програма на Python (не Hello World)
  2. Добавете някои автоматизирани тестове за програмата
  3. Изпратете кода си на GitHub
  4. Настройте Travis CI за непрекъснато изпълнение на вашите автоматизирани тестове
  5. Настройване на по-добър код за непрекъснат контрол на качеството на кода
  6. Превърнете програмата Python в уеб приложение
  7. Създайте изображение на Докер за уеб приложението
  8. Избутайте изображението на Docker към Docker Hub
  9. Разположете изображението на Docker в Heroku

Целта на този урок е да ви покаже основните градивни елементи на съвременен тръбопровод за разработка на софтуер и как да сглобите тези блокове. Не става дума за какъвто и да е език за програмиране или по-специално за разработка на софтуер. Може би някои от строителните блокове не съвпадат с избрания от вас технологичен стек. Дори и да е така, все пак ви съветвам да преминете през всички стъпки. След като имате основно разбиране на цялостния тръбопровод от край до край, можете лесно да го съобразите с вашите специфични нужди.

Пълно разкриване: Аз съм един от разработчиците в екипа на Better Code Hub.

Актуализация август 2017 г.: Еран Барлев от codefresh.io публикува кратко видео в LinkedIn, демонстриращо как Codefresh може да замени някои от градивните елементи, описани в този урок. Тъй като няма два софтуерни продукта са еднакви, тръбопроводите за разработка също могат да варират. Не забравяйте да разгледате видеото на Eran, за да видите алтернативно изпълнение на модерен тръбопровод CI / CD.

Стъпка 1: Напишете малко генератор на звуци

Нуждаем се от малко парче софтуер, който ще пътува през всички фази на тръбопровода - от вашия лаптоп до облака. В нашия случай това парче софтуер е малко CI / CD програма за генериране на звуци, написана в Python.

Създайте нова директория (да кажем, че я наричаме „cicd-buzz“). Вътре в тази директория създайте друга директория, наречена „buzz“ и в тази директория запишете фрагмента отдолу във файл, наречен „generator.py“.

Също така създайте нов празен файл, наречен „__init__.py“ в същата директория. Вашата структура на проекта трябва да изглежда така:

cicd-вести /
  вести /
    __init__.py
    generator.py

Трябва да можете да стартирате този скрипт Python от командния ред в директорията „buzz“:

[cicd-buzz / buzz] $ python generator.py
Край до край Devops значително усилва непрекъснато тестване

Опитайте няколко пъти, забавно е:

[cicd-buzz / buzz] $ python generator.py
Пълното непрекъснато усъвършенстване значително подобрява отнемането
[cicd-buzz / buzz] $ python generator.py
Съвременните разработки забележително подобряват непрекъснатото тестване

Стъпка 2: Добавете автоматизирани тестове

Тръбопроводите за непрекъсната доставка имат смисъл само когато имате значително количество автоматизирани тестове, което ви пречи да доставяте непрекъснато счупен софтуер. За да получите подходящ набор от единични тестове за нашия генератор на буци, създайте нова директория, наречена „тестове“ в корена на вашата директория на проекта и запишете фрагмента отдолу в нов файл в директорията „тестове“. Обадете се на този файл „test_generator.py“:

За да стартираме тестовете, ще използваме рамката „pytest“. За да инсталирате pytest, ще използваме Python Virtual Environment („virtualenv“). Не се притеснявайте, това е по-лесно от казаното. Първо, уверете се, че имате инсталиран virtualenv, за да можете да изпълните следната команда в директорията на вашия проект:

[cicd-buzz] $ virtualenv venv

Това трябва да създаде нова директория venv. За да започнете да използвате този тип среда:

[cicd-buzz] $ source venv / bin / activate
(venv) [cicd-buzz] $

След това, създайте нов файл, наречен „Requirs.txt“, който изброява зависимостта от питест:

pytest == 3.0.6

За да изтеглите зависимости, посочени във файла с изисквания, ще трябва да изпълните командата "pip":

(venv) [cicd-buzz] $ pip install -r изисквания.txt

След като изпълните всички стъпки по-горе, коренът на вашата директория на проекти трябва да изглежда така:

cicd-вести /
  вести /
  requirements.txt
  тестове /
  venv /

Вътре във виртуалната среда вече можете да стартирате единичните тестове във файла „test_generator.py“:

(venv) [cicd-buzz] $ python -m pytest -v тестове / test_generator.py

Резултатът трябва да изглежда като:

========== тестовата сесия започва ===========
платформа darwin - Python 2.7.10, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 - / Потребители / rob / проекти / работно пространство / cicd-buzz / venv / bin / python
cachedir: .cache
rootdir: / Потребители / rob / проекти / работно пространство / cicd-buzz, inifile:
събра 3 предмета
тестове / test_generator.py :: test_sample_single_word PASSED
тестове / test_generator.py :: test_sample_multiple_words PASSED
тестове / test_generator.py :: test_generate_buzz_of_at_least_five_words PASSED
========== 3 преминаха за 0,02 секунди ==========

Стъпка 3: Поставете кода на GitHub

Влезте в GitHub (първо вземете акаунт, ако вече нямате такъв) и създайте ново обществено хранилище, наречено „cicd-buzz“.

Вътре в директорията на вашия проект създайте нов файл, наречен „.gitignore“, съдържащ само един ред:

venv

Това ще попречи на git да добави virtualenv към нашето репо. Сега е време да инициализирате Git локално и да натиснете кода си към GitHub:

[cicd-buzz] $ git init
[cicd-buzz] $ git add *
[cicd-buzz] $ git commit -m "Първоначално ангажиране"
[cicd-buzz] $ git дистанционно добавяне на произход git@github.com:  /cicd-buzz.git
[cicd-buzz] master git push -u началник на произход

Ако последната команда по-горе се оплаква от права за достъп, уверете се, че сте добавили своя SSH ключ към вашия GitHub акаунт.

Стъпка 4: Свържете Travis CI, за да стартирате тестовете на всеки ангажимент

Travis CI е хоствана услуга за работа с непрекъсната интеграция. Това е безплатно за публични хранилища на GitHub и получаването на Travis CI акаунт е само въпрос на посещение на https://travis-ci.org и влизане с вашите идентификационни данни на GitHub.

Разрешаването на Travis CI да започне изграждане при всяко Push and Pull Request за вашето хранилище е толкова лесно, колкото да завъртите превключвателя пред вашето хранилище за cicd-buzz на GitHub (кликнете върху бутона „Синхронизирайте акаунта“, в случай че вашето хранилище все още не се вижда):

Последната стъпка в активирането на Travis CI е да добавите файл „.travis.yml“ в корена на вашата директория на проекти. За нашия генератор на Buzz този файл трябва да съдържа:

език: python
скрипт:
  - python -m pytest -v

Добавете файла към Git, след това ангажирайте и Push вашите промени:

[cicd-buzz] $ git add .travis.yml
[cicd-buzz] $ git commit -m "Добавяне на конфигурация на Travis CI"
[cicd-buzz] $ git push

Отидете на таблото за управление на Travis CI. След кратко време Travis трябва да забележи промените в кода и да започне процеса на изграждане / тестване. Изходният дневник показва изпълнението на единичните тестове:

Стъпка 5: Добавете по-добър код център към вашия тръбопровод

Сега, когато имаме добре смазан тръбопровод, който непрекъснато проверява функционалността на нашия код с автоматизирани тестове, изкушението е силно да се съсредоточим върху функционалността и да забравим за качеството. Better Code Hub е хоствана платформа, която проверява качеството на вашия код в съответствие с 10-те насоки за поддържан, бъдещ доказателен код. Better Code Hub е надзирател, който непрекъснато следи работата ни по разработката (буквално при всяко натискане към GitHub) и ви уведомява, когато качеството е изложено на риск.

Better Code Hub е, подобно на Travis CI, услуга, която безпроблемно се интегрира с GitHub. За да го прикачите към нашето репо, отидете на https://bettercodehub.com и изберете бутона за вход с надпис Free.

След като влезете с вашите идентификационни данни на GitHub, на следващата страница са изброени всичките ви GitHub хранилища. Намерете хранилището, наречено „cicd-buzz“ и натиснете бутона за възпроизвеждане. След това Better Code Hub ще ви попита дали е добре да стартирате анализа с конфигурацията по подразбиране. Кликнете върху „Отиди“ и изчакайте няколко секунди, докладът за анализ вече трябва да бъде на вашия екран.

Доклад от началото на анализа в Better Code Hub

Ако искате Better Code Hub да се изпълнява за всеки Push and Pull Request на вашето репо (точно като Travis CI), превключете иконата на заявка за изтегляне, която се показва в долната лява част на repo картата:

Автоматичният Push / PR анализ е активиран

Стъпка 6: Превърнете генератора на Buzz в обикновено уеб приложение

Хубава работа! Вече имате тръбопровод за непрекъсната интеграция, който проверява за функционалност и качество в този момент. Следваща стъпка е непрекъснато внедряване на вашия софтуер, когато всички тестове преминат.

Тъй като ще разположим софтуера на Heroku като уеб приложение, първо трябва да напишем малко Python Flask обвивка около нашия генератор на звуци, за да накараме програмата да отговори на HTTP заявки и да изведе HTML. Добавете кода по-долу във файл, наречен „app.py“ в основния каталог на вашия проект:

Също така добавете още един ред към файла си „Requir.txt“ за рамката на флашка:

pytest == 3.0.6
Flask == 0.12

И инсталирайте новата зависимост:

(venv) [cicd-buzz] $ pip install -r изисквания.txt

Вече можете да стартирате уеб приложението на вашия лаптоп:

[cicd-buzz] $ python app.py
* Работи на http://0.0.0.0what000/ (Натиснете CTRL + C, за да напуснете)

Отворете местоположението http: // localhost: 5000 в браузър и се възхищавайте на вашето постижение. Хит се опреснете няколко пъти, само за забавление.

И накрая, не забравяйте да добавите ангажимента си и да натиснете промените си:

[cicd-buzz] $ git add app.py
[cicd-buzz] $ git добавяне на изисквания.txt
[cicd-buzz] $ git commit -m "Стъпка 6"
[cicd-buzz] $ git push

И се наслаждавайте да гледате как Travis CI и Better Code Hub взимат този тласък!

Стъпка 7: Съдържайте уеб приложението си с докер

Ще използваме Docker, за да създадем самостоятелно разгъващо се устройство от нашето уеб приложение. За обикновено приложение на Python Flask това може да изглежда като много режийни разходи, но разполагането на различни версии на вашата кодова база като малка, самостоятелна единица има много предимства, когато системата ви се разраства с течение на времето.

Ако приемем, че сте инсталирали Docker и стартирате, добавете следното към нов файл, наречен „Dockerfile“ в корена на вашата директория за проекти:

Горното казва на Docker да избере алпийското базово изображение, да инсталира Python и pip, а също и да инсталира нашето уеб приложение. Последният ред казва на Docker да стартира уеб приложението всеки път, когато контейнерът е стартиран.

Трябва да можете да изградите изображение на тази Docker конфигурация и да я стартирате (в зависимост от конфигурацията на вашата ОС може да се наложи да поставите sudo пред командите по-долу):

[cicd-buzz] $ docker build -t cicd-buzz.
[cicd-buzz] $ docker run -p 5000: 5000 --rm -it cicd-buzz

Възхищавайте се на резултата в браузър:

CI / CD звуков генератор работи в локален Docker контейнер

Отново, не забравяйте да добавите ангажимента си и да натиснете промените си:

[cicd-buzz] $ git добави Dockerfile
[cicd-buzz] $ git commit -m "Стъпка 7"
[cicd-buzz] $ git push

Стъпка 8: Разположете до Docker Hub

Разгръщането на вашите контейнери в централен регистър на изображения на Docker, като Docker Hub, прави много по-лесно да споделяте контейнерите си в различни среди или да се върнете към предишна версия. За да завършите тази стъпка, ще трябва да се регистрирате на https://docker.com и да добавите следното към файл, наречен „implemen_dockerhub.sh“ в нова директория, наречена „.travis“ в директорията на вашия проект:

Скриптът по-горе ще бъде извикан от Travis CI в края на всяко изграждане на тръбопровода и ще създаде ново разгъващо се изображение на Докер за това изграждане на тръбопровода. Скриптът изисква 3 променливи на средата, които можете да зададете под изгледа „настройки“ на вашето репо за cicd-buzz в Travis CI:

Променливи на средата на Travis CI за Docker

За да накарате Travis CI да ви разположи изображение на Docker в Docker Hub за всеки код, натиснете във вашето хранилище GitHub, променете вашия файл .travis.yml, така че да изглежда така:

След като извършите и натиснете тези промени (и изчакайте Travis CI да завърши пълния тръбопровод), трябва да можете да стартирате вашето Docker изображение направо от Docker Hub:

[cicd-buzz] $ docker run -p5000: 5000 --rm -it  / cicd-buzz: последно

Стъпка 9: Разгърнете се към Heroku

Heroku е облачна платформа за хостинг на малки и мащабируеми уеб приложения. Той предлага безплатен план, затова отидете на https://signup.heroku.com и се регистрирайте, ако още не сте го направили.

Инсталирайте лентата с инструменти на командния ред Heroku и от корена на директорията на вашия проект изпълнете следните команди:

[cicd-buzz] влизане в $ heroku
[cicd-buzz] $ heroku създавам
Създаване на приложение ... готово, ⬢ fathomless-inlet-53225
https://fathomless-inlet-53225.herokuapp.com/ | https://git.heroku.com/fathomless-inlet-53225.git
[cicd-buzz] $ heroku плъгини: инсталирайте @ heroku-cli / plugin-container-register
[cicd-buzz] $ heroku контейнер: вход
[cicd-buzz] $ heroku контейнер: натиснете уеб
[cicd-buzz] $ heroku контейнер: пуснете уеб

След тези команди трябва да имате достъп до приложението в URL адреса, отчетен от командата heroku create (или алтернативно стартирайте $ heroku open).

CI / CD звуков генератор работи на Heroku

Обърнете внимание, че контейнерът heroku: push web команда, бута същия контейнер към платформата Heroku, както сте били преместени в регистъра на Docker Hub.

За да автоматизирате процеса на разгръщане на всяка компилация от основния клон на нашия проект, добавете следното към файл, наречен „implemen_heroku.sh“ в директорията „.travis“:

Освен това добавете следния ред към вашия файл .travis.yml:

after_success:
  - sh .travis / implemen_dockerhub.sh
  - тест "$ TRAVIS_BRANCH" = "главен" && sh .travis / implemen_heroku.sh

И накрая добавете още 2 променливи на средата към вашето репо в Travis CI. Можете да намерите ключа API на Heroku под „Настройки на акаунта“ на Heroku. Името на Heroku App е името, отчетено от командата heroku create.

Ангажирайте и натиснете тези промени в GitHub. Новото изображение на Докер вече трябва да бъде избутано към Docker Hub и Heroku след успешното изграждане.

Стъпка 10: CI / CD FTW!

Сега, когато имаме изграден модерен тръбопровод за разработка, започва забавлението от функционалността за доставка в кратки итерации и малки стъпки. Да речем, че искаме да направим кацането малко по-привлекателно. Типичен работен процес, който трябва да направите, изглежда така:

  1. Започнете със създаването на нов брой за функцията: https://github.com/robvanderleek/cicd-buzz/isissue/1
  2. Създайте филиал на Git за този билет: https://github.com/robvanderleek/cicd-buzz/tree/issue-1
  3. * Магията на кодирането се случва тук *
  4. Следете отзивите от Travis CI и Better Code Hub: https://github.com/robvanderleek/cicd-buzz/commits/issue-1
  5. Проверете работещ екземпляр на приложението си, като локално стартирате най-новото изображение на Docker: docker run --rm -p5000: 5000 -it robvanderleek / cicd-buzz: issue-1 Можете също да споделите този контейнер с други.
  6. Ако сте доволни от новата функция, отворете заявка за изтегляне и кодът ви е готов да бъде изпратен от тръбопровода CI / CD за производство: https://github.com/robvanderleek/cicd-buzz/pull/2
CI / CD buzz generator има клон, работещ в локален Docker контейнер

Честито кодиране и доставка!