Sådan bygger du en moderne CI / CD-rørledning

Brug af gratis og hostede tjenester

Softwareudviklere er problemløsere. Selvom de kan være meget ihærdige med at finde løsninger, i det øjeblik de har en, vil de dele det med verden; følelsen af ​​forsendelseskode er stor. Kode, der aldrig udføres for brugere, er ikke kun et digitalt affaldsprodukt. For at forhindre bygningsaffald sender moderne softwareudviklere funktionalitet til deres brugere i korte iterationer og små trin.

En måde at sende kode i små intervaller og iterationer på er ved at bruge en kontinuerlig integration og kontinuerlig implementering eller CI / CD, pipeline. I denne tutorial vil vi gennemgå alle trin til opsætning af en sådan pipeline ved hjælp af gratis og hostede tjenester. Fra start til slut viser denne tutorial dig i 9 trin, hvordan du:

  1. Skriv et lille Python-program (ikke Hello World)
  2. Tilføj nogle automatiserede test til programmet
  3. Skub din kode til GitHub
  4. Opsæt Travis CI til løbende at køre dine automatiserede test
  5. Opsæt Better Code Hub for kontinuerligt at kontrollere din kodekvalitet
  6. Gør Python-programmet til en webapp
  7. Opret et Docker-billede til webappen
  8. Skub Docker-billedet til Docker Hub
  9. Distribuer Docker-billedet til Heroku

Målet med denne tutorial er at vise dig de væsentlige byggesten til en moderne softwareudviklingsrørledning, og hvordan du samler disse blokke. Det handler ikke specielt om programmeringssprog eller softwareudviklingsmetoder. Måske matcher nogle af byggestenne ikke din teknologistakke. Selv hvis det er tilfældet, råder jeg dig stadig til at gå gennem alle trin. Når du først har en grundlæggende forståelse af den komplette ende-til-ende-rørledning, kan du let få den til at passe til dine specifikke behov.

Fuld offentliggørelse: Jeg er en af ​​udviklerne i Better Code Hub-teamet.

Opdatering august 2017: Eran Barlev fra codefresh.io offentliggjorde en kort video på LinkedIn, der demonstrerede, hvordan Codefresh kan erstatte nogle af de byggesten, der er beskrevet i denne tutorial. Da ingen to softwareprodukter er ens, kan udviklingsrørledninger også variere. Sørg for at tjekke Erans video for at se en alternativ implementering af en moderne CI / CD-rørledning.

Trin 1: Skriv en lille buzzgenerator

Vi har brug for et lille stykke software, der vil rejse gennem alle faser af rørledningen, fra din bærbare computer til skyen. I vores tilfælde er dette stykke software et lille CI / CD-buzzgeneratorprogram skrevet i Python.

Opret en ny mappe (lad os sige, at vi kalder det 'cicd-buzz'). Inde i dette bibliotek oprettes et andet bibliotek kaldet ‘buzz’, og gem dette kodestykke nedenfor i en fil kaldet ‘generator.py’.

Opret også en ny tom fil kaldet '__init__.py' i samme bibliotek. Din projektstruktur skal se sådan ud nu:

cicd-brummer /
  summen/
    __init__.py
    generator.py

Du skal være i stand til at køre dette Python-script fra kommandolinjen i biblioteket 'buzz':

[cicd-buzz / buzz] $ python generator.py
Ende-til-ende enheder øger en kontinuerlig testning

Prøv det et par gange, det er sjovt:

[cicd-buzz / buzz] $ python generator.py
Komplet kontinuerlig forbedring forbedrer enheder enormt
[cicd-buzz / buzz] $ python generator.py
Moderne enheder forbedrer bemærkelsesværdigt kontinuerlig test

Trin 2: Tilføj automatiske test

Kontinuerlige leveringsrørledninger giver kun mening, når du har en betydelig mængde automatiserede test, der forhindrer dig i løbende at sende ødelagt software. For at få et ordentligt sæt enhedstests til vores buzzgenerator skal du oprette et nyt bibliotek kaldet ‘tests’ i roden af ​​dit projektmappe og gemme kodestykket nedenfor i en ny fil i ‘tests’-biblioteket. Kald denne fil 'test_generator.py':

For at køre testene bruger vi 'pytest'-rammen. For at installere pytest bruger vi et Python Virtual Environment (‘virtualenv’). Bare rolig, det er lettere gjort end sagt. Kontroller først, at du har virtualenv installeret, så du kan udføre følgende kommando i dit projektmappe:

[cicd-buzz] $ virtualenv venv

Dette skulle oprette en ny mappe-venv. Sådan begynder du at bruge denne miljøtype:

[cicd-buzz] $ kilde venv / bin / Activ
(venv) [cicd-buzz] $

Opret derefter en ny fil kaldet ‘krav.txt’, der viser pytest-afhængighed:

pytest == 3.0.6

For at downloade afhængigheder, der er anført i kravfilen, skal du udføre kommandoen 'pip':

(venv) [cicd-buzz] $ pip install -r krav.txt

Når du har afsluttet alle trin ovenfor, skal roden til dit projektmappe se sådan ud:

cicd-brummer /
  summen/
  requirements.txt
  prøver /
  venv /

Inden i det virtuelle miljø kan du nu køre enhedstestene i filen 'test_generator.py':

(venv) [cicd-buzz] $ python -m pytest -v tests / test_generator.py

Outputet skal se ud som:

========== testsession starter ==========
platform darwin - Python 2.7.10, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 - / Brugere / rob / projekter / arbejdsområde / cicd-buzz / venv / bin / python
cachedir: .cache
rootdir: / Brugere / rob / projects / workspace / cicd-buzz, inifile:
indsamlet 3 varer
tests / test_generator.py :: test_sample_single_word PASSED
tests / test_generator.py :: test_sample_multiple_words PASSED
tests / test_generator.py :: test_generate_buzz_of_at_least_five_words PASSED
========== 3 bestået på 0,02 sekunder ==========

Trin 3: Sæt koden på GitHub

Log ind på GitHub (få en konto først, hvis du ikke allerede har en), og opret en ny offentlig opbevaring kaldet 'cicd-buzz'.

Inde i dit projektmappe oprettes en ny fil kaldet '.gitignore', der kun indeholder en enkelt linje:

venv

Dette vil forhindre git i at tilføje virtualenv til vores repo. Nu er det tid til at initialisere Git lokalt og skubbe din kode til GitHub:

[cicd-buzz] $ git init
[cicd-buzz] $ git add *
[cicd-buzz] $ git commit -m "Initial commit"
[cicd-buzz] $ git remote tilføje oprindelse git@github.com:  /cicd-buzz.git
[cicd-buzz] $ git push -u oprindelsesmaster

Hvis den sidste kommando ovenfor klager over adgangsrettigheder, skal du sørge for at føje din SSH-nøgle til din GitHub-konto.

Trin 4: Tilslut Travis CI for at køre testene på hvert engagement

Travis CI er en hostet service til kontinuerligt integrationsarbejde. Det er gratis for offentlige GitHub-lagre, og at få en Travis CI-konto er bare et spørgsmål om at besøge https://travis-ci.org og logge ind med dine GitHub-legitimationsoplysninger.

At aktivere Travis CI til at starte en bygning ved hver Push and Pull-anmodning til dit arkiv er lige så let som at vende kontakten foran dit GitHub cicd-buzz-repository (klik på knappen 'Synkroniser konto', hvis dit arkiv ikke er synligt endnu):

Det sidste trin i aktivering af Travis CI er at tilføje en '.travis.yml' -fil i roden af ​​dit projektmappe. For vores buzzgenerator skal denne fil indeholde:

sprog: python
manuskript:
  - python -m pytest -v

Føj filen til Git, begynd derefter og skub dine ændringer:

[cicd-buzz] $ git add .travis.yml
[cicd-buzz] $ git commit -m "Tilføj Travis CI-konfiguration"
[cicd-buzz] $ git push

Gå til Travis CI betjeningspanel. Efter en kort periode skal Travis bemærke dine kodeændringer og starte build / testprocessen. Outputloggen viser udførelsen af ​​enhedstestene:

Trin 5: Føj Better Code Hub til din pipeline

Nu hvor vi har en godt olieret rørledning, der kontinuerligt kontrollerer funktionaliteten af ​​vores kode med automatiserede test, er fristelsen stærk til at fokusere på funktionalitet og glemme kvalitet. Better Code Hub er en hostet platform, der kontrollerer kvaliteten af ​​din kode i henhold til de 10 retningslinjer for vedligeholdelig, fremtidig beviskode. Better Code Hub er en vagthund, der løbende overvåger vores udviklingsarbejde (bogstaveligt talt ethvert skub til GitHub) og giver dig besked, når kvaliteten er i fare.

Better Code Hub er ligesom Travis CI en service, der sømløst integreres med GitHub. For at vedhæfte det til vores repo, gå til https://bettercodehub.com og vælg den login-knap, der siger Gratis.

Når du er logget ind med dine GitHub-legitimationsoplysninger, viser den næste side alle dine GitHub-lagre. Find depotet "cicd-buzz", og tryk på play-knappen. Better Code Hub spørger dig derefter, om det er fint at køre analysen med standardkonfigurationen. Klik på 'Gå' og vent et par sekunder, analyserapporten skal nu være på din skærm.

Toppen af ​​analyserapporten i Better Code Hub

Hvis du ønsker, at Better Code Hub skal køre for hver Push and Pull-anmodning på din repo (ligesom Travis CI), skal du skifte pull-request-ikonet, der vises nederst til venstre på repokortet:

Automatisk Push / PR-analyse er nu aktiveret

Trin 6: Drej buzzgeneratoren til en simpel webapp

Godt job! Du har allerede en kontinuerlig integrationspipeline, der kontrollerer for funktionalitet og kvalitet på dette tidspunkt. Det næste trin er at kontinuerligt implementere din software, når alle test gennemføres.

Da vi implementerer softwaren til Heroku som en webapp, er vi først nødt til at skrive en lille Python Flask-indpakning omkring vores buzzgenerator for at få programmet til at svare på HTTP-anmodninger og output HTML. Tilføj koden nedenfor i en fil kaldet 'app.py' i roden af ​​dit projektmappe:

Føj også en anden linje til din 'krav.txt' -fil til kolbenrammen:

pytest == 3.0.6
Flask == 0,12

Og installer den nye afhængighed:

(venv) [cicd-buzz] $ pip install -r krav.txt

Du kan nu køre webappen på din bærbare computer:

[cicd-buzz] $ python app.py
* Kører på http://0.0.0.0:5000/ (Tryk på CTRL + C for at afslutte)

Åbn lokationen http: // localhost: 5000 i en browser og beundre din præstation. Hit opdater et par gange, bare for sjov.

Til sidst, glem ikke at tilføje dit engagement og skubbe på dine ændringer:

[cicd-buzz] $ git tilføje app.py
[cicd-buzz] $ git tilføj krav.txt
[cicd-buzz] $ git commit -m "Trin 6"
[cicd-buzz] $ git push

Og nyd at se Travis CI og Better Code Hub hente dette skub!

Trin 7: Container din webapp med docker

Vi bruger Docker til at oprette en enkelt selvforsynende, distribuerbar enhed af vores webapp. For en simpel Python Flask-app kan dette se ud som en masse overhead, men at distribuere forskellige versioner af din kodebase som en lille, selvforsynet enhed har en masse fordele, når dit system vokser over tid.

Forudsat at du har Docker i gang, skal du tilføje følgende til en ny fil kaldet 'Dockerfile' i roden til dit projektmappe:

Ovenstående fortæller docker at vælge det alpine basisbillede, installere Python og pip og også installere vores webapp. Den sidste linje fortæller docker om at starte webappen når beholderen lanceres.

Du skal være i stand til at opbygge et billede af denne Docker-konfiguration og starte det (afhængigt af din OS-konfiguration skal du muligvis placere sudo foran kommandoerne nedenfor):

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

Beundre resultatet i en browser:

CI / CD-buzzgenerator, der kører i en lokal Docker-container

Igen, glem ikke at tilføje dit engagement og skubbe på dine ændringer:

[cicd-buzz] $ git tilføje Dockerfile
[cicd-buzz] $ git commit -m "Trin 7"
[cicd-buzz] $ git push

Trin 8: Distribuer til Docker Hub

Distribution af dine containere i et centralt Docker-billedregister, f.eks. Docker Hub, gør det meget nemmere at dele dine containere i forskellige miljøer eller gå tilbage til en tidligere version. For at gennemføre dette trin skal du tilmelde dig på https://docker.com og tilføje følgende til en fil kaldet 'deploy_dockerhub.sh' i et nyt bibliotek kaldet '.travis' i dit projektmappe:

Skriptet ovenfor kaldes af Travis CI i slutningen af ​​hver pipeline build og vil skabe et nyt implementerbart Docker-billede til det pipeline build. Scriptet kræver 3 miljøvariabler, som du kan indstille under 'indstillinger' -visningen af ​​din cicd-buzz-repo på Travis CI:

Travis CI-miljøvariabler for Docker

For at få Travis CI til at indsætte dit Docker-billede til Docker Hub for hver kode, skubbe til dit GitHub-arkiv, skal du ændre din '.travis.yml' -fil, så den ser ud:

Efter at have foretaget og skubbet disse ændringer (og ventet på, at Travis CI skal fuldføre den fulde pipeline), skal du være i stand til at starte dit Docker-billede direkte fra Docker Hub:

[cicd-buzz] $ docker run -p5000: 5000 - rm -it  / cicd-buzz: seneste

Trin 9: Implementere til Heroku

Heroku er en skyplatform til hosting af små og skalerbare webapplikationer. Det tilbyder en gratis plan, så gå til https://signup.heroku.com, og tilmeld dig, hvis du ikke allerede har gjort det.

Installer Heroku kommandolinjeværktøjsbælte og udfør følgende kommandoer fra roden af ​​dit projektmappe:

[cicd-buzz] $ heroku login
[cicd-buzz] $ heroku oprette
Oprettelse af app… færdig, ⬢ fathomless-inlet-53225
https://fathomless-inlet-53225.herokuapp.com/ | https://git.heroku.com/fathomless-inlet-53225.git
[cicd-buzz] $ heroku-plugins: installer @ heroku-cli / plugin-container-registry
[cicd-buzz] $ heroku container: login
[cicd-buzz] $ heroku container: push web
[cicd-buzz] $ heroku container: frigør web

Efter disse kommandoer skal du kunne få adgang til appen på den url, der er rapporteret af heroku create-kommandoen (eller alternativt køre $ heroku åben).

CI / CD-buzzgenerator, der kører på Heroku

Bemærk, at heroku-containeren: skub web-kommando, skubber den samme container til Heroku-platformen, som du har skubbet til Docker Hub-registreringsdatabasen.

For at automatisere processen med at implementere hver bygning af mastergrenen af ​​vores projekt skal du tilføje følgende til en fil kaldet 'deploy_heroku.sh' i biblioteket '.travis':

Tilføj også følgende linje til din '.travis.yml'-fil:

after_success:
  - sh .travis / deploy_dockerhub.sh
  - test "$ TRAVIS_BRANCH" = "master" && sh .travis / deploy_heroku.sh

Og tilføj til sidst 2 flere miljøvariabler til din repo på Travis CI. Du kan finde Heroku API-nøglen under din Heroku 'Kontoindstillinger'. Heroku-appnavnet er det navn, der rapporteres af kommandoen heroku create.

Forpligt dig og skub disse ændringer til GitHub. Et nyt Docker-billede skal nu skubbes til både Docker Hub og Heroku, efter at bygningen lykkes.

Trin 10: CI / CD FTW!

Nu hvor vi har en moderne udviklingspipeline igang, starter det sjove ved forsendelsesfunktionalitet i korte iterationer og små trin. Lad os sige, at vi ønsker at gøre landingen lidt mere attraktiv. En typisk arbejdsgang til at gøre, der ligner:

  1. Start med at oprette et nyt problem til funktionen: https://github.com/robvanderleek/cicd-buzz/issues/1
  2. Opret en Git-funktionsgren til denne billet: https://github.com/robvanderleek/cicd-buzz/tree/issue-1
  3. * Kodning magi sker her *
  4. Hold øje med feedback fra Travis CI og Better Code Hub: https://github.com/robvanderleek/cicd-buzz/commits/issue-1
  5. Kontroller en kørende forekomst af din app ved lokalt at køre det seneste Docker-billede: docker-løb - rm -p5000: 5000 -it robvanderleek / cicd-buzz: issue-1 Du kan også dele denne container med andre.
  6. Hvis du er tilfreds med den nye funktion, skal du åbne en Pull Request, og din kode er klar til at blive sendt af CI / CD-rørledningen til produktion: https://github.com/robvanderleek/cicd-buzz/pull/2
CI / CD-buzzgeneratorfunktionsgren kører i en lokal Docker-container

God kodning & forsendelse!