BREAKING BAD WITH GITLAB CI IVAN NEMYTCHENKO, DEVELOPER ADVOCATE
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
@[email protected]/GITLAB-CI1
BIT.LY/GITLAB-CI2