Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Continuous Integration with GitLab

Continuous Integration with GitLab

Ivan Nemytchenko

November 23, 2016
Tweet

More Decks by Ivan Nemytchenko

Other Decks in Programming

Transcript

  1. CONTINUOUS INTEGRATION
    WITH GITLAB
    IVAN NEMYTCHENKO, DEVELOPER ADVOCATE

    View Slide

  2. MODERN SOFTWARE DEVELOPMENT PROCESS
    IS SPREAD ACROSS MANY TOOLS

    View Slide

  3. Travis - GitHub - Trello - Slack

    View Slide

  4. Bitbucket - Semaphore - Pivotal Tracker - HipChat

    View Slide

  5. Jenkins - GitLab - Jira

    View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. View Slide

  17. CATGREP SOPHISTICATED TECHNOLOGIES INC.
    > file1.txt
    > file2.txt

    View Slide

  18. REQUIREMENT #1
    CONCATENATION RESULT SHOULD
    CONTAIN "HELLO WORLD"

    View Slide

  19. cat file1.txt file2.txt | grep -q "Hello world"

    View Slide

  20. View Slide

  21. RUN OUR FIRST TEST INSIDE CI

    View Slide

  22. .gitlab-ci.yml

    View Slide

  23. test:
    script: cat file1.txt file2.txt | grep -q 'Hello world'

    View Slide

  24. View Slide

  25. View Slide

  26. REQUIREMENT #2
    PACKAGE CODE BEFORE SENDING IT TO CUSTOMER

    View Slide

  27. test:
    script: cat file1.txt file2.txt | grep -q 'Hello world'
    package:
    script: cat file1.txt file2.txt | gzip > package.gz

    View Slide

  28. View Slide

  29. MAKE RESULTS OF YOUR BUILD DOWNLOADABLE

    View Slide

  30. test:
    script: cat file1.txt file2.txt | grep -q 'Hello world'
    package:
    script: cat file1.txt file2.txt | gzip > packaged.gz
    artifacts:
    paths:
    - packaged.gz

    View Slide

  31. View Slide

  32. RUN JOBS SEQUENTIALLY

    View Slide

  33. stages:
    - test
    - package
    test:
    stage: test
    script: cat file1.txt file2.txt | grep -q 'Hello world'
    package:
    stage: package
    script: cat file1.txt file2.txt | gzip > packaged.gz
    artifacts:
    paths:
    - packaged.gz

    View Slide

  34. SPEEDING UP THE BUILD

    View Slide

  35. #1: DUPLICATION

    View Slide

  36. stages:
    - compile
    - test
    - package
    compile:
    stage: compile
    script: cat file1.txt file2.txt > compiled.txt
    artifacts:
    paths:
    - compiled.txt
    test:
    stage: test
    script: cat compiled.txt | grep -q 'Hello world'
    package:
    stage: package
    script: cat compiled.txt | gzip > packaged.gz
    artifacts:
    paths:
    - packaged.gz

    View Slide

  37. #2: RUBY 2.1 ????

    View Slide

  38. LEARNING WHAT DOCKER IMAGE TO USE

    View Slide

  39. image: alpine

    View Slide

  40. image: alpine
    stages:
    - compile
    - test
    - package
    compile: ...
    test: ...

    View Slide

  41. View Slide

  42. > defined 3 stages
    > pass files between stages
    > downloadable artifacts
    > optimized execution time

    View Slide

  43. REQUIREMENT #3
    ISO INSTEAD OF GZIP

    View Slide

  44. DEALING WITH COMPLEX SCENARIOS

    View Slide

  45. View Slide

  46. image: alpine
    stages:
    - compile
    - test
    - package
    compile: ...
    test: ...
    pack-gz:
    stage: package
    script: cat compiled.txt | gzip > packaged.gz
    artifacts:
    paths:
    - packaged.gz
    pack-iso:
    stage: package
    script:
    - mkisofs -o ./packaged.iso ./compiled.txt
    artifacts:
    paths:
    - packaged.iso

    View Slide

  47. View Slide

  48. DEALING WITH MISSING SOFTWARE/PACKAGES

    View Slide

  49. INSTALL PACKAGE IN ALPINE LINUX
    apk add -U cdrkit

    View Slide

  50. script:
    - apk add -U cdrkit
    - mkisofs -o ./packaged.iso ./compiled.txt

    View Slide

  51. pack-iso:
    stage: package
    before_script:
    - apk add -U cdrkit
    script:
    - mkisofs -o ./packaged.iso ./compiled.txt
    artifacts:
    paths:
    - packaged.iso

    View Slide

  52. View Slide

  53. View Slide

  54. GITLAB REQUIREMENT #4
    PUBLISH
    A SMALL WEBSITE WITH OUR
    PACKAGES

    View Slide

  55. HTML + PACKAGES → AMAZON S3

    View Slide

  56. aws s3 cp ./ s3://yourbucket/ --recursive

    View Slide

  57. View Slide

  58. View Slide

  59. FIRST AUTOMATED DEPLOYMENT

    View Slide

  60. > awscli can be installed using pip
    > pip goes together with python

    View Slide

  61. s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive

    View Slide

  62. AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY

    View Slide

  63. variables:
    AWS_ACCESS_KEY_ID: "AKIAIOSFODNN7EXAMPLE"
    AWS_SECRET_ACCESS_KEY: “wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY”
    s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive

    View Slide

  64. KEEPING SECRET THINGS SECRET

    View Slide

  65. SETTINGS --> VARIABLES

    View Slide

  66. s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive

    View Slide

  67. So far so good:

    View Slide

  68. REQUIREMENT #5
    MORE THAN ONE DEVELOPER
    ON THE PROJECT

    View Slide

  69. s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive
    only:
    - master

    View Slide

  70. View Slide

  71. REQUIREMENT #6
    WE NEED A SEPARATE PLACE
    FOR TESTING

    View Slide

  72. GITLAB PAGES

    View Slide

  73. HOST WEBSITES ON GITLAB PAGES
    > your job should be named "pages"
    > put your files into "public" folder
    > specify "artifacts" section with this "public" folder

    View Slide

  74. HOST WEBSITES ON GITLAB PAGES
    > your job should be named "pages"
    > put your files into "public" folder
    > specify "artifacts" section with this "public" folder
    HTTP://.GITLAB.IO/

    View Slide

  75. pages:
    stage: deploy
    image: alpine:latest
    script:
    - mkdir -p ./public && cp ./*.* ./public/
    artifacts:
    paths:
    - public
    except:
    - master

    View Slide

  76. s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive
    only:
    - master
    pages:
    image: alpine:latest
    stage: deploy
    script:
    - mkdir -p ./public && cp ./*.* ./public/
    artifacts:
    paths:
    - public
    except:
    - master

    View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. INTRODUCING ENVIRONMENTS

    View Slide

  81. s3:
    environment: production
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive
    only:
    - master
    pages:
    image: alpine:latest
    environment: staging
    stage: deploy
    script:
    - mkdir -p ./public && cp ./*.* ./public/
    artifacts:
    paths:
    - public
    except:
    - master

    View Slide

  82. View Slide

  83. View Slide

  84. View Slide

  85. REQUIREMENT #7
    DO NOT MESS UP PRODUCTION

    View Slide

  86. SWITCHING TO MANUAL DEPLOYMENT

    View Slide

  87. s3:
    image: python:latest
    stage: deploy
    script:
    - pip install awscli
    - aws s3 cp ./ s3://yourbucket/ --recursive
    only:
    - master
    when: manual

    View Slide

  88. SUMMARY
    1. Deployment is just a set of commands
    2. You need to provide secret keys
    3. You specify where which branches should go to
    4. GitLab conserves the history of deployments
    5. You can enable manual deployment

    View Slide

  89. View Slide

  90. View Slide

  91. View Slide

  92. GO TO GITLAB.COM

    View Slide

  93. @INEM
    [email protected]
    BIT.LY/GITLAB-CI1
    BIT.LY/GITLAB-CI2

    View Slide