Continuous integration is naturally facilitated by our DevOps approach. Every time code is checked into the Git source code repository, it is automatically checked out and built by a tool like TravisCI or Jenkins, and the team is notified of any errors. TravisCI/Jenkins proceed to run a full suite of automated tests, reporting any issues to the team. CodeClimate (an open source static analysis tool) automatically performs static code analysis, identifying potential issues and ensuring test coverage.
We build systems to support the automatic deployment of software, which can be performed in a continuous manner by a tool like TravisCI, on demand through Ansible, or via command-line by the DevOps engineer. This is enabled by cloud services to quickly stand up and tear down infrastructure, Vagrant for quickly creating and destroying environments, virtual environments based on Docker, and automated configuration with Chef.
Our team operates all production systems to be highly resilient, supporting continuous replication and failover. We leverage modern monitoring tools like Sensu and Flapjack to track all aspects of the system, roll up failures into useful messages, and provide immediate notifications, as well as New Relic APM to provide real-time metrics of production systems.
At SemanticBits, we utilize a variety of open source frameworks to facilitate a highly automated testing approach that supports the execution of thousands of tests in minutes. These tests are run automatically in the CI environment by tools such as Travis CI or Jenkins upon every code check-in. This allows us to automatically verify code module functionality and the integration of these modules as it forms end-user functionality. We also utilize Cucumber and Selenium to automate testing user-facing functionality.
By leveraging a range of automated monitoring tools—including Nagios, Sensu, and Cloud watch—we are able to check systems are up, disk and CPU usage is within normal limits, all programs are patched for security vulnerabilities, etc. We leverage both central monitoring services, as well as distributed monitoring services depending on the need for scalability and failure resistance. This approach is extremely lightweight, add minimum configuration and maintenance burden, and requires little effort to apply to every system we implement.