Continuous Integration
& Why You Care
Travis CI Anna Nagy
travis-ci.com
[email protected] || @acnagy
education.travis-ci.com
GitHub Education Pack → education.github.com/pack
clubs/organizations → email:
[email protected]
background info docs:
docs.travis-ci.com/user/for-beginners
docs.travis-ci.com/user/getting-started
railsgirlssummerofcode.org
(polyglot summer fellowship for womxn/nb engineers)
foundation.travis-ci.org
Some stats…
1.3M repos
380M CI jobs
168 years of CI jobs/month
About CI…
Story Time!
What happens when you write a big chunk of code, and try to fit it to a codebase
all at once?
… you know how this ends.
Continuous Integration
Integration == adding code to a codebase
Continuous Integration
Integration == adding code to a codebase
Continuous == Doing that thing over and over - maybe, like, without a break in
cadence
Phrase Overloading
(1) the engineering process of merging code as it is written
(2) the automation system that compiles and tests code
Testing in Industry…
Code is Tested
Write your tests.
Types of Tests
Automated vs. Manual
Functional vs. Non-Functional Test
Automated Tests
A machine follows a script to verify an “assertion”
These are part of a codebase, and run in CI
Functional Tests
…tests a specific functionality (or several) of the system
“does this element meet the requirements that it is supposed to meet?”
Unit tests, integration tests, end-to-end tests
Unit Test Example
Here’s some code:
markdownImageString(repo, branch) {
const url = this.repositoryUrl(repo);
const imageUrl = this.imageUrl(repo, branch);
return `[](${url})`;
}
Here’s a unit test:
test('it generates a Markdown image string with a repo and a
branch', function (assert) {
const service = this.owner.lookup(
'service:status-images');
const markdown = service.markdownImageString(
this.repo, branch);
assert.equal(markdown,
`[](${secureRoot}/
travis-ci/travis-web)`);
});
If this test passes…
we know the method is still doing what it is supposed to be doing!
What to test for…
Positives - things work as they should be working
Contrapositives - things fail as they should be failing
Goal: maintain logic + integrity of the application
Software Engineering is
done in teams
Builds & Building…
Verb
compile/convert this source code into something runnable
xkcd, 303 - you’ve prob seen this one :)
Noun
the end result of a build process
Why CI Systems?
“Works on my machine”
Reproducibility
Clean environments, everyone has the same environment
Tidy Deploys
Test in an environment that matches your production environment!
… and does not have all your helper scripts and dependencies
Faster Development
Improved confidence in code + PRs
Projects with CI release twice as often, PR acceptance is 1.6 hours sooner
cope.eecs.oregonstate.edu/CISurvey
Automate all the things!
Code Coverage, Linting, Language Runtimes
Dependency Management , Config Management
Deployment, Container-Building (deployment environments)
Documentation Generation, Demo Generation
CICD
CD needs CI - “is this code deployable now?”/“deploy all changes to the code?”
… tests are really important to this
Some Examples
language: ruby
rvm: 2.2
cache: bundler
script: bundle exec jekyll build
deploy:
provider: elasticbeanstalk
edge:
source: cs50/dpl
force_update: true
access_key_id: "$AWS_ACCESS_KEY_ID"
secret_access_key: "$AWS_SECRET_ACCESS_KEY"
region: us-east-1
app: manual50
env: manual50
bucket_name: travis50
on:
branch: master
slack:
secure: $long_token
github.com/cs50/manual50/blob/master/.travis.yml
before_script:
- bundle exec rake clean assets:precompile
script:
- bundle exec rake spec
- ./script/validate-bash-syntax
after_success: bundle exec codeclimate-test-reporter
before_deploy: ruby script/build_s3_index_html.rb
github.com/travis-ci/travis-build/blob/master/.travis.yml
Demo
In Review…
Builds & Testing
Turn this code into something runnable, then run these tests and see what we get
Historical builds become a kind of semi-living audit-log for tests
Code Quality & Reliability
CICD in the Wild
Software Engineering teams use CI systems to build and test code as it is
changed
CI also functions as a kind of automation hub - notifications, artifacts uploading,
deployment
CD - Continuous Delivery/Deployment:
“could this be deployed at any step?” vs. “is this deployed at every step?”
Questions?
Thank you!
Travis CI Anna Nagy
travis-ci.com
[email protected] || @acnagy
education.travis-ci.com