A major aspect of Codecov is the use of long running asynchronous tasks to process large amounts of test coverage data uploaded by our users. Being a Python stack, Celery felt like a natural fit to manage codecov's long running tasks. We rely on Celery to manage all our background queues and asyncronous scheduling. Celery enables us to set timeouts for different tasks which has been instrumental in maintaining our queue in production. Celery also interfaces easily with Redis as a backend store, which allowed it to slot neatly into our existing infrastructure.
When it comes to continuous Integration services, the choice is hard. There are several solutions available and it looks like the dev scene is very split. We've read and reviewed several solutions and we ended up making the choice between Codeship and Semaphore . Although Semaphore is used by slightly more developers, we've experienced a faster and easy flow using Codeship. Both do integrate Slack and GitHub very well, so this is not a point to set them apart. Both have a complex pricing system that is not that easy to calculate and predict. However, out in the wild, we found Codeship to have a better price point at heavy use.
We used Google Analytics to track user and market growth and Pushwoosh to send out push notifications by hand to promote new content. Even though we didn’t localize our pushes at all, we added custom tags to devices when registering with the service so we could easily target certain markets (e.g. send a push to German users only), which was totally sufficient at the time.
#WebPushNotifications #Analytics #GeneralAnalytics #Communications
For developing our #frontend applications, we decided to use Vue.js . Being such an easy to learn library, compared to React for example, it made everything so easy. At first we started with Polymer but the existing tooling and small community at the time made us look for alternatives.
To simplify development and deployment, we decided to use Docker to build our application images, Docker Compose to orchestrate our production containers, and Traefik to bind everything together.
Docker is a great tool since it allows us to make our backend app platform-agnostic. This allows us to migrate our infrastructure from one platform to another without much effort.
Docker Compose lets us define our services and how they connect to each other easily. The ability to have an outline of our services and have our containers managed automatically greatly benefits us and removes lots of manual effort on our developers' part.
While we initially used Nginx to route our traffic, we were tired of having to manually set up all of our configuration. So we decided to move to Traefik so that our containers are automatically routed and load-balanced, without any additional configuration. If we do need additional configuration, we are able to easily add the configuration in our Docker Compose files, rather than in some weird config file in /etc/