Browse Source

Configure Linux & macOS multi-arch releases using Travis CI (#3)

* Test multi arch Travis CI build configuration

* Enable Docker as required for cross compilation

* Use even more arhitecture targets when building

* Disable BSD builds, install ARM cross compiler dependencies

* Fix invalid ARM target tuple

* Use regular cargo commands for x86_64 Linux

* Fix invalid ARM target tuples

* Configure multi-platform releases using Travis CI, move from test builds

* Enable caching for all Linux x86_64 stable builds on Travis CI

* Merge Linux x86_64, macOS and other build arch logic with an if-statement

* Add missing arch architecture release configuration

* Enable cache on all CI jobs, with platform/arch/version cache separation

* Don't explicitly set cache name, it's automatically inferred
Tim Visée 7 years ago
parent
commit
7eb44a9780
1 changed files with 96 additions and 7 deletions
  1. 96 7
      .travis.yml

+ 96 - 7
.travis.yml

@@ -1,6 +1,8 @@
 # Configuration for Travis CI
 # Configuration for Travis CI
 language: rust
 language: rust
-sudo: false
+sudo: required
+services:
+  - docker
 addons:
 addons:
   apt:
   apt:
     packages:
     packages:
@@ -14,40 +16,127 @@ stages:
 
 
 jobs:
 jobs:
   include:
   include:
+    ################################
+    # Build stage                  #
+    ################################
+
+    # Linux with Rust stable/beta/nightly
     - stage: build
     - stage: build
       rust: stable
       rust: stable
+      env: TARGET=x86_64-unknown-linux-gnu
+      cache: cargo
       script: &build-script
       script: &build-script
         - cargo build --verbose --all
         - cargo build --verbose --all
         - cargo build --no-default-features --verbose --all
         - cargo build --no-default-features --verbose --all
         - cargo build --features no-color --verbose --all
         - cargo build --features no-color --verbose --all
-      cache: cargo
     - stage: build
     - stage: build
       rust: beta
       rust: beta
+      env: TARGET=x86_64-unknown-linux-gnu
+      cache: cargo
       script: *build-script
       script: *build-script
     - stage: build
     - stage: build
       rust: nightly
       rust: nightly
+      env: TARGET=x86_64-unknown-linux-gnu
+      cache: cargo
       script: *build-script
       script: *build-script
+
+    # macOS with Rust stable
     - stage: build
     - stage: build
       rust: stable
       rust: stable
       os: osx
       os: osx
+      env: TARGET=x86_64-apple-darwin
+      cache: cargo
       script: *build-script
       script: *build-script
+
+    ################################
+    # Test stage                   #
+    ################################
+
     - stage: test
     - stage: test
+      env: TARGET=x86_64-unknown-linux-gnu
+      cache: cargo
       script: cargo test --verbose --all
       script: cargo test --verbose --all
+
+    ################################
+    # Release stage                #
+    ################################
+
+    # Cargo crate release
+    - stage: release
+      env: TARGET=x86_64-unknown-linux-gnu
       cache: cargo
       cache: cargo
+      script:
+        - echo $CARGO_TOKEN | cargo login
+        - cargo publish --verbose
+
+    # GitHub binary release for Linux on x86/x86_64
     - stage: release
     - stage: release
-      script: skip
-      deploy:
+      rust: stable
+      env: TARGET=x86_64-unknown-linux-gnu
+      cache: cargo
+      script: &script-github-release
+        - |
+          if [ $TARGET == "x86_64-unknown-linux-gnu" ] || [ $TARGET == "x86_64-apple-darwin" ]; then
+            cargo build --release --verbose --all
+          else
+            echo 'Starting build using cross for cross compilation...'
+            cross build --target $TARGET --release --verbose --all
+          fi
+        - cd target/release
+        - tar -czvf $TRAVIS_BUILD_DIR/ffsend-$TARGET.tar.gz ffsend
+        - cd $TRAVIS_BUILD_DIR
+      deploy: &deploy-github-release
         provider: releases
         provider: releases
         api_key: $GITHUB_OAUTH_TOKEN
         api_key: $GITHUB_OAUTH_TOKEN
         skip_cleanup: true
         skip_cleanup: true
+        overwrite: false
+        file: ffsend-$TARGET.tar.gz
         on:
         on:
           tags: true
           tags: true
           branch: master
           branch: master
     - stage: release
     - stage: release
-      script:
-        - echo $CARGO_TOKEN | cargo login
-        - cargo publish --verbose
+      rust: stable
+      env: TARGET=i686-unknown-linux-gnu
+      cache: cargo
+      install: &install-github-release-cross
+        - cargo install cross
+      script: *script-github-release
+      deploy: *deploy-github-release
+
+    # GitHub binary release for Linux on arch
+    - stage: release
+      rust: stable
+      env: TARGET=aarch64-unknown-linux-gnu
+      cache: cargo
+      install: *install-github-release-cross
+      script: *script-github-release
+      deploy: *deploy-github-release
+    - stage: release
+      rust: stable
+      env: TARGET=arm-unknown-linux-gnueabi
+      cache: cargo
+      install: *install-github-release-cross
+      script: *script-github-release
+      deploy: *deploy-github-release
+    - stage: release
+      rust: stable
+      env: TARGET=armv7-unknown-linux-gnueabihf
+      cache: cargo
+      install: *install-github-release-cross
+      script: *script-github-release
+      deploy: *deploy-github-release
+
+    # GitHub binary release for macOX
+    - stage: release
+      rust: stable
+      os: osx
+      env: TARGET=x86_64-apple-darwin
       cache: cargo
       cache: cargo
+      script: *script-github-release
+      deploy: *deploy-github-release
 
 
+# TODO: add (Free)BSD architecture
+# TODO: use regular cargo commands for x86_64 linux
+# TODO: release a build for each architecture
 # TODO: enfore the git tag/crate version equality for releases
 # TODO: enfore the git tag/crate version equality for releases
 # TODO: disable addons/rust installation for GitHub release job
 # TODO: disable addons/rust installation for GitHub release job