CSC/ECE 517 Spring 2015/ch1a 6 TZ: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
 
(110 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<font size="5"><b>Snap CI</b></font>
<font size="5"><b>Snap Continuous Integration</b></font>


Snap CI is a hosted continuous integration and continuous delivery service.
[https://snap-ci.com/ Snap Continuous Integration] (Snap CI) is a hosted continuous integration and continuous delivery service.


__TOC__
__TOC__


=='''Background'''==
=='''Background on Continuous Integration'''==
Continuous integration (CI) is the practice of merging all developer working copies with a shared mainline several times a day. It was adopted as part of [http://en.wikipedia.org/wiki/Extreme_programming extreme programming] (XP). The main aim of CI is to prevent integration problems, referred to as "integration hell" in early descriptions of XP.


CI was originally intended to be used in combination with automated unit tests written through the practices of [http://en.wikipedia.org/wiki/Test-driven_development test-driven development] (TDD). Initially this was conceived of as running all unit tests in the developer's local environment and verifying they all passed before committing to the mainline. This helps avoid one developer's work in progress breaking another developer's copy.
Continuous integration (CI) is a software engineering practice that facilitates collaborative software development.  It is the practice of continuously evaluating how different developers' work would integrate, such as by running tests and performing builds several times per day.  It is often associated with [http://en.wikipedia.org/wiki/Extreme_programming extreme programming] (XP), but it can also be used with other approaches to software development.


Later elaborations of the concept introduced build servers, which automatically run the unit tests periodically or even after every commit and report the results to the developers. The use of build servers (not necessarily running unit tests) had already been practised by some teams outside the XP community. Nowadays, many organisations have adopted CI without adopting all of XP.
<blockquote>
CI was originally intended to be used in combination with automated unit tests written through the practices of [http://en.wikipedia.org/wiki/Test-driven_development test-driven development]. Initially this was conceived of as running all unit tests in the developer's local environment and verifying they all passed before committing to the mainline. This helps avoid one developer's work in progress breaking another developer's copy. [[#referencesAnchor|[1]]]</blockquote>


In addition to automated unit tests, organisations using CI typically use a build server to implement continuous processes of applying [http://en.wikipedia.org/wiki/Quality_control quality control] in general — small pieces of effort, applied frequently. In addition to running the unit and integration tests, such processes run additional static and dynamic tests, measure and profile performance, extract and format documentation from the source code and facilitate manual QA processes. This continuous application of quality control aims to improve the [http://en.wikipedia.org/wiki/Software_quality quality of software], and to reduce the time taken to deliver it, by replacing the traditional practice of applying quality control after completing all development. This is very similar to the original idea of integrating more frequently to make integration easier, only applied to QA processes.
In CI, developers commit their code to a build server, which automatically runs tests either periodically or after every commit, and reports the results to the developers via email or other methods. CI quality control has to be different from the traditional quality control processes of unit, system, and system integration testing.


=='''Example'''==
<blockquote>In addition to running the unit and integration tests, CI servers will run additional static and dynamic tests, measure and profile performance, extract and format documentation from the source code and facilitate manual QA processes. This continuous application of quality control aims to improve the [http://en.wikipedia.org/wiki/Software_quality quality of software], and to reduce the time taken to deliver it, by replacing the traditional practice of applying quality control after completing all development. This is very similar to the original idea of integrating more frequently to make integration easier, only applied to QA processes. [[#referencesAnchor|[1]]]</blockquote>
Getting started on Snap CI.


'''■ Step1: Sign in'''
=='''Examples'''==
==='''Example 1: Getting started on Snap CI'''===


   <p>To sign up with Snap, visit [https://www.snap-ci.com/ Snap CI] and click in the Sign in with Github link at the top.
Snap CI is free to use for open source projects; for pricing for private projects, see [https://snap-ci.com/plans here].  It is easy to register your software project with Snap if your project is on [https://github.com/ GitHub].  Snap's [https://docs.snap-ci.com/getting-started/ web site] provides simple directions, which in summary are as follows:
   When you sign in, GitHub will ask if you want to give a set of permissions to Snap.</p>
 
===='''Sign in'''====
 
   <p>To sign up with Snap, visit [https://www.snap-ci.com/ Snap CI] and click the "Sign in with Github" link at the top.
   When you sign in, GitHub will ask if you want to give a set of permissions to Snap to access your repositories, which it requires in order to function.  Snap's [https://docs.snap-ci.com/managing-your-github-connection/ web site] says that "We never, ever commit code to your repository or look at your source code."</p>


[[File:1.Sign_in.jpg‎  |frame|center|Snap CI website]]
[[File:1.Sign_in.jpg‎  |frame|center|Snap CI website]]


===='''Add your repository'''====


'''■ Step2: Add your repository'''
   <p>Once you are signed in, Snap will present a list of all the public repositories on GitHub to which you have access. If you are an administrator on any of those repositories, you can build that repository on Snap.</p>
 
   <p>Once you are signed in, Snap will present a list of all the repositories you have access to. You may only build repositories.  
  If you are an administrator on any of those repositories, you may build that repository on Snap.</p>


[[File:2.Add_repository.jpg |frame|center|Your repository list]]
[[File:2.Add_repository.jpg |frame|center|Your repository list]]




'''■ Step3: Config your build'''
===='''Configure your build'''====


   <p>When you select a repository to build on Snap, we will attempt to automatically detect some popular configurations for your build.
   <p>When you select a repository to build on Snap, you can choose languages, databases, artifacts, secure files, dependency managers, and other conventions that may indicate how your build could be set up.  If you use an automated build tool for your software, this step may be straightforward, but otherwise it might require some effort.</p>
  We look for languages versions, build tools files, dependency managers and other conventions that may indicate how your build could be set up.
  In this guide we'll use a ruby repository, but we do support lots of [http://docs.snap-ci.com/the-ci-environment/languages/ other languages].</p>


[[File:3.Configure.jpg |frame|center|Configure your build]]
[[File:3.Configure.jpg |frame|center|Configure your build]]


===='''Build'''====


   <p>As most of the ruby repositories, this one uses a dependency manager tool call bundler and the rspec testing framework.
   <p>After completing the steps above, all that is left to do is click "Build now" and let Snap run your build.</p>
Because of that, Snap automatically added the default command for each of them: <i style="background-color: #f0f0f0;">bundle install --path ${SNAP_CACHE_DIR}/.bundle</i> and <i style="background-color: #f0f0f0;">rake spec</i> respectively.
Most of the times that would be everything needed to run your tests. However, there may be some tasks that are pre-requisites to it. In this specific build, we need to execute the command  <i style="background-color: #f0f0f0;">bundle exec foreman start &</i>. It can be done simply by adding it before  <i style="background-color: #f0f0f0;">bundle exec rake spec</i>.</p>


[[File:4.Passed.jpg |frame|center|Build passed]]


'''■ Step4: Build'''
==='''Example 2: Heroku Deployment with Snap CI'''===
When you want to deploy applications on [https://www.heroku.com/ Heroku], you can easily make Snap test and deploy your applications. This section shows how to do so with a Ruby on Rails project.  The steps are as follows:


  <p>All that's left to do is click '''Build now''' and let Snap run our build.</p>
===='''Snap CI configuration'''====


[[File:4.Passed.jpg |frame|center|Build passed]]
  <p>Heroku currently requires your production database to be [http://www.postgresql.org/ PostgreSQL].  In Snap, you need to specify that you are using PostgreSQL.  <br/>Once you have Snap connected to your GitHub repository, you can click "ADD STAGE" to add a new stage named "DEPLOY".<br/>After that, you can choose a deploy tool, such as "Heroku (basic)".</p>
 
[[File:1.Snap ci connect heroku.jpg‎  |frame|center|Snap CI Configuration]]
 
===='''Set Heroku credentials'''====
 
  <p>When you click "Heroku Credentials", you can login to Heroku. Then Heroku will ask you whether you want to authorize or not. Click "Allow", if you want to authorize, and you will see your Heroku account shown on the Snap website, just like in the last picture in circle number 4.</p>
 
[[File:2.Snap ci connect heroku.jpg |frame|center|Set Heroku credentials]]
 
===='''Save and Run'''====
 
  <p>Then click the "Save" button at the upper-right corner of the Snap web page. Snap will automatically run, and you can check whether your application passes.</p>
 
[[File:3.deploy passed.jpg |frame|center|Passed]]
 
=='''Programming Language Support'''==
 
Snap supports [https://docs.snap-ci.com/the-ci-environment/languages/ many programming languages] and automated build systems for them.  For Java, for instance, it supports Java 6, 7, and 8, and, for build tools, Maven and Ant.  For Ruby, it supports bundler and rake.
 
It can automatically detect which build tools are used in the project, for certain build tools.  For instance, if a pom.xml file is present in a Java project, Snap CI can automatically configure itself for Maven.  (Apparently, the POM must be present in the top-level directory in the Git repository for Snap CI to detect it automatically.  If the Java project is in a lower-level directory, it is still possible to configure Snap manually to support Maven.)
 
 
=='''GitHub Integration'''==
 
Snap integrates closely with GitHub. GitHub is of course very popular for both open-source and closed-source software projects in many programming languages.  So, Snap focusing its efforts on GitHub makes sense for anyone using GitHub.
 
Snap by default triggers a build whenever a push is made to the user's GitHub repository, including any Git branch.  When a commit is made to a branch, it can also attempt to merge the branch with the master branch, and report the results.
 
Snap also tracks pull requests.  It runs a build to show what the result would be if the pull is merged.
 
An email is sent to developers whenever a build fails.
 
=='''Pipelines'''==
 
Snap allows a series of customized steps whenever it evaluates a build.  The steps together are called a "pipeline".  They can report different test information (pass or fail, the specific fail position) about your repository. What is more, you can even assign deployment of the software to testing or production environments, and the execution of either automatic or manual tests against these deployed environments.
 
Many continuous integration tools have the feature of building the software and running tests when a change happens. However, Snap augments this feature with the ideas of "deployment pipelines" and "continuous delivery".  Snap can in this manner perform more steps than other tools.
 
  '''Continuous Integration''' - The automated build and test of your software when a change is made by anyone on the team, with all work happening on a shared branch.
  '''Continuous Delivery''' - The ability to keep your software easily packaged at any time. Have a rigorous set of automated tests and robust deployment scripts and tools.
 
Each step in the pipeline is at the core a series of command-line commands on the Snap server.  The console output is shown for each step.  If a step fails, the pipeline will halt; the later steps will not execute.
 
Both automatic and manual steps are allowed.  One would normally want to run most of the tests automatically with each Git commit, and perhaps deploy the software to a test environment.  However, a step can also perform a release of the software, which normally one would only want to run manually, not with each commit.  For instance, a step may deploy a web application to Heroku or Amazon Web Services.  It may also upload a software release file in its final form to a web site for distribution, such as to SourceForge or the project's GitHub releases page.  The final "publish" stage will not be executed unless someone manually triggers it. It means any changes made to the project will not be put into the production version automatically, which reduces the risks.
 
<blockquote>At the end of a series of stages you can deploy your software to production. However most development teams do not jump to production after all automated tests pass. Instead, they use an environment similar to production for further testing and verification; usually called Staging or ''UAT'' (short for user-acceptance-testing). An important aspect here is to control what, where and when things get released.[[#referencesAnchor|[2]]]</blockquote>
 
=='''Support for Multiple Branches'''==
 
Snap supports having different pipelines for different Git branches.  Each branch may thus be tested separately.
<blockquote>When [http://docs.snap-ci.com/working-with-branches/automatic-branch-tracking/ Automatic Branch Tracking] and [http://docs.snap-ci.com/working-with-branches/integration-pipelines/ Integration Pipelines] is enabled, Snap will not only execute the pipeline on the branch but will also attempt to do a local merge of the branch with the main tree and execute the pipeline against the merged code. ... By the end of the pipelines you not only know that your changes pass through the pipeline but also it also will pass if you perform a merge with the main development tree. You are always aware if your changes are diverging from the main tree and in a position to take corrective action if required. Also, the whole team has visibility into the health of each branch.
[[#referencesAnchor|[2]]]</blockquote>
 
[[File:Snap_ci_auto_branch_tracking.jpg |frame|center|Different Branches[[#referencesAnchor|[2]]]‎]]
 
=='''Comparison with Other Continuous Integration Tools'''==


=='''Compare different Continuous Intergration Tools'''==
There are more than 30 continuous intergration tools designed to adapt to different platforms. I select several tools which can connect Github and relate to Ruby to compare.


There are more than 30 continuous integration tools designed to adapt to different platforms. Here are several tools that can connect to Github and build Ruby projects.
<center>'''Comparison of Continuous Integration Tools [[#referencesAnchor|[3]]]'''</center>
{| class="wikitable sortable" style="font-size: 80%; text-align: center; width: auto;"
{| class="wikitable sortable" style="font-size: 80%; text-align: center; width: auto;"


|-
|-
! Name
! Name
! [[Platform (computing)|Platform]]
! Platform (computing)|Platform
! [[License]]
! License
! [[Microsoft Windows|Windows]] [[Software build|builders]]
! Windows builders
! [[Java (programming language)|Java]] [[Software build|builders]]
! Java builders
! Other [[Software build|builders]]
! Other builders
! Notification
! Notification
! [[Integrated development environment|IDE]] [[System integration|Integration]]
! IDE Integration
! Other [[System integration|Integration]]
! Other Integration


|-
|-
| [http://www.appveyor.com AppVeyor CI]
| [http://circleci.com CircleCI]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{yes|[[Visual Studio]], [[MSBuild]], [[Psake]]}}
| unknown
| {{no}}
| unknown
| {{yes|Custom script, [[PowerShell]]}}
| Ruby, Python, Node.js, PHP, Java
| [[E-mail]]
| E-mail, Campfire, HipChat, CCtray
| {{no}}
| unknown
| {{yes|[[GitHub]], [[Bitbucket]], Kiln, [[Windows Azure]]}}
| Heroku, GitHub


|-
|-
| [https://circleci.com CircleCI]
| [http://node.ci node.ci]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{unknown}}
| unknown
| {{unknown}}
| unknown
| {{yes|[[Ruby (programming language)|Ruby]], [[Python (programming language)|Python]], [[Node.js]], [[PHP]], [[Java (programming language)|Java]]}}
| Node.js
| [[E-mail]], [[Campfire (software)|Campfire]], [[HipChat]], CCtray
| E-mail
| {{unknown}}
| unknown
| {{yes|[[Heroku]], [[GitHub]]}}
| Amazon Web Services(AWS), GitHub, Bitbucket
 
|-
| [https://node.ci node.ci]
| Hosted
| {{proprietary}}
| {{unknown}}
| {{unknown}}
| {{yes|[[Node.js]]}}
| [[E-mail]]
| {{unknown}}
| {{yes|[[Amazon Web Services|AWS]], [[GitHub]], [[Bitbucket]]}}


|-
|-
| [https://www.codeship.io Codeship]
| [http://www.codeship.io Codeship]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{no}}
| no
| {{yes|[[Maven]]}}
| Maven
| {{yes|[[Go (programming language)]], [[Java (programming language)]], [[Node.js]], [[PHP]], [[Python (programming language)]], [[Ruby (programming language)]]}}
| Go , Java , Node.js, PHP, Python , Ruby
| [[E-mail]], Flowdock, Grove, [[HipChat]], Web
| E-mail, Flowdock, Grove, HipChat, Web
| {{no}}
| no
| {{yes|[[CloudControl]], [[Engine Yard]], [[GitHub]], [[Heroku]]}}
| CloudControl, Engine Yard, GitHub, Heroku


|-
|-
| [http://www.finalbuilder.com/continua-ci Continua CI]
| [http://www.finalbuilder.com/continua-ci Continua CI]
| [[Windows]]
| Windows
| {{proprietary}}
| proprietary
| {{yes|[[Ant]], [[Nant]], [[FinalBuilder]], [[MSBuild]], [[Rake (software)|Rake]], [[Visual Studio]], [[Powershell]]}}
| Ant, Nant, FinalBuilder, MSBuild, Rake, Visual Studio, Powershell
| {{yes|[[Ant]]}}
| Ant
| {{yes| Execute Program(command line)}}
| Execute Program(command line)
| [[E-mail]], [[XMPP]]
| E-mail, XMPP
| {{no}}
| no
| {{yes|[[GitHub]], [[Bitbucket]], [[Codeplex]], [[Kiln]], [[Team Foundation Server|TFS]], [[FogBugz]], [[JIRA|Jira]], [[NCover]], [[Opencover]], [[NUnit]], [[DUnitX]], [[jUnit]], [[xUnit]], [[NuGet]], [[7Zip]]}}
| GitHub, Bitbucket, Codeplex, Kiln, Team Foundation Server(TFS), FogBugz, Jira, NCover, Opencover, NUnit, DUnitX, jUnit, xUnit, NuGet, 7Zip


|-
|-
| [https://drone.io Drone.io]
| [http://drone.io Drone.io]
| Hosted
| Hosted
| {{free|[[Apache License|Apache]] 2.0}}
| freeApache License|Apache 2.0
| {{unknown}}
| unknown
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven 2]], [[Gradle]]}}
| Apache Ant|Ant, Apache Maven|Maven 2, Gradle
| {{yes|C, C++, [[Dart (programming language)|Dart]], [[Go (programming language)|Go]], [[Node.js|NodeJS]], [[Python (programming language)|Python]], [[PHP]], [[Ruby (programming language)|Ruby]], [[Java (programming language)|Java]], [[Groovy (programming language)|Groovy]], [[Scala (programming language)|Scala]], [[Erlang (programming language)|Erlang]]}}
| C, C++, Dart, Go, Node.js, Python, PHP, Ruby, Java, Groovy, Scala, Erlang
| [[E-mail]]
| E-mail
| {{unknown}}
| unknown
| {{yes|[[Heroku]], Dotcloud, [[GitHub]], [[Bitbucket]]}}
| Heroku, Dotcloud, GitHub, Bitbucket
 
 
|-
| [http://integrity.github.io/ Integrity]
| [[Ruby (programming language)|Ruby]]
| {{free|[[MIT license|MIT]]}}
| {{yes|Yes (command line)}}
| {{yes|Yes (command line)}}
| {{yes|command line}}
| [[E-mail]], [[World Wide Web|Web]]
| {{unknown}}
| {{unknown}}
 


|-
|-
| [http://www.koalitycode.com Koality]
| [http://www.koalitycode.com Koality]
| Cross Platform, [[Private cloud#Private cloud|Private Cloud]]
| Cross Platform, Private Cloud
| {{proprietary}}
| proprietary
| {{unknown}}
| unknown
| {{unknown}}
| unknown
| {{yes|[[Shell scripts|Shell Script]], [[Command Line|Command-Line]]}}
| Shell scripts, Command Line|Command-Line
| [[Email]], [[HipChat]], [[GitHub]]
| Email, HipChat, GitHub
| {{unknown}}
| unknown
| {{yes|[[Amazon Web Services]], [[GitHub]]}}
| Amazon Web Services, GitHub
 
|-
| [http://tbraun89.github.io/pyCI/ pyCI]
| [[Linux]]
| {{free|[[GNU General Public License#Version 2|GPL2]]}}
| {{no}}
| {{no}}
| {{yes|Command line}}
| {{yes|Command line}}
| {{no}}
| {{no}}


|-
|-
| [https://semaphoreapp.com Semaphore]
| [http://semaphoreapp.com Semaphore]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{unknown}}
| unknown
| {{yes|[[Apache Maven|Maven 3]]}}
| Apache Maven 3
| {{yes|[[Ruby (programming language)]], [[Java (programming language)]], [[Node.js]], [[PHP]], [[Clojure]], [[Rake (software)|Rake]], [[Command Line]]}}
| Ruby , Java , Node.js, PHP, Clojure, Rake, Command Line
| [[E-mail]], [[Campfire (software)|Campfire]], [[HipChat]], [[Slack]], Flowdock, Webhooks, Remote API
| E-mail, Campfire, HipChat, Slack, Flowdock, Webhooks, Remote API
| {{unknown}}
| unknown
| {{yes|[[GitHub]], [[Bitbucket]], [[Heroku]], [[Code Climate]], [[Cloud 66]]}}
| GitHub, Bitbucket, Heroku, Code Climate, Cloud 66


|-
|-
| [[Shippable]]
| [http://www.shippable.com/ Shippable]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{yes|[[MSBuild]], [[NAnt]]}}
| MSBuild, NAnt
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven]], [[Gradle]]}}
| Apache Ant, Apache Maven, Gradle
| {{yes|[[Ruby (programming language)|Ruby]], [[Python (programming language)|Python]], [[Node.js]], [[Java (programming language)|Java]], [[Scala (programming language)|Scala]], [[C Sharp (programming language)|C Sharp]], [[PHP (programming language)|PHP]], [[Go (programming language)|Go]]}}
| Ruby, Python, Node.js, Java, Scala, C Sharp, PHP, Go
| [[E-mail]], [[Campfire (software)|Campfire]]
| E-mail, Campfire
| {{no}}
| no
| {{yes|[[GitHub]], [[Bitbucket]] [[Heroku]]}}
| GitHub, Bitbucket Heroku


|-
|-
| [https://snap-ci.com Snap CI]
| [http://snap-ci.com Snap CI]
| Hosted
| Hosted
| {{proprietary}}
| proprietary
| {{no}}
| no
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven]], [[Gradle]], [[Android (operating system)|Android]]}}
| Apache Ant, Apache Maven, Gradle, Android
| {{yes|C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala}}
| C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala
| [[E-Mail]], [[Campfire]], [[HipChat]], [[Webhook]]
| E-Mail, Campfire, HipChat, Webhook
| {{no}}
| no
| {{yes|[[GitHub]], [[Heroku]], [[Amazon Web Services|AWS]]}}
| GitHub, Heroku, AWS


|-
|-
| [https://www.solanolabs.com Solano CI]
| [http://www.solanolabs.com Solano CI]
| Hosted, [[Cross-platform]], [[Private cloud#Private cloud|Private Cloud]]
| Hosted, Cross-platform, Private cloud#Private cloud|Private Cloud
| {{proprietary}}
| proprietary
| {{no}}
| no
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven]], [[Gradle]]}}
| Apache Ant, Apache Maven, Gradle
| {{yes|C, C++, Clojure, Go, Java, Javascript, Node.js, PHP, Python, R, Ruby, Scala, Command Line}}
| C, C++, Clojure, Go, Java, Javascript, Node.js, PHP, Python, R, Ruby, Scala, Command Line
| [[E-Mail]], [[Campfire]], [[HipChat]], [[Flowdock]], [[Slack]], [[Webhook]], CCMenu
| E-Mail, Campfire, HipChat, Flowdock, Slack, Webhook, CCMenu
| {{no}}
| no
| {{yes|[[GitHub]], GitHub Enterprise, [[Bitbucket]], [[Heroku]], [[Amazon Web Services|AWS]], [[Git (software)|Git]], [[Mercurial]]}}
| GitHub, GitHub Enterprise, Bitbucket, Heroku, Amazon Web Services(AWS), Git, Mercurial


|-
|-
| [http://stridercd.com/ Strider]
| [http://stridercd.com/ Strider]
| Node.js
| Node.js
| {{free|[[BSD]]}}
| freeBSD
| {{no}}
| no
| {{no}}
| no
| {{yes|C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala}}
| C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala
| [[E-Mail]]
| E-Mail
| {{no}}
| no
| {{yes|[[GitHub]], [[Bitbucket]], [[Heroku]], [[GitHub Enterprise]], [[Git (software)|Git]]}}
| GitHub, Bitbucket, Heroku, GitHub Enterprise, Git


|-
|-
| [[Travis CI]]
| [http://travis-ci.org/getting_started Travis CI]
| Hosted
| Hosted
| {{free|[[MIT License|MIT]]}}
| MIT
| {{no}}
| no
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven]], [[Gradle]]<ref>{{cite web|url=http://docs.travis-ci.com/user/languages/java/|title=Building a Java project in Travis CI}}</ref>}}
| Apache Ant, Apache Maven, Gradle
| {{yes|C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala}}
| C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala
| [[E-Mail]], [[Campfire]], [[HipChat]], [[IRC]], [[Slack]]
| E-Mail, Campfire, HipChat, IRC, Slack
| {{no}}
| no
| {{yes|[[GitHub]], [[Heroku]]}}
| GitHub, Heroku
 
|}


|-
Snap does have some limitations compared to other CI tools.  Notably, the only output from tests that Snap provides are output to the console or to files. There is no way to see the test results in the Snap GUISome other continuous integration tools provide web pages for viewing specific forms of tests. For instance, in [http://jenkins-ci.org/ Jenkins CI], one can see whether individual JUnit tests pass, or view results from static analysis tools like CheckStyle or PMD, for which Jenkins has specialized plugins.
| [[TeamCity]]
| [[Java Servlet#Servlet containers|Servlet Container]]
| {{proprietary}}
| {{yes|[[MSBuild]], [[NAnt]], [[Visual Studio]], Duplicates finder for .NET}}
| {{yes|[[Apache Ant|Ant]], [[Apache Maven|Maven 2/3]], [[IntelliJ IDEA|IDEA]] .ipr based, [[IntelliJ IDEA|IDEA]] Inspections, [[IntelliJ IDEA|IDEA]] Duplicates finder, [[Gradle]]}}
| {{yes|[[Rake (software)|Rake]], [[FxCop]], Command Line}}
| [[E-mail]], [[Extensible Messaging and Presence Protocol|XMPP]], [[RSS]], IDE, SysTray
| {{yes|[[Eclipse (software)|Eclipse]], [[Visual studio|Visual Studio]], [[IntelliJ IDEA]], [[RubyMine]], [[PyCharm]], [[PhpStorm]], [[WebStorm]]}}
| {{yes|Jetbrains Youtrack, [[JIRA]], [[Bugzilla]], [[FishEye (software)|FishEye]], [[FindBugs]], [[PMD (software)|PMD]], [[dotCover]], [[NCover]]}}


Snap certainly does allow deploying a web page from a command-line command.  So, it is not necessarily a great limitation that it does not have a specialized GUI for tests if one has means of generating web pages with test results.  Some build tools, such as Maven, can produce web pages with test output without much effort (such as by adding a few lines in the XML configuration file).


|}
The website [[#referencesAnchor|[4]]] lets users vote on the best hosted continuous integration services. Although Snap CI does not get the highest votes, the web site still lists many advantages for it, such as:<br/>


=='''Narration'''==
<blockquote>1.Build artifact promotion and propagation<br/>
2.Ability to deploy to multiple environments<br/>
3.Manually triggered promotions from one environment to another<br/>
4.Track pipeline stage history</blockquote>


=='''Conclusion'''==
=='''Conclusion'''==
Snap CI has many advantages as a continuous integration tool. It is easy to use. Developers can get start on Snap in four steps.
It supports several popular programming languages with different versions and different build tools. It integrates closely with GitHub. Different independent pipelines can do tests separately. Developers can choose either automatic tests or manual tests, depending on specific situations. Snap also allows deploying a web page from a command-line command. It offers developers more flexible space to do different kinds of tests.


=='''References'''==
=='''References'''==
<div id="referencesAnchor"></div>
[1] Continuous integration. (Written February 5, 2015). In Wikipedia, The Free Encyclopedia. Retrieved February 9, 2015, from http://en.wikipedia.org/wiki/Continuous_integration
[2] Why Snap-(CI) and Travis-(CI) are not the same thing.  (Written July 22, 2014).  Retrieved February 9, 2015, from http://blog.snap-ci.com/blog/2014/07/22/why-snapci-and-travisci-are-not-the-same-thing/
[3] Comparison of continuous integration software. (Written January 27, 2015). In Wikipedia, The Free Encyclopedia. Retrieved February 9, 2015, from http://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
[4] What are the best hosted continuous integration (CI) services?  (Written January 28, 2015).  Retrieved February 14, 2015, from http://www.slant.co/topics/186/~what-are-the-best-hosted-continuous-integration-ci-services

Latest revision as of 11:45, 15 February 2015

Snap Continuous Integration

Snap Continuous Integration (Snap CI) is a hosted continuous integration and continuous delivery service.

Background on Continuous Integration

Continuous integration (CI) is a software engineering practice that facilitates collaborative software development. It is the practice of continuously evaluating how different developers' work would integrate, such as by running tests and performing builds several times per day. It is often associated with extreme programming (XP), but it can also be used with other approaches to software development.

CI was originally intended to be used in combination with automated unit tests written through the practices of test-driven development. Initially this was conceived of as running all unit tests in the developer's local environment and verifying they all passed before committing to the mainline. This helps avoid one developer's work in progress breaking another developer's copy. [1]

In CI, developers commit their code to a build server, which automatically runs tests either periodically or after every commit, and reports the results to the developers via email or other methods. CI quality control has to be different from the traditional quality control processes of unit, system, and system integration testing.

In addition to running the unit and integration tests, CI servers will run additional static and dynamic tests, measure and profile performance, extract and format documentation from the source code and facilitate manual QA processes. This continuous application of quality control aims to improve the quality of software, and to reduce the time taken to deliver it, by replacing the traditional practice of applying quality control after completing all development. This is very similar to the original idea of integrating more frequently to make integration easier, only applied to QA processes. [1]

Examples

Example 1: Getting started on Snap CI

Snap CI is free to use for open source projects; for pricing for private projects, see here. It is easy to register your software project with Snap if your project is on GitHub. Snap's web site provides simple directions, which in summary are as follows:

Sign in

To sign up with Snap, visit Snap CI and click the "Sign in with Github" link at the top. When you sign in, GitHub will ask if you want to give a set of permissions to Snap to access your repositories, which it requires in order to function. Snap's web site says that "We never, ever commit code to your repository or look at your source code."

Snap CI website

Add your repository

Once you are signed in, Snap will present a list of all the public repositories on GitHub to which you have access. If you are an administrator on any of those repositories, you can build that repository on Snap.

Your repository list


Configure your build

When you select a repository to build on Snap, you can choose languages, databases, artifacts, secure files, dependency managers, and other conventions that may indicate how your build could be set up. If you use an automated build tool for your software, this step may be straightforward, but otherwise it might require some effort.

Configure your build

Build

After completing the steps above, all that is left to do is click "Build now" and let Snap run your build.

Build passed

Example 2: Heroku Deployment with Snap CI

When you want to deploy applications on Heroku, you can easily make Snap test and deploy your applications. This section shows how to do so with a Ruby on Rails project. The steps are as follows:

Snap CI configuration

Heroku currently requires your production database to be PostgreSQL. In Snap, you need to specify that you are using PostgreSQL.
Once you have Snap connected to your GitHub repository, you can click "ADD STAGE" to add a new stage named "DEPLOY".
After that, you can choose a deploy tool, such as "Heroku (basic)".

Snap CI Configuration

Set Heroku credentials

When you click "Heroku Credentials", you can login to Heroku. Then Heroku will ask you whether you want to authorize or not. Click "Allow", if you want to authorize, and you will see your Heroku account shown on the Snap website, just like in the last picture in circle number 4.

Set Heroku credentials

Save and Run

Then click the "Save" button at the upper-right corner of the Snap web page. Snap will automatically run, and you can check whether your application passes.

Passed

Programming Language Support

Snap supports many programming languages and automated build systems for them. For Java, for instance, it supports Java 6, 7, and 8, and, for build tools, Maven and Ant. For Ruby, it supports bundler and rake.

It can automatically detect which build tools are used in the project, for certain build tools. For instance, if a pom.xml file is present in a Java project, Snap CI can automatically configure itself for Maven. (Apparently, the POM must be present in the top-level directory in the Git repository for Snap CI to detect it automatically. If the Java project is in a lower-level directory, it is still possible to configure Snap manually to support Maven.)


GitHub Integration

Snap integrates closely with GitHub. GitHub is of course very popular for both open-source and closed-source software projects in many programming languages. So, Snap focusing its efforts on GitHub makes sense for anyone using GitHub.

Snap by default triggers a build whenever a push is made to the user's GitHub repository, including any Git branch. When a commit is made to a branch, it can also attempt to merge the branch with the master branch, and report the results.

Snap also tracks pull requests. It runs a build to show what the result would be if the pull is merged.

An email is sent to developers whenever a build fails.

Pipelines

Snap allows a series of customized steps whenever it evaluates a build. The steps together are called a "pipeline". They can report different test information (pass or fail, the specific fail position) about your repository. What is more, you can even assign deployment of the software to testing or production environments, and the execution of either automatic or manual tests against these deployed environments.

Many continuous integration tools have the feature of building the software and running tests when a change happens. However, Snap augments this feature with the ideas of "deployment pipelines" and "continuous delivery". Snap can in this manner perform more steps than other tools.

 Continuous Integration - The automated build and test of your software when a change is made by anyone on the team, with all work happening on a shared branch.
 Continuous Delivery - The ability to keep your software easily packaged at any time. Have a rigorous set of automated tests and robust deployment scripts and tools.

Each step in the pipeline is at the core a series of command-line commands on the Snap server. The console output is shown for each step. If a step fails, the pipeline will halt; the later steps will not execute.

Both automatic and manual steps are allowed. One would normally want to run most of the tests automatically with each Git commit, and perhaps deploy the software to a test environment. However, a step can also perform a release of the software, which normally one would only want to run manually, not with each commit. For instance, a step may deploy a web application to Heroku or Amazon Web Services. It may also upload a software release file in its final form to a web site for distribution, such as to SourceForge or the project's GitHub releases page. The final "publish" stage will not be executed unless someone manually triggers it. It means any changes made to the project will not be put into the production version automatically, which reduces the risks.

At the end of a series of stages you can deploy your software to production. However most development teams do not jump to production after all automated tests pass. Instead, they use an environment similar to production for further testing and verification; usually called Staging or UAT (short for user-acceptance-testing). An important aspect here is to control what, where and when things get released.[2]

Support for Multiple Branches

Snap supports having different pipelines for different Git branches. Each branch may thus be tested separately.

When Automatic Branch Tracking and Integration Pipelines is enabled, Snap will not only execute the pipeline on the branch but will also attempt to do a local merge of the branch with the main tree and execute the pipeline against the merged code. ... By the end of the pipelines you not only know that your changes pass through the pipeline but also it also will pass if you perform a merge with the main development tree. You are always aware if your changes are diverging from the main tree and in a position to take corrective action if required. Also, the whole team has visibility into the health of each branch. [2]

Different Branches[2]

Comparison with Other Continuous Integration Tools

There are more than 30 continuous integration tools designed to adapt to different platforms. Here are several tools that can connect to Github and build Ruby projects.

Comparison of Continuous Integration Tools [3]
Name Platform License Windows builders Java builders Other builders Notification IDE Integration Other Integration
CircleCI Hosted proprietary unknown unknown Ruby, Python, Node.js, PHP, Java E-mail, Campfire, HipChat, CCtray unknown Heroku, GitHub
node.ci Hosted proprietary unknown unknown Node.js E-mail unknown Amazon Web Services(AWS), GitHub, Bitbucket
Codeship Hosted proprietary no Maven Go , Java , Node.js, PHP, Python , Ruby E-mail, Flowdock, Grove, HipChat, Web no CloudControl, Engine Yard, GitHub, Heroku
Continua CI Windows proprietary Ant, Nant, FinalBuilder, MSBuild, Rake, Visual Studio, Powershell Ant Execute Program(command line) E-mail, XMPP no GitHub, Bitbucket, Codeplex, Kiln, Team Foundation Server(TFS), FogBugz, Jira, NCover, Opencover, NUnit, DUnitX, jUnit, xUnit, NuGet, 7Zip
Drone.io Hosted Apache 2.0 unknown Ant, Apache Maven|Maven 2, Gradle C, C++, Dart, Go, Node.js, Python, PHP, Ruby, Java, Groovy, Scala, Erlang E-mail unknown Heroku, Dotcloud, GitHub, Bitbucket
Koality Cross Platform, Private Cloud proprietary unknown unknown Command-Line Email, HipChat, GitHub unknown Amazon Web Services, GitHub
Semaphore Hosted proprietary unknown Apache Maven 3 Ruby , Java , Node.js, PHP, Clojure, Rake, Command Line E-mail, Campfire, HipChat, Slack, Flowdock, Webhooks, Remote API unknown GitHub, Bitbucket, Heroku, Code Climate, Cloud 66
Shippable Hosted proprietary MSBuild, NAnt Apache Ant, Apache Maven, Gradle Ruby, Python, Node.js, Java, Scala, C Sharp, PHP, Go E-mail, Campfire no GitHub, Bitbucket Heroku
Snap CI Hosted proprietary no Apache Ant, Apache Maven, Gradle, Android C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala E-Mail, Campfire, HipChat, Webhook no GitHub, Heroku, AWS
Solano CI Private Cloud proprietary no Apache Ant, Apache Maven, Gradle C, C++, Clojure, Go, Java, Javascript, Node.js, PHP, Python, R, Ruby, Scala, Command Line E-Mail, Campfire, HipChat, Flowdock, Slack, Webhook, CCMenu no GitHub, GitHub Enterprise, Bitbucket, Heroku, Amazon Web Services(AWS), Git, Mercurial
Strider Node.js freeBSD no no C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala E-Mail no GitHub, Bitbucket, Heroku, GitHub Enterprise, Git
Travis CI Hosted MIT no Apache Ant, Apache Maven, Gradle C, C++, Clojure, Erlang, Go, Groovy, Haskell, Java, Node.js, Perl, PHP, Python, Ruby, Scala E-Mail, Campfire, HipChat, IRC, Slack no GitHub, Heroku

Snap does have some limitations compared to other CI tools. Notably, the only output from tests that Snap provides are output to the console or to files. There is no way to see the test results in the Snap GUI. Some other continuous integration tools provide web pages for viewing specific forms of tests. For instance, in Jenkins CI, one can see whether individual JUnit tests pass, or view results from static analysis tools like CheckStyle or PMD, for which Jenkins has specialized plugins.

Snap certainly does allow deploying a web page from a command-line command. So, it is not necessarily a great limitation that it does not have a specialized GUI for tests if one has means of generating web pages with test results. Some build tools, such as Maven, can produce web pages with test output without much effort (such as by adding a few lines in the XML configuration file).

The website [4] lets users vote on the best hosted continuous integration services. Although Snap CI does not get the highest votes, the web site still lists many advantages for it, such as:

1.Build artifact promotion and propagation

2.Ability to deploy to multiple environments
3.Manually triggered promotions from one environment to another

4.Track pipeline stage history

Conclusion

Snap CI has many advantages as a continuous integration tool. It is easy to use. Developers can get start on Snap in four steps. It supports several popular programming languages with different versions and different build tools. It integrates closely with GitHub. Different independent pipelines can do tests separately. Developers can choose either automatic tests or manual tests, depending on specific situations. Snap also allows deploying a web page from a command-line command. It offers developers more flexible space to do different kinds of tests.

References

[1] Continuous integration. (Written February 5, 2015). In Wikipedia, The Free Encyclopedia. Retrieved February 9, 2015, from http://en.wikipedia.org/wiki/Continuous_integration

[2] Why Snap-(CI) and Travis-(CI) are not the same thing. (Written July 22, 2014). Retrieved February 9, 2015, from http://blog.snap-ci.com/blog/2014/07/22/why-snapci-and-travisci-are-not-the-same-thing/

[3] Comparison of continuous integration software. (Written January 27, 2015). In Wikipedia, The Free Encyclopedia. Retrieved February 9, 2015, from http://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software

[4] What are the best hosted continuous integration (CI) services? (Written January 28, 2015). Retrieved February 14, 2015, from http://www.slant.co/topics/186/~what-are-the-best-hosted-continuous-integration-ci-services