Lessons we learned developing infrastructure software at Box April - - PowerPoint PPT Presentation

lessons we learned developing infrastructure software at
SMART_READER_LITE
LIVE PREVIEW

Lessons we learned developing infrastructure software at Box April - - PowerPoint PPT Presentation

Lessons we learned developing infrastructure software at Box April 2018, Aleksandr Kuzminsky 1. Branching model Todays agenda 2. Tests 3. Dependencies 4. Artifacts Git Flow: Develop and Master Branches 3 Git Flow: Feature Branches


slide-1
SLIDE 1

Lessons we learned developing infrastructure software at Box

April 2018, Aleksandr Kuzminsky

slide-2
SLIDE 2

Today’s agenda

1. Branching model 2. Tests 3. Dependencies 4. Artifacts

slide-3
SLIDE 3

Git Flow: Develop and Master Branches

3

slide-4
SLIDE 4

Git Flow: Feature Branches

4

slide-5
SLIDE 5

Git Flow: Release Branches

5

slide-6
SLIDE 6

Git Flow: Hotfix Branches

6

slide-7
SLIDE 7

Security and Compliance on direct git-push

7

slide-8
SLIDE 8

Box flow: based on git-flow

8

# git flow feature start innodb-fast … # git flow feature publish innodb-fast

  • 📞 PR ⭃ develop branch
  • ✔️ CI must pass
  • 👁 CR is optional
slide-9
SLIDE 9

Box flow: develop branch protection

9

ü Protect this branch ü Require status checks to pass before merging ü Include administrators

slide-10
SLIDE 10

Box flow: release

10

# git flow release start 1.2.3 # bumpversion patch # git flow release publish 1.2.3

  • 📞 PR ⭃ develop, PR ⭃ master
  • ✔️ CI tests must pass
  • 👁 CR is mandatory
  • 🎰 Comment fixes go to release/1.2.3
slide-11
SLIDE 11

Box flow: master branch protection

11

ü Protect this branch ü Require pull request reviews before merging ü Require status checks to pass before merging ü Include administrators

slide-12
SLIDE 12

Box flow: hotfixes

12

# git flow hotfix start 1.2.4 # bumpversion patch # git flow release publish 1.2.4

  • 📞 PR ⭃ develop, PR ⭃ master
  • ✔️ CI tests must pass
  • 👁 CR is mandatory
  • 🎰 Comment fixes go to hotfix/1.2.4
slide-13
SLIDE 13

Tests

slide-14
SLIDE 14

Unit tests

  • Test Driven Development
  • For critical classes
  • For bugs
  • pytest for computations and files
  • unittest.mock for external resource and code
  • MySQL instances, APIs, already tested code

14

slide-15
SLIDE 15

Tests hierarchy

15

slide-16
SLIDE 16

Tests hierarchy

16

Module

slide-17
SLIDE 17

Tests hierarchy

17

Class

slide-18
SLIDE 18

Tests hierarchy

18

Methods

slide-19
SLIDE 19

pytest

def test_multiply(): assert multiply(2, 3) == 6

19

slide-20
SLIDE 20

pytest: write test that fails

from pydata import multiply def test_multiply(): assert multiply(2, 3) == 6

20

def multiply(x, y): return 0 $ pytest test/unit/test_demo.py > assert multiply(2, 3) == 6 E assert 0 == 6E + where 0 = multiply(2, 3) test/unit/test_demo.py:5: AssertionError

slide-21
SLIDE 21

pytest: fix implementation

from pydata import multiply def test_multiply(): assert multiply(2, 3) == 6

21

def multiply(x, y): return x * y $ pytest test/unit/test_demo.py test/unit/test_demo.py::test_multiply PASSED [100%]

slide-22
SLIDE 22

pytest: parameterized tests

@pytest.mark.parametrize('x, y, result', [ (2, 3, 6), (2, 2, 4) ]) def test_multiply(x, y, result): assert multiply(x, y) == result

22

slide-23
SLIDE 23

pytest: Expecting exceptions

@pytest.mark.parametrize('x, y', [ (None, 1), (1, None), (None, None) ]) def test_multiply(x, y): with pytest.raises(ValueError): multiply(x, y)

23

slide-24
SLIDE 24

To mock or not to mock (for unit tests)

  • Mock:
  • API calls
  • External code calls
  • Database queries
  • Anything external
  • already tested code

24

  • No Mock:
  • Calculations
  • Objects manipulations
  • Anything that works with

CPU, memory, files

slide-25
SLIDE 25

pytest: mock API calls

@mock.patch( ‘pydata.call_api’ ) def test_multiply(m_api): multiply(2, 3) m_api.assert_called_once_with( “http://x.com/x=2&y=3” )

25

def multiply(x, y): result = call_api( “http://x.com/x=%d&y=%d” % (x, y) ) return result

slide-26
SLIDE 26

Further watching

Michael Tom-Wing, Christie Wilson - Introduction to Unit Testing in Python with Pytest - PyCon 2016 https://youtu.be/UPanUFVFfzY Bay PIGgies March 2017: Testing in Layers https://youtu.be/pCrW_LiSb34

26

slide-27
SLIDE 27

Dependencies

slide-28
SLIDE 28

Artifacts: Local PyPI repo

28

slide-29
SLIDE 29

$ cat ~/.pip/pip.conf [global] extra-index-url = https://pypi.box.com/simple

29

slide-30
SLIDE 30

Packages

slide-31
SLIDE 31

RPM Packages with Omnibus

  • Full-stack installers – RPM with no dependencies
  • Includes Python+libs
  • No dependency hell
  • Doesn’t break existing packages
  • Python/modules version flexibility
  • https://github.com/chef/omnibus
  • Store in your Yum Repo of choice

31

slide-32
SLIDE 32

Thank you! Also, We’re Hiring!

32

slide-33
SLIDE 33

Picture credits

  • https://www.atlassian.com/git/tutorials/comparing-

workflows/gitflow-workflow

33