Breaking bad habits with GitLab CI

Post on 16-Apr-2017

234 views 0 download

Transcript of Breaking bad habits with GitLab CI

BREAKING BADWITH GITLAB CIIVAN NEMYTCHENKO, DEVELOPER ADVOCATE

IVAN NEMYTCHENKO

> Ruby developer> Project manager

> Co-founder of outsourcing agency> Developer advocate at GitLab

> railshurts.com> inem.at> @inem

SOFTWARE DEVELOPMENT PROCESS

Every tool covers a part of the whole process

MODERN SOFTWARE DEVELOPMENT PROCESSIS SPREAD ACROSS MANY TOOLS

Travis - GitHub - Trello - Slack

Bitbucket - Semaphore - Pivotal Tracker - HipChat

Jenkins - GitLab - Jira

BREAKING BADWITH GITLAB CI

IVAN NEMYTCHENKO, DEVELOPER ADVOCATE

BREAKING BAD WITH GITLAB CI

  

BREAKING BAD WITH GITLAB CI

  

BREAKING BAD

HABITSWITH GITLAB CI

IVAN NEMYTCHENKO, DEVELOPER ADVOCATE

HABIT OFNOT AUTOMATING

THE ROUTINE TASKS

THIS HABIT COMES FROM THE FEAR OF CI SYSTEMS

CATGREP SOPHISTICATED TECHNOLOGIES INC.

> file1.txt> file2.txt

REQUIREMENT #1CONCATENATION RESULT SHOULD

CONTAIN "HELLO WORLD"

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

RUN OUR FIRST TEST INSIDE CI

.gitlab-ci.yml

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

REQUIREMENT #2PACKAGE CODE BEFORE SENDING IT TO CUSTOMER

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

package: script: cat file1.txt file2.txt | gzip > package.gz

MAKE RESULTS OF YOUR BUILD DOWNLOADABLE

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

RUN JOBS SEQUENTIALLY

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

SPEEDING UP THE BUILD

#1: DUPLICATION

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

compile: stage: compile script: cat file1.txt file2.txt > compiled.txt artifacts: paths: - compiled.txt expire_in: 20 minutes

#2: RUBY 2.1 ????

LEARNING WHAT DOCKER IMAGE TO USE

image: alpine

image: alpinestages: - compile - test - package

compile: ...test: ...

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

REQUIREMENT #3ISO INSTEAD OF GZIP

DEALING WITH COMPLEX SCENARIOS

image: alpinestages: - 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

DEALING WITH MISSING SOFTWARE/PACKAGES

apk add -U cdrkit

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

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

GITLAB OUIREMENT #4PUBLISH

A SMALL WEBSITE WITH OUR PACKAGES

HTML → AMAZON S3

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

FIRST AUTOMATED DEPLOYMENT

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

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

AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY

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

KEEPING SECRET THINGS SECRET

SETTINGS --> VARIABLES

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

So far so good:

REQUIREMENT #5MORE THAN ONE DEVELOPER

ON THE PROJECT

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

REQUIREMENT #6WE NEED A SEPARATE PLACE

FOR TESTING

GITLAB PAGES

HOST WEBSITES ON GITLAB PAGES

> your job should be named "pages"> put your files into "public" folder

> specify "artifacts" section with this "public" folder

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://<USERNAME>.GITLAB.IO/<PROJECTNAME>

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

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

INTRODUCING ENVIRONMENTS

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

REQUIREMENT #7DO NOT MESS UP PRODUCTION

SWITCHING TO MANUAL DEPLOYMENT

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

BOOTING UP APPLICATION INSTANCE PER FEATURE-BRANCH

<S3_BUCKET>.S3-WEBSITE-US-EAST-1.AMAZONAWS.COM/<BRANCHNAME>

review apps: image: python:latest environment: review script: - pip install awscli - aws s3 cp ./ s3://reviewbucket/$CI_BUILD_REF_NAME/ --recursive

$CI_BUILD_REF_NAME

?

PREDEFINED VARIABLES

SUMMARY

1. Deployment is just a set of commands2. You need to provide secret keys

3. You specify where which branches should go to4. GitLab conserves the history of deployments

5. You can enable manual deployment

GO TO GITLAB.COM

@INEMINEM@BK.RUBIT.LY/GITLAB-CI1

BIT.LY/GITLAB-CI2