[dev] How we got Travis Continuous Integration for multiple language projects in a mono repo

With every commit that makes it to the monorepo both the Android and Desktop project are built and tested. This post documents how we did that.

This post is intended to help developers on other projects where they need wish to start multiple travis jobs for completely different configurations.

Most documented examples on the web on how to use travis are usually focused only on building a single project in a single environment. But what if your repository has multiple projects that need to run under different contexts and programming languages.

At FrostWire we have a big monorepo which is host to multiple projects:

android/ # android client (java8, android-sdk environment gradle build)
desktop/ # desktop client and tests (java11+ gradle build)
common/ # common java sources for android and desktop projects

Travis allows you to define what we understand to be a “Job Matrix”, where each entry in this Matrix specifies an individual job (and they can run in parallel when you push your commit and travis gets word of it)

Here’s our first version of .travis.yml to build the android and desktop projects, and run tests jobs on a single git push:
    # android build job
    - language: android
      dist: xenial
          - build-tools 29.0.2
          - android-29
          - extra-google-google_play_services
          - extra-google-m2repository
          - extra-android-m2repository
        - 'android-sdk-preview-license-52d11cd2'
        - 'android-sdk-license-.+'
        - 'google-gdk-license-.+'
        - yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;29.0.2"
        - cd android
        - pwd
        - ./gradlew assembleDebug
    # desktop build job
    - language: java
        - openjdk11
        - cd desktop
        - gradle build
    # desktop/common tests job
    - language: java
        - openjdk11
        - cd desktop
        - gradle test

FrostWire, Alternative to BitTorrent

As you probably know, According to TrustedReviews and many other news sources BitTorrent has been sold to Justin Sun and his blockchain startup Tron.

“BitTorrent has been sold to the founder of cryptocurrency TRON, who reportedly wants to use the acquisition to “legitimise” the blockchain startup’s reputation.” -TrustedReviews


Due to this, and because no one knows with certainty what will happen with BitTorrent, you will be wondering what is the best alternative. You came to the right place. FrostWire is one of the few fully independent, fully featured open source alternatives. FrostWire is a free, fully featured BitTorrent Client and Cloud downloader with a built-in Music Library designed for Android, Windows, Mac, and Linux.

FrostWire allows you to find & download any file from the distributed peer-to-peer BitTorrent Network – music, movies, apps, ebooks, images. Any file – no matter how big or small!
In addition, FrostWire is also a cloud downloader – fetching results and able to download files from cloud based sources such as Archive.org, SoundCloud.com and YouTube.

You just enter a keyword and search, then pick a file from search results and download the file with one tap. Yes. It is that easy!

So, what are you waiting for? Download FrostWire for free today!

New FrostWire 5.7.7 available for Windows, Mac and Linux. Contributors now earn bitcoins instantaneously.

Download FrostWire 5.7.7 for Windows (Bitcoin enabled .torrent)
Download FrostWire 5.7.7 for MacOSX (.torrent)
Download FrostWire 5.7.7 for Debian/Ubuntu (.torrent)

This update focuses on fixing multiple user interface issues, mostly related to the media player. Libraries were updated, a nasty freeze when opening FrostWire out of a magnet link has finally been fixed, and new linux collaborators have given some love to our codebase.

Screen Shot 2014-10-02 at 9.50.11 AM

Like on Android, you can now fully stop the player
by long pressing the Play/Pause player button.

FrostWire now has a new feature in which it tries to detect wether or not you are using a VPN connection to warn you about the possibility of your privacy being at risk.

We recommend that whenever you are online you connect to the internet using an encrypted VPN connection to protect your identity and your privacy.

Build & Fix FrostWire, get paid in Bitcoins immediatly
If you are a developer/translator/graphic designer, you should know that now you can earn bitcoins when your patches and contributions are merged to the master branches of our open source projects on github.

You will automatically receive Bitcoins in your Bitcoin wallet, you just need to have a github account and a tip4commit account where you can register your Bitcoin wallet address. Payments are sent within minutes of your patches being merged.

FrostWire Bitcoin donations are being diverted into our main open source projects frostwire-desktop, frostwire-android, frostwire-common and frostwire-jlibtorrent.

Each merged commit gets 1% of what’s left on each fund.

Preparing for FrostWire 6

We are hard at work on the next generation of FrostWire 6, if you paid attention to the names of our repositories, or if you follow this blog, you may have read about the frostwire-jlibtorrent project. We have made a full featured Java wrapper API out of the C++ libtorrent library and the results of our tests have been phenomenal. We’re currently replacing all of our Bittorrent core for one that uses libtorrent and we’re pretty sure you will feel the difference.

Join the FrostWire Beta Testers group to help us release a steady FrostWire 6.


frostwire (5.7.7) stable; urgency=high
  * New: VPN connection status indicator.
  * New: Stop media playback by long pressing play/pause button.
  * Fix: Freeze when opening FrostWire from the first time out of
    clicking on a magnet link or .torrent file.
  * Fix: Bug where files couldn't be played with the main player button.
  * Fix: Bug where the speaker icon on the library would still show
    after the media player had stopped.
  * Fix: Bug after 5.7.5 in which the buttons of the Create Torrent
    dialog were not visible unless the window was resized.
  * Fixes issue on Linux when player window pixel translucency could
    not be set. Thanks @foutrelis.
  * Fixes Null Pointer Exception when trying to shutdown and hide
    an MPlayerWindow that may have not been instantiated.
  * Fixes issue where user could not create new playlist by dropping
    songs from existing playlist into 'New Playlist' list item in
    the library.
  * Updated MigLayout source code to version 4.0

 -- FrostWire Team <contact@frostwire.com>  Wed, 01 October 2014 17:00:00 -0500

FrostWire for Desktop’s Lines of Code Count

    8724 text files.
    8237 unique files.                                          
    8917 files ignored.

http://cloc.sourceforge.net v 1.60  T=121.17 s (65.3 files/s, 14184.1 lines/s)
Language                      files          blank        comment           code
Java                           7591         300370         340020        1033777
HTML                            192           2811           2130          21190
C++                              12           1337            510           3207
XML                              17            178            101           1632
C/C++ Header                     20            562           1623           1188
Ant                              19            289            136           1124
Maven                            10             66             20           1073
JSP                              16             64            606            777
Objective C                       7            184            100            675
Objective C++                     1            138             71            583
Javascript                        5             58             25            361
SQL                               1             34              7            288
CSS                               2             63             13            274
Bourne Again Shell                3             45             25            229
XSD                               2             28             57            187
C                                 2             58             14            134
PHP                               1             18              0             73
Bourne Shell                      4             13              1             45
DOS Batch                         7              8              4             41
make                              1              9              0             21
SUM:                           7913         306333         345463        1066879

Help us over a million lines of code at https://github.com/frostwire

FrostWire 5.5.4 changelog

Free FrostWire 5.5.4 Download Now
In Geek speak, here are the full changes for FrostWire 5.5.4, released on Thursday, Feb. 21 2013.

frostwire (5.5.4) stable; urgency=high
  * New Feature: extract audio (.m4a) from (.mp4) videos on right click.
  * New Core Feature: HTTP resumeable large transfer support.
  * Upgrade: Default save folder for cloud downloads is updated without 
  * Upgrade: 'Repeat song' playback mode now available.
  * Upgrade: Enriched promotion display, now with audio and video previews and
    shortcuts to content creator's social media channels/streams.
  * Upgrade: binary compatibility improved for Windows releases.
  * Bug fix: if default save folder is changed it's now part of library scanned
  * Bug fix: smart search engine wasn't notifying when it was done if there
    were no results.
  * Bug fix: several crashes and errors fixed.
  * Bug fix: partial download dialog for cloud downloads would sometimes appear
  * Bug fix: out of memory error by UPnP-cling creating an infinite number
    of threads.
 -- FrostWire Team   Thu, 21 Feb 2013 14:38:57 -0500