Rust, travis CI and multiple targets

One thing you might want to do at some stage is set up continuous integration.

I was looking for an option that gave me rust support and windows, mac and linux builds. Travis does offer all of that and is free to use for open source projects. I spent too much time setting it up, especially with the uploading part, so here we go:

language: rust
rust:
  - nightly-2019-06-24
cache: cargo
script:
  - cargo build --release
  - git config --local user.name "Johann Woelper"
  - git config --local user.email "woelper@gmail.com"
os:
  - linux
  - osx
  - windows
before_deploy:
  - cd $TRAVIS_BUILD_DIR
  - export TRAVIS_TAG="latest"-$TRAVIS_OS_NAME
deploy:
  provider: releases
  skip_cleanup: true
  file_glob: true
  # draft: true
  overwrite: true
  name: $TRAVIS_OS_NAME
  file:
    - target/release/my_executable
    - target/release/my_executable.exe
  api_key:
    secure: <done with travis setup releases>

First of all, I wanted to pin a specific nightly version because a dependency did not work with the latest nightly - and by default travis installs the latest before building. You can now specify a specific version like nightly-2019-06-24.

Next up, on the os: section all operating systems are added

in the script: section, declare your git credentials

before deploy: will run on each VM that has spun up, so that's where we set the TRAVIS_TAG to the tag we want for our build and change to the build dir.

This will create three releases, one for each OS. If you want to have a single release make sure you have unique executable names for each operating systems - then you could set draft to true so the release does not trigger at each os build step and realease it after all builds are done.

Lastly, travis setup releases is convenient to modify your config file automatically with the correct oauth token.